English 中文(简体)
应用程序中的服务器错误。该对象未定义无参构造函数。
原标题:
  • 时间:2008-12-01 16:06:47
  •  标签:

调用堆栈显示如下:

[MissingMethodException: No parameterless constructor defined for this object.]
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86
System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230
System.Activator.CreateInstance(Type type, Boolean nonPublic) +67
System.Activator.CreateInstance(Type type) +6
System.Web.Mvc.DefaultModelBinder.CreateModel(ModelBindingContext bindingContext, Type modelType) +277
System.Web.Mvc.<>c__DisplayClass1.<BindModel>b__0() +98
System.Web.Mvc.ModelBindingContext.get_Model() +51
System.Web.Mvc.DefaultModelBinder.BindModelCore(ModelBindingContext bindingContext) +2600
System.Web.Mvc.DefaultModelBinder.BindModel(ModelBindingContext bindingContext) +1067
System.Web.Mvc.DefaultModelBinder.BindProperty(ModelBindingContext parentContext, Type propertyType, Func`1 propertyValueProvider, String propertyName) +208
System.Web.Mvc.DefaultModelBinder.BindModelCore(ModelBindingContext bindingContext) +1787
System.Web.Mvc.DefaultModelBinder.BindModel(ModelBindingContext bindingContext) +1067
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ParameterInfo parameterInfo) +355
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(MethodInfo methodInfo) +439
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +288
System.Web.Mvc.Controller.ExecuteCore() +180
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +96
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +36
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +377
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +71
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +36
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

I have a tiny form with a bunch of hidden fields and one submit button. When I press it, I never even hit the requested method.

How do I go on and debug this? It would be a great start if I knew WHAT object didn t have a parameterless constructor. Where is this object? How can I solve this? I know the question is rather vague, but currently it s all I ve got..

--EDIT--
In my form I added Html.Hidden() inputs. Depending on previous actions, these can have a value of "". The action makes use of ModelBinding. Whenever the value is "" and the datatype is a SelectList, the modelbinder goes berzerk on me.

I feel more and more uncomfortable with how the SelectList is doing it s thing... The idea is good, but there are some issues with it.

最佳回答

我解决了SelectList对象引起的问题,因为它没有提供默认构造函数,所以我们无法在ViewModel中使用它。

问题回答

对于那些谷歌此异常的人,以下是一种更一般的诊断方法:

我找到的唯一简单的诊断此问题的方法是尽可能接近异常时覆盖MVC,使用自己的代码。然后,当出现此异常时,您的代码将在Visual Studio中中断,您可以从堆栈跟踪中读取引起问题的类型。

这似乎是一个可怕的解决问题的方式,但它非常快速和一致。

例如,如果此错误发生在MVC DefaultModelBinder内部(通过检查堆栈跟踪可以知道),则使用以下代码替换DefaultModelBinder:

public class MyDefaultModelBinder : System.Web.Mvc.DefaultModelBinder
{
    protected override object CreateModel(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext, Type modelType)
    {
        return base.CreateModel(controllerContext, bindingContext, modelType);
    }
}

并更新您的 Global.asax.cs 文件:

public class MvcApplication : System.Web.HttpApplication
{
...
    protected void Application_Start(object sender, EventArgs e)
    {
        ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();
    }
}

现在下一次您收到该异常时,Visual Studio将停在您的MyDefaultModelBinder类中,您可以检查“modelType”属性以查看是哪种类型引起了问题。

以上示例仅适用于在模型绑定过程中出现“未为此对象定义无参数构造函数”异常的情况。但类似的代码也可用于MVC中的其他扩展点(例如控制器构建)。

您在操作参数中使用的自定义类必须具有无参构造函数,以便使用默认的模型绑定器。否则,要么创建一个自定义模型绑定器,要么将基本类型传递到操作中而不是自定义类。

我在我的视图模型类上也有返回SelectList实例的属性。我使用了Bind特性来排除这些属性,如下所示:

[Bind(Exclude = "Countries")] public class MyViewModel { ...

public SelectList Countries { get; set; }

}

Hope that helps, Roger

你移除了Default.aspx?那个需要在原位才能正确渲染根目录。如果你尝试使用依赖注入,但容器没有设置正确——即没有ControllerFactory来请求DI容器实例——也可能发生这种情况。

我的问题根源也是SelectList。

我有这个:

<%: Html.DropDownListFor(m => Model.Destinations, Model.Destinations)%>

当我本应该拥有这个的时候:

<%: Html.DropDownListFor(m => Model.Destination, Model.Destinations)%>

目的地是用户的选择,目的地是可能值的列表。两次使用复数选择列表导致了问题。





相关问题
热门标签