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

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: } 

我正在关注Steven Sanderson的“ Pro ASP.NET MVC框架 ”一书。 在第132页,根据作者的build议,我下载了ASP.NET MVC Futures程序集,并将其添加到我的MVC项目中。 [注:这可能是一个红鲱鱼。]

在此之后,我不能再加载我的项目。 上面的错误阻止了我冷。

我的问题不是 ,“你能帮我修理我的代码吗?”

相反,我想更一般地了解:

  • 我应该如何解决这个问题?
  • 我该找什么?
  • 根源可能是什么?

似乎我应该比现在更深入地理解路由和控制器。

我刚刚有一个类似的问题。 当Model没有无参数的构造函数时会发生同样的exception。

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

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


这是一个示例:

 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 { } } 

如果您的Model使用SelectList,也会导致这种情况因为它没有无参数的构造函数

 public class MyViewModel { public SelectList Contacts { get;set; } } 

如果这是原因,您将需要重构您的模型以不同的方式进行。 因此,使用一个IEnumerable<Contact>并编写一个扩展方法来创build具有不同属性定义的下拉列表:

 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方法,只需要将SelectListreplace为IEnumerable,它也可以与MultiSelectList一起使用。

  public class MyViewModel { public Contact SelectedContact { get;set; } public IEnumerable<SelectListItem> Contacts { get;set; } } 

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

看起来像你有控制器/行动组合:

 public ActionResult Action(int parameter) { } 

但你需要

 public ActionResult Action() { } 

另外,请查看Phil Haack的路由debugging器来排除路由故障。

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

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

但是,您可以通过滚动您自己的ControllerFactory来覆盖此function。 这样你可以告诉MVC,当你创build一个MyController给它一个Helper的实例。

这使您可以使用MVC的dependency injection框架,并真正解耦一切。 一个很好的例子就是在StructureMap网站上 。 整个快速启动是好的,他在“自动布线”中将MVC特定到底部。

使用IDependencyResolver时也会发生此错误,例如使用IoC容器时,依赖项parsing程序返回null。 在这种情况下,ASP.NET MVC 3默认使用DefaultControllerActivator来创build对象。 如果创build的对象没有公共的无参数构造函数,那么随时提供的依赖关系parsing器返回null就会引发exception。

这里有一个这样的堆栈跟踪:

 [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框架的许多不同的地方得到这个exception(例如,它不能创build控制器,或者不能创build一个模型来给这个控制器)。

我发现诊断这个问题的唯一简单方法是用自己的代码覆盖MVC尽可能接近的例外。 然后,当发生这种exception时,你的代码将在Visual Studio内部中断,并且你可以从堆栈跟踪中读取导致问题的Type。

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

例如,如果这个错误发生在MVC DefaultModelBinder(你将通过检查堆栈跟踪而知道)中,那么用这个代码replaceDefaultModelBinder:

 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(); } } 

现在,下一次出现exception时,Visual Studio将停止在MyDefaultModelBinder类中,并且可以检查“modelType”属性以查看导致问题的types。

上面的示例只适用于在模型绑定期间获取“无参数的构造函数”。 但是可以为MVC中的其他扩展点编写类似的代码(例如控制器构造)。

关于http://tekpub.com/conferences/mvcconf的第一个video

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

基本上,你可能试图实现dependency injection?

问题在于接口依赖性。

我遇到同样的错误:

使用一个自定义的ModelView,两个动作(GET和POST)都传递了包含两个对象的ModelView:

 public ActionResult Add(int? categoryID) { ... ProductViewModel productViewModel = new ProductViewModel( product, rootCategories ); return View(productViewModel); } 

而且POST也接受相同的模型视图:

 [HttpPost] [ValidateInput(false)] public ActionResult Add(ProductModelView productModelView) {...} 

问题是视图收到ModelView(需要产品和类别信息列表),但提交后只返回产品对象,但作为POST添加期望一个ProductModelView它传递一个NULL,但然后只有ProductModelView构造函数需要两个参数(产品,RootCategories),然后它试图find另一个没有参数的构造函数,这种情况下,然后失败,“没有参数…”

所以,修复POST添加如下更正问题:

 [HttpPost] [ValidateInput(false)] public ActionResult Add(Product product) {...} 

希望这可以帮助一个人(我花了差不多半天的时间来find这个!)。

我得到了同样的错误,在我的情况下,罪魁祸首是既不是公共也不是私人的构造函数。

没有为此对象定义的无参数构造函数。

exception详细信息:System.MissingMethodException:没有为此对象定义的无参数构造函数。

重新编码:确保构造函数在之前已经公开。

 public class Chuchi() { Chuchi() // The problem is this line. Public is missing { // initialization name="Tom Hanks"; } public string name { get; set; } } 

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

 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 { ... } 

…和控制器处理模型:

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

没什么特别的,对吧? 但是,然后我定义的观点…

 <div class="dataItem"> <%=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")%> </div> 

…在POST请求上导致“无参数构造函数”错误。

希望有所帮助。

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

即使所有的参数都提供了,即使缺less一个可为空的types,也会出现这个问题。

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

解决的办法是1)validation名称是否匹配2)为参数3)提供一个默认值,或者提供没有这个参数的另一个动作方法。

我也有这个问题,并认为我会分享,因为我无法find我的问题上面。

这是我的代码

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

调用这个ActionResult:

public ActionResult Overview(int id)

我认为这将是足够聪明的弄清楚,我通过它的价值是id参数的概述,但事实并非如此。 这固定了它:

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

由于没有无参数的公共构造器,我得到了同样的例外

代码是这样的:

 public class HomeController : Controller { private HomeController() { _repo = new Repository(); } 

变成

  public class HomeController : Controller { public HomeController() { _repo = new Repository(); } 

问题解决了我。

我有同样的问题…

如果你使用一个接口来解耦你的连接和DbContext(就像我一样),你可以使用structuremap.mvc (3或4 – nudget包 )来在你的控制器类中使用一个constructure。 这会给你一个DependencyResolution文件夹。 只需用For <InterfaceClass>()更改注释行并使用<DbContextClass>()即可。

虽然这可能是显而易见的,对我来说这个错误的罪魁祸首是我的MVC方法绑定到包含types为Tuple<>的属性的模型。 Tuple<>没有无参数的构造函数。

所有的答案都说创build一个参数较less的构造函数,如果你不想要其他的开发者使用它,只有模型绑定器,这是不理想的。

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

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

例:

  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; } } 

当我进行这个改变时添加了一个无参数的构造函数,这个错误就解决了。 我相信编译器默认会创build一个无参数的构造函数,但如果你自己添加,那么你必须明确地创build它。

  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 ,但是在我的情况下,它并不是(也不打算)用表单提交,因为它在<form></form>标记之外:

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

由于模型包含仅用于显示的字段,因此该字段还没有被提交,这也导致No parameterless constructor defined for this object错误No parameterless constructor defined for this objectNo parameterless constructor defined for this object

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

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

这发生在我身上,而在这个页面上的结果是一个很好的资源,导致我在很多方面,但我想补充另一种可能性:

正如其他答复中所述,使用参数创build构造函数将删除隐式无参数构造函数,因此您必须明确地键入它。

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

给出错误:

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

作品:

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

很可能你可能在你的控制器中有参数化的构造函数,并且你使用的任何依赖parsing器都不能正确地parsing依赖。 你需要把断点放在依赖parsing器方法的地方,你会得到内部exception的确切错误。

我得到这个错误。 我在我的构造函数中使用接口,我的依赖parsing器无法parsing,当我注册它时,错误消失了。

我有同样的问题,但后来发现添加任何新的接口和相应的类需要它在可初始化模块注册dependency injection。 在我的情况下,它是在内部代码如下:

 [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) { } } 

}

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

这是一个例子

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