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

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

在这之后,我不能再加载我的项目。以上的错误停止了我冷。

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

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

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

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

301465 次浏览

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

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

public ActionResult Action(int parameter)
{


}

但你需要

public ActionResult Action()
{


}

还有,查看 Phil Haack 的 路由调试器来排除路线故障。

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

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


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

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

这允许你在 MVC 中使用依赖注入框架,并且真正地解耦所有东西。结构图网站就是一个很好的例子。整个快速启动是好的,他得到了具体的 MVC 向底部的“自动布线”。

Model没有无参数构造函数时,也会发生同样的异常。

调用堆栈正在配置一个负责创建模型新实例的方法。

创建模型(ControllerContext ControlerContext,ModelBindingContext bindingContext,Type model)


下面是一个例子:

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

我也犯了同样的错误:

使用自定义的 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,RootCategory ories) ,然后它试图找到另一个没有参数的构造函数,但是失败了,没有参数..

因此,将 POST Add 修改为下面的形式可以纠正这个问题:

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

希望这能帮到某些人(我花了将近半天的时间才找到答案!)。

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

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

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

问题在于接口依赖性。

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

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

希望能帮上忙。

当使用 IDependencyResolver时(例如使用 IoC 容器时)也会发生此错误,并且依赖解析器返回 null。在这种情况下,ASP.NET MVC 3默认使用 DefaultControllerActivator 来创建对象。如果正在创建的对象没有公共 no-args 构造函数,则在所提供的依赖项解析器返回 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

如果您的模型使用 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 替换为 IEnumable,它也适用于 MultiSelectList。

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

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

这是我的原则

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

称之为行动结果:

public ActionResult Overview(int id)

我认为它应该足够聪明,知道我传递给它的值是 Overview 的 id 参数,但它不是。这就解决了问题:

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

我也遇到过类似的问题,主要的问题是,action 方法中有一些参数不是由 Model Binding 过程提供的(换句话说,这些字段不是由提交页面提交的)。

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

问题还可能是输入错误的结果,其中参数的名称和表单字段的名称不相同。

解决方案是: 1)验证名称是否匹配; 2)为参数提供默认值; 3)或者在没有该参数的情况下提供另一个操作方法。

我也有同样的问题。

如果您使用一个接口来解耦您与 DbContext 的连接(像我一样) ,那么您可以使用 结构图 mvc (3个或4个裸体包)来在控制器类中使用一个结构。这将为您提供一个 DependencyResolution 文件夹。只需使用 For < InterfaceClass > ()和使用 < DbContextClass > ()更改注释行。

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

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

这似乎是一个可怕的方法来处理这个问题,但它非常快,非常一致。

例如,如果这个错误发生在 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 类中,您可以检查“ model Type”属性以查看是什么类型导致了问题。

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

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

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

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

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

Repro 代码: 确保构造函数前面有 public。

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


public string name
{
get;
set;
}
}

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

代码是这样的:

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

改为

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

问题解决了。

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

例如:

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

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

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

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

在本例中,我通过添加一个排除绑定来修复它:

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

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

如其他答复中所述,创建带参数的构造函数将删除隐式的无参数构造函数,因此必须显式键入该构造函数。

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

造成错误:

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

作品:

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

所以我以前也收到过这样的信息,当我打 Ajax 电话的时候。所以它基本上要求的是模型类中被控制器调用的构造函数,它没有任何参数。

这里有一个例子

public class MyClass{


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


}

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

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

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

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

我也遇到过同样的问题,但后来发现添加任何新的接口和相应的类都需要在 InitializeModule 下注册才能使用依赖注入。在我的例子中,它在代码中如下:

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

}

我也有同样的问题。

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

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

如果类是 [Serializable],则需要具有不接受任何参数的构造函数

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

enter image description here

 public User()
{


}

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

  1. 使用 NugetPacketManager (Unity,Njet 或者其他你喜欢的工具)将 Dependency 注入器添加到你的项目中
  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();
}
}
}

我在 DbContext 类上尝试添加迁移时遇到了同样的问题。

首先我得到一个错误: 无法创建类型为“ ContextDb”的对象。有关设计时支持的不同模式,请参见 https://go.microsoft.com/fwlink/?linkid=851728

这让我添加了接口 IDesignTimeDbContextFactory 并实现了它的函数:

public ContextDb CreateDbContext(string[] args)
{
var optionBuilder = new DbContextOptionsBuilder<ContextDb>();
optionBuilder.UseSqlServer("Server_connection");
return new ContextDb(optionBuilder.Options);
}

此时,为类型‘ LibraryContext 定义的 No 无参数构造函数错误。当再次尝试添加迁移时发生 ContextDb’。这是由于在 CreateDbContext ()中创建的 ContextDb 的新实例引起的。 为了解决这个问题,我只是添加了一个空的构造函数:

public ContextDb()
{
}