关于invalidoperationexception:ASP.NET MVC:没有为此对象定义的无参数构造函数

ASP.NET MVC: No parameterless constructor defined for this object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Server Error in '/' Application.
--------------------------------------------------------------------------------

No parameterless constructor defined for this object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

Source Error:


Line 16:             HttpContext.Current.RewritePath(Request.ApplicationPath, false);
Line 17:             IHttpHandler httpHandler = new MvcHttpHandler();
Line 18:             httpHandler.ProcessRequest(HttpContext.Current);
Line 19:             HttpContext.Current.RewritePath(originalPath, false);
Line 20:         }

我在看史蒂文·桑德森的《Pro ASP.NET MVC框架》一书。在第132页,根据作者的建议,我下载了ASP.NET MVC Futures程序集,并将其添加到我的MVC项目中。[注:这可能是一条红鲱鱼。]

之后,我就不能再加载我的项目了。上述错误使我不寒而栗。

我的问题不是,"你能帮我修好密码吗?"

相反,我想更全面地了解:

  • 如何解决此问题?
  • 我该找什么?
  • 根本原因是什么?

看起来我应该比现在更深入地了解路由和控制器。


我也有类似的问题。当Model没有无参数构造函数时,也会发生同样的异常。

调用堆栈正在计算一个方法,该方法负责创建模型的新实例。

System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)

这是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyController : Controller
{
    public ActionResult Action(MyModel model)
    {

    }
}

public class MyModel
{
    public MyModel(IHelper helper) // MVC cannot call that
    {
        // ...
    }

    public MyModel() // MVC can call that
    {
    }
}


如果模型使用的是SelectList,也可能导致这种情况,因为它没有无参数构造函数:

1
2
3
4
public class MyViewModel
{
    public SelectList Contacts { get;set; }
}

如果原因是这样的话,您需要重构您的模型,以用不同的方式来实现它。因此,使用IEnumerable并编写一个扩展方法来创建具有不同属性定义的下拉列表:

1
2
3
4
5
6
7
8
9
10
public class MyViewModel
{
    public Contact SelectedContact { get;set; }
    public IEnumerable<Contact> Contacts { get;set; }
}

public static MvcHtmlString DropDownListForContacts(this HtmlHelper helper, IEnumerable<Contact> contacts, string name, Contact selectedContact)
{
    // Create a List<SelectListItem>, populate it, return DropDownList(..)
}

或者可以使用@mark和@krilovich方法,只需将selectlist替换为ienumerable,它也可以与multisectlist一起使用。

1
2
3
4
5
 public class MyViewModel
    {
        public Contact SelectedContact { get;set; }
        public IEnumerable<SelectListItem> Contacts { get;set; }
    }


您需要与控制器相对应的操作来没有参数。

对于您的控制器/操作组合:

1
2
3
4
public ActionResult Action(int parameter)
{

}

但你需要

1
2
3
4
public ActionResult Action()
{

}

另外,请查看PhilHaack的路由调试程序以排除路由故障。


默认情况下,MVC控制器需要一个没有参数的默认构造函数。最简单的方法是创建一个默认的构造函数,用参数调用它:

1
2
3
4
5
6
public MyController() : this(new Helper()) {
}

public MyController(IHelper helper) {
  this.helper = helper;
}

但是,您可以通过滚动自己的ControllerFactory来覆盖此功能。这样,您就可以告诉MVC,在创建MyController时,给它一个Helper的实例。

这允许您将依赖注入框架与MVC一起使用,并真正地将所有东西解耦。这方面的一个好例子在结构图网站上已经结束。整个快速启动是好的,他得到具体的MVC向底部在"自动布线"。


使用IDependencyResolver时(例如使用IOC容器时),也会发生此错误,并且依赖关系冲突解决程序返回空值。在这种情况下,ASP.NET MVC 3默认使用DefaultControllerActivator创建对象。如果要创建的对象没有public no args构造函数,则只要提供的依赖关系解析程序返回空值,就会引发异常。

下面是一个这样的堆栈跟踪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67

[InvalidOperationException: An error occurred when trying to create a controller of type 'My.Namespace.MyController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +232
   System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +49
   System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8963444
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184


您可以在MVC框架中的许多不同的地方得到这个异常(例如,它不能创建控制器,或者它不能创建一个模型来提供该控制器)。

我发现诊断这个问题的唯一简单方法是用您自己的代码尽可能接近异常重写MVC。然后,当发生此异常时,您的代码将在Visual Studio中中断,您可以从堆栈跟踪中读取导致问题的类型。

这似乎是一个可怕的方法来解决这个问题,但它非常迅速,非常一致。

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

1
2
3
4
5
6
7
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:

1
2
3
4
5
6
7
8
public class MvcApplication : System.Web.HttpApplication
{
...
    protected void Application_Start(object sender, EventArgs e)
    {
        ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();
    }
}

现在,下次您收到异常时,Visual Studio将停止在MyDefaultModelBinder类中,您可以检查"ModelType"属性以查看是什么类型导致了该问题。

上面的示例仅适用于在模型绑定期间获得"没有为此对象定义无参数构造函数"异常的情况。但也可以为MVC中的其他扩展点编写类似的代码(例如控制器构造)。


我也犯了同样的错误,在我的案例中,罪魁祸首是构造函数,它既不是公共的也不是私有的。

No parameterless constructor defined for this object.

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

repro code:确保构造函数前面有public。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Chuchi()
{
     Chuchi()    // The problem is this line. Public is missing
     {
         // initialization
         name="Tom Hanks";
     }

    public string name
    {
        get;
        set;
    }
}


http://tekpub.com/conferences/mvcconf上的第一个视频

中的47:10分钟显示错误并显示如何覆盖默认控制器工厂。即创建结构图控制器工厂。

基本上,您可能正在尝试实现依赖注入??

问题在于,这是接口依赖关系。


我也有同样的错误:

使用自定义模型视图,两个操作(get和post)都传递了包含两个对象的模型视图:

1
2
3
4
5
6
7
8
9
public ActionResult Add(int? categoryID)
{
    ...
    ProductViewModel productViewModel = new ProductViewModel(
            product,
            rootCategories
            );
    return View(productViewModel);
}

同时,本文也接受了同样的模型视图:

1
2
3
4
[HttpPost]
[ValidateInput(false)]
public ActionResult Add(ProductModelView productModelView)
{...}

问题是视图接收到modelview(需要product和类别列表信息),但提交后仅返回product对象,但正如post add所预期的那样,它传递了一个空值,但productmodelview仅构造函数需要两个参数(product、rootcategories),然后它尝试查找另一个常量。对于这种空情况,没有参数的structor将失败,并显示"no parameterles…"

因此,按如下方式修复post-add,纠正问题:

1
2
3
4
[HttpPost]
[ValidateInput(false)]
public ActionResult Add(Product product)
{...}

希望这能对别人有所帮助(我花了近半天的时间才发现这一点!).


我有一个类似的问题,基本上重点是Action方法中有一些参数不是由模型绑定过程提供的(换句话说,这些字段不是由提交页面提交的)。

即使提供了除一个参数以外的所有参数,也会出现此问题,即使缺少的参数是可以为空的类型。

问题也可能是由于输入错误,其中参数的名称和表单字段的名称将不相同。

解决方案是1)验证名称是否匹配2)提供参数的默认值3)或提供不带此参数的其他操作方法。


我也一样。我的问题出现是因为我忘记了我的基础模型类已经具有在视图中定义的名称为的属性。

1
2
3
4
5
6
7
8
public class CTX : DbContext {  // context with domain models
    public DbSet<Products> Products { get; set; }  //"Products" is the source property
    public CTX() : base("Entities") {}
}

public class BaseModel : CTX { ... }
public class ProductModel : BaseModel { ... }
public class OrderIndexModel : OrderModel  { ... }

…控制器处理模型:

1
2
3
[HttpPost]
[ValidateInput(false)]
public ActionResult Index(OrderIndexModel order) { ... }

没什么特别的,对吧?但是我定义了视图…

1
2
3
4
    <%=Html.Label("Products")%>
    <%=Html.Hidden("Products", Model.index)%>   // I FORGOT THAT I ALREADY HAVE PROPERTY CALLED"Products"
    <%=Html.DropDownList("ProductList", Model.products)%>
    <%=Html.ActionLink("Delete","D")%>

…这会在POST请求时导致"无参数构造函数"错误。

希望有帮助。


我也有这个问题,我想和大家分享一下,因为我在上面找不到我的问题。

这是我的密码

return RedirectToAction("Overview", model.Id);

调用此actionResult:

public ActionResult Overview(int id)

我假设它足够聪明,可以计算出我传递给它的值是用于概述的ID参数,但它不是。这修正了:

return RedirectToAction("Overview", new {id = model.Id});


我也有同样的例外,因为没有无参数公共控制器

代码是这样的:

1
2
3
4
5
6
public class HomeController : Controller
{        
    private HomeController()
    {
        _repo = new Repository();
    }

改为

1
2
3
4
5
6
 public class HomeController : Controller
{        
    public HomeController()
    {
        _repo = new Repository();
    }

问题解决了。


我也有同样的问题…

如果使用接口将连接与dbContext(像我一样)分离,则可以使用structuremap.mvc(3或4-nudget包)在控制器类中使用结构。这将为您提供DependencyResolution文件夹。只需使用for()更改注释行,然后使用()。


虽然这对某些人来说可能很明显,但对我来说,这个错误的罪魁祸首是我的MVC方法绑定到了一个包含Tuple<>类型属性的模型。Tuple<>没有无参数构造函数。


我有这个错误。我在构造函数中使用接口,依赖关系解析程序无法解决,当我注册它时,错误就消失了。


所有的答案都说要创建一个无参数的构造函数,如果您不希望任何其他开发人员使用它,而只希望使用模型绑定器,那么这就不理想了。

如果另一个开发人员试图使用这个属性,公共构造函数上面的属性[Obsolete("For model binding only", true)]将抛出一个编译器错误。我花了很长时间才找到这个,希望它能帮助别人。


最可能的情况是,您的控制器中可能有参数化的构造函数,而您使用的任何依赖关系解析器都无法正确地解析依赖关系。您需要将断点放在写依赖关系解析程序方法的地方,这样您将在内部异常中得到确切的错误。


这件事发生在我身上,这一页上的结果是一个很好的资源,引导我向多个方向发展,但我想添加另一种可能性:

如其他回复中所述,创建带有参数的构造函数会删除隐式无参数构造函数,因此必须显式地键入它。

我的问题是,具有默认参数的构造函数也触发了这个异常。

给出错误:

1
public CustomerWrapper(CustomerDto customer = null){...}

作品:

1
2
public CustomerWrapper(CustomerDto customer){...}
public CustomerWrapper():this(null){}


在我的例子中,我的类具有[Serializable]属性。

如果类是[Serializable],则需要有一个不带参数的构造函数。


当我添加了一种新方法来实例化类时,这个错误就开始了。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
    public class myClass
    {
         public string id{ get; set; }
         public List<string> myList{get; set;}

         // error happened after I added this
         public myClass(string id, List<string> lst)
         {
             this.id= id;
             this.myList= lst;
         }
     }

当我进行此更改时添加了一个无参数的构造函数,错误得到了解决。我相信编译器默认情况下会创建一个无参数构造器,但如果添加自己的构造器,则必须显式创建它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class myClass
    {
         public string id{ get; set; }
         public List<string> myList{get; set;}

         // error doesn't happen when I add this
         public myClass() { }

         // error happened after I added this, but no longer happens after adding above
         public myClass(string id, List<string> lst)
         {
             this.id= id;
             this.myList= lst;
         }
     }

我在表格中添加了一个DropDownList,但在我的情况下,它不是(也不是打算)与表格一起提交的,因为它不在

标签之外:

1
@Html.DropDownList("myField", Model.MyField)

由于模型只包含用于显示的字段,这也导致了No parameterless constructor defined for this object错误,因为该字段根本没有提交。

在这种情况下,我通过添加排除绑定来修复它:

1
public ActionResult Foo(int id, int? page, [Bind(Exclude ="MyField")]MyModel model)

我有同样的问题,但后来发现添加任何新的接口和相应的类都要求它在可初始化的模块下注册以进行依赖项注入。在我的例子中,它是在代码中的,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
public class DependencyResolverInitialization : IConfigurableModule
{

    public void ConfigureContainer(ServiceConfigurationContext context)
    {
        context.Container.Configure(ConfigureContainer);
        var structureMapDependencyResolver = new StructureMapDependencyResolver(context.Container);
        DependencyResolver.SetResolver(structureMapDependencyResolver);
        GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), structureMapDependencyResolver);
    }

    private void ConfigureContainer(ConfigurationExpression container)
    {
        container.For<IAppSettingService>().Use<AppSettingService>();
        container.For<ISiteSettingService>().Use<SiteSettingService>();
        container.For<IBreadcrumbBuilder>().Use<BreadcrumbBuilder>();
        container.For<IFilterContentService>().Use<FilterContentService>().Singleton();
        container.For<IDependecyFactoryResolver>().Use<DependecyFactoryResolver>();
        container.For<IUserService>().Use<UserService>();
        container.For<IGalleryVmFactory>().Use<GalleryVmFactory>();
        container.For<ILanguageService>().Use<LanguageService>();
        container.For<ILanguageBranchRepository>().Use<LanguageBranchRepository>();
        container.For<ICacheService>().Use<CacheService>();
        container.For<ISearchService>().Use<SearchService>();
        container.For<IReflectionService>().Use<ReflectionService>();
        container.For<ILocalizationService>().Use<LocalizationService>();
        container.For<IBookingFormService>().Use<BookingFormService>();
        container.For<IGeoService>().Use<GeoService>();
        container.For<ILocationService>().Use<LocationService>();
        RegisterEnterpriseAPIClient(container);
    }

   public void Initialize(InitializationEngine context)
    {
    }

    public void Uninitialize(InitializationEngine context)
    {
    }

    public void Preload(string[] parameters)
    {
    }
}

}


我也有同样的问题。

刚刚从后作用方法参数中删除了EDOCX1[1]在方法体中加入类似于HttpFileCollectionBase files = Request.Files;的元素。


所以我在做Ajax调用时也收到了这个消息。所以它基本上要求的是模型类中的一个构造函数,这个模型类由控制器调用,没有任何参数。

下面是一个例子

1
2
3
4
5
public class MyClass{

     public MyClass(){} // so here would be your parameterless constructor

 }