179
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 Framework ”一书。在第 132 页,按照作者的建议,我下载了 ASP.NET MVC Futures 程序集,并将其添加到我的 MVC 项目中。[注意:这可能是一个红鲱鱼。]

在此之后,我无法再加载我的项目。上面的错误让我感到很冷。

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

相反,我想更广泛地了解:

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

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

4

27 回答 27

233

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

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

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
    {
    }
}
于 2010-09-01T21:46:07.783 回答
92

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

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

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

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,它也适用于MultiSelectList。

 public class MyViewModel
    {
        public Contact SelectedContact { get;set; }
        public IEnumerable<SelectListItem> Contacts { get;set; }
    }
于 2011-10-21T12:39:43.597 回答
23

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

您拥有的控制器/动作组合看起来像:

public ActionResult Action(int parameter)
{

}

但你需要

public ActionResult Action()
{

}

此外,请查看 Phil Haack 的Route Debugger以排除路由故障。

于 2009-08-31T01:49:34.883 回答
21

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

public MyController() : this(new Helper()) {
}

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

但是,您可以通过滚动自己的ControllerFactory. 通过这种方式,您可以告诉 MVC,当您创建 a 时,MyController给它一个Helper.

这允许您将依赖注入框架与 MVC 一起使用,并真正解耦一切。StructureMap 网站就是一个很好的例子。整个快速入门很好,他在“自动布线”的底部专门针对 MVC。

于 2009-08-31T01:54:06.687 回答
21

使用IDependencyResolver时也会发生此错误,例如使用 IoC 容器时,并且依赖解析器返回 null。在这种情况下,ASP.NET MVC 3 默认使用 DefaultControllerActivator 创建对象。如果正在创建的对象没有公共的无参数构造函数,那么只要提供的依赖解析器返回 null,就会抛出异常。

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

[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
于 2011-10-03T21:19:27.477 回答
14

您可以在 MVC 框架中的许多不同位置获取此异常(例如,它无法创建控制器,或者无法创建模型来提供该控制器)。

我发现诊断此问题的唯一简单方法是使用您自己的代码尽可能接近异常覆盖 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 中的其他扩展点(例如控制器构造)编写类似的代码。

于 2013-03-08T14:31:34.613 回答
8

我得到了同样的错误,在我的例子中,罪魁祸首是既不是 public 也不是 private的构造函数。

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

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

复制代码:确保构造函数之前有 public。

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

    public string name
    {
        get;
        set;
    }
}
于 2013-08-14T18:40:40.790 回答
7

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

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

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

问题在于接口依赖性。

于 2011-02-07T11:13:51.897 回答
6

我在以下情况下遇到了同样的错误:

使用自定义 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)
{...}

问题是 View 收到了 ModelView (需要产品和类别信息列表),但提交后只返回 Product 对象,但是由于 POST Add 预期 ProductModelView 它传递了一个 NULL 但是 ProductModelView 唯一的构造函数需要两个参数( Product, RootCategories),然后它试图为这个 NULL 情况找到另一个没有参数的构造函数,然后失败并显示“没有参数......”

因此,修复 POST Add 如下解决问题:

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

希望这可以帮助某人(我花了将近半天的时间才找到这个!)。

于 2010-10-13T14:15:01.257 回答
5

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

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 请求出现“无参数构造函数”错误。

希望有帮助。

于 2011-08-31T10:20:25.977 回答
5

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

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

问题也可能是拼写错误的结果,其中参数的名称和表单字段的名称将不相同。

解决方案是 1) 验证名称是否匹配 2) 为参数提供默认值 3) 或提供另一个没有此参数的操作方法。

于 2012-08-13T18:24:39.333 回答
4

我也有这个问题,我想我会分享,因为我在上面找不到我的问题。

这是我的代码

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

调用此 ActionResult:

public ActionResult Overview(int id)

我认为它足够聪明,可以弄清楚我传递给它的值是 Overview 的 id 参数,但事实并非如此。这修复了它:

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

于 2011-11-08T08:40:33.363 回答
4

由于没有无参数的公共构造函数,我得到了同样的异常

代码是这样的:

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

变成

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

问题解决了我。

于 2014-01-15T20:33:59.890 回答
4

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

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

于 2016-07-13T01:06:13.020 回答
3

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

于 2016-08-29T13:15:19.607 回答
2

我有同样的问题...

如果您使用接口将您的连接与 DbContext 解耦(像我一样),您可以使用structuremap.mvc (3 或 4 - nudget 包)能够在控制器类中使用构造。这将为您提供一个 DependencyResolution 文件夹。只需将注释行更改为 For< InterfaceClass >() 和 Use< DbContextClass >()。

于 2013-01-03T10:30:12.503 回答
2

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

于 2013-05-08T19:10:50.443 回答
2

由于缺少依赖注入器/解析器容器和/或缺少绑定,可能会出现此类型错误

  1. 使用 NugetPacketManager(Unity、Ninject 或任何你喜欢的)将依赖注入器添加到你的项目中
  2. 为类添加接口绑定和具体实现

UnityMConfig.cs

using System;
using Unity;
using <your_namespace for the interfaces and concrete classes>

namespace <your_namespace>
{
    public static class UnityConfig
    {
        private static Lazy<IUnityContainer> container =
            new Lazy<IUnityContainer>(() =>
            {
                var container = new UnityContainer();
                RegisterTypes(container);
                return container;
            });

        public static IUnityContainer Container => container.Value;

        public static void RegisterTypes(IUnityContainer container)
        {
            container.RegisterType <IInterfaceClassName, ConcreteImplementationOfInterface> ();
        }
    }
}

UnityMvcActivator.cs

using System.Linq;
using System.Web.Mvc;
using Unity.AspNet.Mvc;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(xxxx.UnityMvcActivator), nameof(xxxx.UnityMvcActivator.Start))]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(xxxx.UnityMvcActivator), nameof(xxxx.UnityMvcActivator.Shutdown))]

namespace <your_namespace>
{
    public static class UnityMvcActivator
    {
        public static void Start()
        {
            FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
            FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(UnityConfig.Container));
            DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfig.Container));
        }
        public static void Shutdown()
        {
            UnityConfig.Container.Dispose();
        }
    }
}
于 2021-07-26T04:23:33.187 回答
1

我有同样的问题,但后来发现添加任何新接口和相应的类都需要在 Initializable Module 下注册以进行依赖注入。在我的情况下,它的内部代码如下:

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

}

于 2017-07-17T11:38:02.400 回答
1

就我而言,我的班级具有该[Serializable]属性。

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

于 2018-11-01T16:48:48.420 回答
1

我在 DOMAIN 文件夹内的模型中添加了一个无参数的构造函数,问题就解决了。

在此处输入图像描述

 public User()
        {

        }
于 2020-06-30T07:57:31.043 回答
0

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

例子:

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

当我进行此更改时添加了一个无参数构造函数,该错误已解决。我相信编译器默认会创建一个无参数的构造函数,但是如果你添加自己的构造函数,那么你必须显式地创建它。

    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;
         }
     }
于 2014-06-12T20:34:19.033 回答
0

DropDownList在我的表单中添加了一个,但是在我的情况下,它没有(也不打算)与表单一起提交,因为它在<form></form>标签之外:

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

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

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

public ActionResult Foo(int id, int? page, [Bind(Exclude = "MyField")]MyModel model)
于 2014-07-29T11:19:54.217 回答
0

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

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

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

给出错误:

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

作品:

public CustomerWrapper(CustomerDto customer){...}
public CustomerWrapper():this(null){}
于 2015-07-22T14:52:56.313 回答
0

很可能您的控制器中可能有参数化构造函数,并且您使用的任何依赖解析器都无法正确解析依赖。您需要在编写依赖解析器方法的地方放置断点,您将在内部异常中得到确切的错误。

于 2015-12-12T16:42:33.483 回答
0

我有同样的问题。

刚刚从 Post Action 方法参数中删除HttpFileCollectionBase files并像HttpFileCollectionBase files = Request.Files;在方法体中一样添加。

于 2018-04-13T06:38:29.227 回答
-3

因此,在进行 ajax 调用时,我也收到了该消息。所以它基本上要求的是由控制器调用的模型类中的构造函数,没有任何参数。

这是一个例子

public class MyClass{

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

 }
于 2015-08-04T21:02:43.247 回答