GVKun编程网logo

如果您打算在“Collection”对象上调用“StringField”方法,则会失败,因为不存在此类方法

16

本文将带您了解关于如果您打算在“Collection”对象上调用“StringField”方法,则会失败,因为不存在此类方法的新内容,另外,我们还将为您提供关于.net–无法在控制器’Controll

本文将带您了解关于如果您打算在“Collection”对象上调用“StringField”方法,则会失败,因为不存在此类方法的新内容,另外,我们还将为您提供关于.net – 无法在控制器’Controller’上调用操作方法’System.Web.Mvc.PartialViewResult Foo [T](T)’因为action方法是泛型方法、AbstractCollection 方法的toString()方法解析、android – LocationClient未在“onConnected”方法中连接、android – 在webview.goBack()上调用“shouldOverrideUrlLoading”方法的实用信息。

本文目录一览:

如果您打算在“Collection”对象上调用“StringField”方法,则会失败,因为不存在此类方法

如果您打算在“Collection”对象上调用“StringField”方法,则会失败,因为不存在此类方法

如何解决如果您打算在“Collection”对象上调用“StringField”方法,则会失败,因为不存在此类方法?

我在这里定义了这个类模型

client =  pymongo.MongoClient(''localhost'',27017)

db = client["test"]
col = db["products"]  

class Product(col.Document):
    name = col.StringField()
    category= col.StringField()

但是当我尝试运行脚本时,它不断抛出错误如果您打算在“Collection”对象上调用“StringField”方法,它会失败,因为不存在这样的方法。 我缺少什么

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

.net – 无法在控制器’Controller’上调用操作方法’System.Web.Mvc.PartialViewResult Foo [T](T)’因为action方法是泛型方法

.net – 无法在控制器’Controller’上调用操作方法’System.Web.Mvc.PartialViewResult Foo [T](T)’因为action方法是泛型方法

无法在控制器’Controller’上调用操作方法’System.Web.Mvc.PartialViewResult FooT’,因为action方法是泛型方法
<% Html.RenderAction("Foo",model = Model}); %>

ASP MVC 2有这种限制的解决方法吗?我真的更喜欢使用泛型.我提出的解决方法是将模型类型更改为对象.它有效,但不是首选:

public PartialViewResult Foo<T>(T model) where T : class
    {
      // do stuff
    }

解决方法

抛出的代码在默认的ActionDescriptor中:
internal static string VerifyActionMethodisCallable(MethodInfo methodInfo) {
        // we can't call instance methods where the 'this' parameter is a type other than ControllerBase
        if (!methodInfo.Isstatic && !typeof(ControllerBase).IsAssignableFrom(methodInfo.ReflectedType)) {
            return String.Format(CultureInfo.CurrentUICulture,MvcResources.ReflectedActionDescriptor_CannotCallInstanceMethodonNonControllerType,methodInfo,methodInfo.ReflectedType.FullName);
        }

        // we can't call methods with open generic type parameters
        if (methodInfo.ContainsGenericParameters) {
            return String.Format(CultureInfo.CurrentUICulture,MvcResources.ReflectedActionDescriptor_CannotCallOpenGenericmethods,methodInfo.ReflectedType.FullName);
        }

        // we can't call methods with ref/out parameters
        ParameterInfo[] parameterInfos = methodInfo.GetParameters();
        foreach (ParameterInfo parameterInfo in parameterInfos) {
            if (parameterInfo.IsOut || parameterInfo.ParameterType.IsByRef) {
                return String.Format(CultureInfo.CurrentUICulture,MvcResources.ReflectedActionDescriptor_CannotCallMethodsWithOutOrRefParameters,methodInfo.ReflectedType.FullName,parameterInfo);
            }
        }

        // we can call this method
        return null;
    }

因为代码调用“methodInfo.ContainsGenericParameters”,所以我认为没有办法在不创建自己的ActionDescriptor的情况下覆盖此行为.从浏览源代码看,这似乎并非无足轻重.

另一个选择是使您的控制器类通用并创建一个自定义通用控制器工厂.我有一些实验代码可以创建一个通用控制器.它的hacky但它​​只是一个个人实验.

public class GenericControllerFactory : DefaultControllerFactory
{
    protected override Type GetControllerType(System.Web.Routing.RequestContext requestContext,string controllerName)
    {
        //the generic type parameter doesn't matter here
        if (controllerName.EndsWith("Co"))//assuming we don't have any other generic controllers here
            return typeof(GenericController<>);

        return base.GetControllerType(requestContext,controllerName);

        throw new InvalidOperationException("Generic Factory wasn't able to resolve the controller type");
    }

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext,Type controllerType)
    {
        //are we asking for the generic controller?
        if (requestContext.RouteData.Values.ContainsKey("modelType"))
        {
            string typeName = requestContext.RouteData.Values["modelType"].ToString();
            //magic time
            return GetGenericControllerInstance(typeName,requestContext);
        }

        if (!typeof(IController).IsAssignableFrom(controllerType))
            throw new ArgumentException(string.Format("Type requested is not a controller: {0}",controllerType.Name),"controllerType");

        return base.GetControllerInstance(requestContext,controllerType);
    } 

    /// <summary>
    /// Returns the a generic IController tied to the typeName requested.  
    /// Since we only have a single generic controller the type is hardcoded for Now
    /// </summary>
    /// <param name="typeName"></param>
    /// <returns></returns>
    private IController GetGenericControllerInstance(string typeName,RequestContext requestContext)
    {
        var actionName = requestContext.RouteData.Values["action"];

        //try and resolve a custom view model

        Type actionModelType = Type.GetType("Brainnom.Web.Models." + typeName + actionName + "viewmodel,Brainnom.Web",false,true) ?? 
            Type.GetType("Brainnom.Web.Models." + typeName + ",true);

        Type controllerType = typeof(GenericController<>).MakeGenericType(actionModelType);

        var controllerBase = Activator.CreateInstance(controllerType,new object[0] {}) as IController;

        return controllerBase;
    }
}

AbstractCollection 方法的toString()方法解析

AbstractCollection 方法的toString()方法解析

AbstractCollection 抽象类,是Java util下的Collection的骨干类,提供了很多方法。很多方法,都被具体的实现类重写了,但是toString方法好像保留了,这个方法的源码如下:

 public String toString() {
        Iterator<E> i = iterator();
    if (! i.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append(''['');
    for (;;) {
        E e = i.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! i.hasNext())
        return sb.append('']'').toString();
        sb.append(", ");
    }
    }

里面有一句 

sb.append(e == this ? "(this Collection)" : e);

这句为啥要加这个判断呢,看下如下代码

ArrayList a = new ArrayList();
a.add("1");
a.add("2");
a.add(a);//加本身
System.out.println(a.toString());

   a.add(a),这句本身没有语法错误的,虽然一般人不会这么加,但是真这样加了,上面那句判断不加,当前e是this的话,被append调用,又会调用自身的toString(),无线循环了,就会 overstackflow 了。jdk源码严谨值得学习啊。


android – LocationClient未在“onConnected”方法中连接

android – LocationClient未在“onConnected”方法中连接

有人已经有这个问题:
– 我正在初始化一个LocationClient,使用ConnectionCallbacks等等……
– 然后,我在上面调用“connect()”.
– 在我的“onConnected”方法中,我调用myLocationClient.getLastLocation(),这会使应用程序在某些人设备上崩溃,但有异常:

“Fatal Exception: java.lang.IllegalStateException Not connected. Call
connect() and wait for onConnected() to be called.”

任何的想法?

这是代码的一部分:

myLocationClient = new LocationClient(this,new ConnectionCallbacks() {
        @Override
        public void ondisconnected() {
        //Do some stuff here
        }

        @Override
        public void onConnected(Bundle arg0) {
            if(myLocationClient.getLastLocation() != null) {
                //Do some other stuff here
            }
        }
    },new OnConnectionFailedListener() {
        @Override
        public void onConnectionFailed(ConnectionResult arg0) {
        //Do other stuff here
        }
});

myLocationClient.connect();

应用程序在“onConnected”方法的第一行崩溃.

对于想要这里的堆栈的人来说:

java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.
at com.google.android.gms.internal.k.B()
at com.google.android.gms.internal.bh.a()
at com.google.android.gms.internal.bh$c.B()
at com.google.android.gms.internal.bg.getLastLocation()
at com.google.android.gms.internal.bh.getLastLocation()
at com.google.android.gms.location.LocationClient.getLastLocation()
at com.myAppPackage.onConnected(AroundMeActivity.java:321)
at com.google.android.gms.internal.k.y()
at com.google.android.gms.internal.k$f.a()
at com.google.android.gms.internal.k$f.a()
at com.google.android.gms.internal.k$b.D()
at com.google.android.gms.internal.k$a.handleMessage()
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
at dalvik.system.NativeStart.main(NativeStart.java)

解决方法

locationClient.getLastLocation()从客户端获取最后的已知位置.但是,如果至少有一个客户端连接到它,则融合位置提供程序将仅保留后台位置.一旦第一个客户端连接,它将立即尝试获取位置.如果您的活动是第一个客户端连接,并调用getLastLocation()在onConnected(马上),可能没有足够的时间在第一位置进来,这将导致位置被空.

要解决此问题,您必须等待(不确定),直到提供程序获取位置,然后调用getLastLocation(),这是不可能知道的.
另一个(更好)的选择是实现com.google.android.gms.location.LocationListener接口接收周期性位置更新(并关闭它一旦你的第一次更新).

public class MyActivity extends Activity implements ConnectionCallbacks,OnConnectionFailedListener,LocationListener {
// . . . . . . . . more stuff here 
LocationRequest locationRequest;
LocationClient locationClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // . . . . other initialization code
    locationClient = new LocationClient(this,this,this);
    locationRequest = new LocationRequest();
    // Use high accuracy
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    // Set the update interval to 5 seconds
    locationRequest.setInterval(UPDATE_INTERVAL);
    // Set the fastest update interval to 1 second
    locationRequest.setFastestInterval(FASTEST_INTERVAL);
}
// . . . . . . . . other methods 
@Override
public void onConnected(Bundle bundle) {
    Location location = locationClient.getLastLocation();
    if (location == null)
        locationClient.requestLocationUpdates(locationRequest,this);
    else
        Toast.makeText(getActivity(),"Location: " + location.getLatitude() + "," + location.getLongitude(),Toast.LENGTH_SHORT).show();
}
// . . . . . . . . other methods
@Override
public void onLocationChanged(Location location) {
    locationClient.removeLocationUpdates(this);
    // Use the location here!!!
}

在此代码中,您将检查客户端是否已具有最后一个位置(在onConnected中).如果没有,您就会请求更新位置,并在获得更新后立即关闭请求(在onLocationChanged()回调中).

更新:

很多时候,用户将禁用位置服务(以节省电池或隐私原因).在这种情况下,上面的代码仍然会请求位置更新,但onLocationChanged永远不会被调用.您可以通过检查用户是否已禁用位置服务来停止请求.

如果您的应用要求他们启用位置服务,您可能希望显示消息或祝酒.很遗憾,无法检查用户是否在Google的位置服务API中禁用了位置服务.为此,您将不得不使用Android的API.

在你的onCreate方法中:

LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
    locationEnabled = false;
    Toast.makeText(getActivity(),"Enable location services for accurate data",Toast.LENGTH_SHORT).show();
}
else locationEnabled = true;

并在你的onConnected方法中使用locationEnabled标志,如下所示:

if (location != null) {
Toast.makeText(getActivity(),Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
    locationClient.requestLocationUpdates(locationRequest,this);
}

特别感谢Rahul Jiresal.

android – 在webview.goBack()上调用“shouldOverrideUrlLoading”方法

android – 在webview.goBack()上调用“shouldOverrideUrlLoading”方法

我正在webview上的shouldOverrideUrlLoading方法中加载我的所有页面(主要是跟踪当前页面的URL并进行一些修改).

我的问题是后退按钮(例如:webview.goback()方法)绕过了上面的功能.

有什么方法可以显式调用goback()和shouldOverrideUrlLoading()方法.

public boolean shouldOverrideUrlLoading(WebView view,String url){
//get current url and do some modifications to html}

public boolean onKeyDown(int keyCode,KeyEvent event) {
     if ((keyCode == KeyEvent.KEYCODE_BACK) && web1.canGoBack()) {
         webview.goBack();  
         return true;
      }
      return super.onKeyDown(keyCode,event);
}

解决方法

查看代码似乎一旦根据特定URL Action的某些逻辑调用了shouldOverrideUrlLoading方法,您需要使用Webview返回方法.我建议你在活动中使用以下方法:

@Override
public void onBackpressed() {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && web1.canGoBack()) {
        webview.goBack();
    } else {
        super.onBackpressed();
    }
}

这与onKeypressed完全相同. (使用onBackpressed而不是onKeypressed但是在Activity类中编写此代码但不在自定义WebViewClient中.

调用shouldOverrideUrlLoading中的onBackpressed().试试这个,应该工作.

今天的关于如果您打算在“Collection”对象上调用“StringField”方法,则会失败,因为不存在此类方法的分享已经结束,谢谢您的关注,如果想了解更多关于.net – 无法在控制器’Controller’上调用操作方法’System.Web.Mvc.PartialViewResult Foo [T](T)’因为action方法是泛型方法、AbstractCollection 方法的toString()方法解析、android – LocationClient未在“onConnected”方法中连接、android – 在webview.goBack()上调用“shouldOverrideUrlLoading”方法的相关知识,请在本站进行查询。

本文标签: