ASP.NET MVC: Nenhum construtor sem parâmetros definido para este object

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

Eu estava seguindo o livro ” Pro ASP.NET MVC Framework ” de Steven Sanderson. Na página 132, de acordo com a recomendação do autor, baixei o assembly ASP.NET MVC Futures e o adicionei ao meu projeto MVC. [Nota: isto pode ser um arenque vermelho]

Depois disso, não consegui mais carregar meu projeto. O erro acima me parou frio.

Minha pergunta não é: “Você poderia me ajudar a corrigir meu código?”

Em vez disso, gostaria de saber de maneira mais geral:

  • Como devo resolver esse problema?
  • O que devo procurar?
  • Qual pode ser a causa raiz?

Parece que eu deveria entender roteamento e controladores em um nível mais profundo do que eu faço agora.

Eu só tive um problema semelhante. A mesma exceção ocorre quando um Model não possui um construtor sem parâmetros.

A pilha de chamadas estava calculando um método responsável por criar uma nova instância de um modelo.

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


Aqui está uma amostra:

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

Isso também pode ser causado se o seu Model estiver usando um SelectList, já que ele não possui um construtor sem parâmetros :

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

Você precisará refatorar seu modelo para fazer isso de uma maneira diferente se essa for a causa. Então, usando um IEnumerable e escrevendo um método de extensão que cria a lista suspensa com as diferentes definições de propriedade:

 public class MyViewModel { public Contact SelectedContact { get;set; } public IEnumerable Contacts { get;set; } } public static MvcHtmlString DropDownListForContacts(this HtmlHelper helper, IEnumerable contacts, string name, Contact selectedContact) { // Create a List, populate it, return DropDownList(..) } 

Ou você pode usar a abordagem @Mark e @krilovich, basta replace SelectList por IEnumerable, e também funciona com MultiSelectList.

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

Você precisa da ação que corresponde ao controlador para não ter um parâmetro.

Parece que a combinação controlador / ação que você tem:

 public ActionResult Action(int parameter) { } 

mas você precisa

 public ActionResult Action() { } 

Além disso, confira o debugger de rota de Phil Haack para solucionar problemas de rotas.

Por padrão, os Controladores MVC exigem um construtor padrão sem parâmetros. O mais simples seria fazer um construtor padrão que chama aquele com parâmetros:

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

No entanto, você pode replace essa funcionalidade rolando sua própria ControllerFactory . Desta forma você pode dizer ao MVC que quando você está criando um MyController dê a ele uma instância do Helper .

Isso permite usar estruturas de injeção de dependência com MVC e realmente desacoplar tudo. Um bom exemplo disso está no site StructureMap . Todo o início rápido é bom, e ele é específico para o MVC na parte inferior da “Auto Wiring”.

Esse erro também ocorre ao usar um IDependencyResolver , como ao usar um contêiner IoC e o resolvedor de dependência retorna nulo. Neste caso, a ASP.NET MVC 3 usa como padrão o DefaultControllerActivator para criar o object. Se o object que está sendo criado não tiver um construtor público no-args, uma exceção será lançada a qualquer momento em que o resolvedor de dependência fornecido tenha retornado nulo.

Aqui está um desses rastreio de pilha:

 [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.b__2() +49 System.Web.Mvc.<>c__DisplayClassb`1.b__a() +13 System.Web.Mvc.SecurityUtil.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 

Você pode obter essa exceção em muitos lugares diferentes na estrutura do MVC (por exemplo, ela não pode criar o controlador ou não pode criar um modelo para fornecer esse controlador).

A única maneira fácil que encontrei para diagnosticar esse problema é replace o MVC o mais próximo possível da exceção com seu próprio código. Em seguida, seu código irá quebrar dentro do Visual Studio quando essa exceção ocorre e você pode ler o tipo causando o problema do rastreamento de pilha.

Essa parece ser uma maneira horrível de abordar esse problema, mas é muito rápido e muito consistente.

Por exemplo, se esse erro estiver ocorrendo dentro do MVC DefaultModelBinder (que você saberá verificando o rastreamento de pilha), substitua o DefaultModelBinder por este código:

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

E atualize seu arquivo Global.asax.cs:

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

Agora, na próxima vez que você obtiver essa exceção, o Visual Studio irá parar dentro da sua class MyDefaultModelBinder, e você poderá verificar a propriedade “modelType” para ver qual tipo causou o problema.

O exemplo acima funciona quando você obtém a exceção “Nenhum construtor sem parâmetros definido para este object” durante a vinculação do modelo, apenas. Mas código semelhante pode ser escrito para outros pontos de extensão no MVC (por exemplo, construção do controlador).

Eu tenho o mesmo erro, o culpado no meu caso foi o construtor que não era nem público nem privado .

Nenhum construtor sem parâmetros definido para este object.

Detalhes da exceção: System.MissingMethodException: nenhum construtor sem parâmetros definido para este object.

Código Repro: Certifique-se de que o construtor tenha público antes dele.

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

Primeiro vídeo em http://tekpub.com/conferences/mvcconf

47:10 minutos em mostrar o erro e mostra como replace o ControllerFactory padrão. Ou seja, para criar fábrica de controlador de mapa de estrutura.

Basicamente, você provavelmente está tentando implementar a injeção de dependência ??

O problema é que é a dependência da interface.

Eu recebi o mesmo erro quando:

Usando um ModelView personalizado, ambas as ações (GET e POST) estavam passando o ModelView que continha dois objects:

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

E o POST também aceitando a mesma visão de modelo:

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

Problema foi o View recebeu o ModelView (precisava tanto de produto e lista de informações de categorias), mas depois de submetido estava retornando apenas o object Product, mas como o POST Add esperava um ProductModelView passava um NULL mas depois o construtor ProductModelView só precisava de dois parâmetros ( Product, RootCategories), em seguida, ele tentou encontrar outro construtor sem parâmetros para este caso NULL, em seguida, falha com “nenhum parâmetro …”

Então, corrigindo o POST, adicione o seguinte, corrija o problema:

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

Espero que isso possa ajudar alguém (passei quase meio dia para descobrir isso!).

O mesmo para mim. Meu problema apareceu porque eu esqueci que minha class de modelo base já tem uma propriedade com o nome que foi definido na visão .

 public class CTX : DbContext { // context with domain models public DbSet Products { get; set; } // "Products" is the source property public CTX() : base("Entities") {} } public class BaseModel : CTX { ... } public class ProductModel : BaseModel { ... } public class OrderIndexModel : OrderModel { ... } 

… e modelo de processamento do controlador:

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

Nada de especial, certo? Mas então eu defino a visão …

 
< %=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")%>

… que causa o erro “Construtor sem parâmetros” na solicitação POST.

Espero que ajude.

Eu tive um problema semelhante, e basicamente o ponto é que existem alguns argumentos no método de ação que não foram fornecidos pelo processo de Model Binding (e em outras palavras, esses campos não foram enviados pela página de envio).

Esse problema surgirá mesmo que todos os argumentos, exceto um, sejam fornecidos e, mesmo que o ausente esteja em um tipo anulável.

O problema também pode ser resultado de um erro de digitação, no qual o nome do argumento e o nome do campo de formulário não serão idênticos.

A solução é 1) verificar se os nomes correspondem 2) fornecer um valor padrão para o argumento 3) ou fornecer outro método de ação sem este argumento.

Eu tive esse problema também e pensei em compartilhar, já que não consigo encontrar meu problema acima.

Este foi meu código

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

Chamando este ActionResult:

public ActionResult Overview(int id)

Eu achei que seria inteligente o suficiente para descobrir que o valor que eu passei é o parâmetro id para Visão Geral, mas não é. Isso resolveu:

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

Eu recebi a mesma exceção porque não havia um contrutor público sem parâmetros

Código foi assim:

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

mudou para

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

problema resolvido para mim.

Eu tive o mesmo problema…

Se você estiver usando uma interface para desacoplar sua conexão com seu DbContext (como eu), você pode usar o structuremap.mvc (pacote 3 ou 4 – nudget ) para poder usar um constructure na sua class de controlador. Isso lhe dará uma pasta DependencyResolution. Apenas altere a linha comentada com seu For () e para Use ().

Embora isso possa ser óbvio para alguns, o culpado desse erro para mim foi que meu método MVC foi vinculado a um modelo que continha uma propriedade do tipo Tuple<> . Tuple<> não possui um construtor sem parâmetros.

Todas as respostas dizem para criar um parâmetro menos construtor, o que não é ideal se você não quiser nenhum outro desenvolvedor usando apenas o fichário do modelo.

O atributo [Obsolete("For model binding only", true)] acima de um construtor público lançará um erro do compilador se outro dev tentar usá-lo. Demorou séculos para encontrar isso, espero que ajude alguém.

Eu tenho esse erro. Eu estava usando interfaces no meu construtor e meu resolvedor de dependencies não foi capaz de resolver, quando eu registrei, então o erro foi embora.

Este erro começou para mim quando adicionei uma nova maneira de instanciar uma class.

Exemplo:

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

O erro foi resolvido quando adicionei quando fiz essa alteração, adicionando um construtor sem parâmetros. Eu acredito que o compilador cria um construtor sem parâmetros por padrão, mas se você adicionar o seu próprio, então você deve criá-lo explicitamente.

  public class myClass { public string id{ get; set; } public List 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 lst) { this.id= id; this.myList= lst; } } 

Eu adicionei um DropDownList ao meu formulário, no entanto, no meu caso, não era (e não era para ser) enviado com o formulário, pois estava fora das tags

:

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

Como o Modelo continha o campo somente para exibição, isso também causou o No parameterless constructor defined for this object erro de No parameterless constructor defined for this object porque o campo não foi submetido.

Neste caso, corrigi-lo adicionando uma binding de exclusão:

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

Isso aconteceu comigo, e os resultados nesta página foram um bom recurso que me levou em muitas direções, mas gostaria de acrescentar outra possibilidade:

Como afirmado em outras respostas, a criação de um construtor com parâmetros remove o construtor implícito sem parâmetros, portanto, você deve explicitamente digitá-lo.

Qual foi o meu problema foi que um construtor com parâmetros padrão também desencadeou essa exceção.

Dá erros:

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

Trabalho:

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

Muito provavelmente você pode ter construtor parametrizado em seu controlador e qualquer resolvedor de dependência que você esteja usando não é capaz de resolver a dependência corretamente. Você precisa colocar o ponto de interrupção onde o método do resolvedor de dependência está escrito e você obterá o erro exato na exceção interna.

Eu tive o mesmo problema, mas depois encontrei adicionando qualquer nova interface e a class correspondente requer que ele seja registrado no Initializable Module para injeção de dependência. No meu caso, estava dentro do código da seguinte forma:

 [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().Use(); container.For().Use(); container.For().Use(); container.For().Use().Singleton(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); RegisterEnterpriseAPIClient(container); } public void Initialize(InitializationEngine context) { } public void Uninitialize(InitializationEngine context) { } public void Preload(string[] parameters) { } } 

}

Eu tive o mesmo problema.

Apenas HttpFileCollectionBase files removidos do argumento do método Post Action e adicionados como HttpFileCollectionBase files = Request.Files; no corpo do método.

Então eu também recebi essa mensagem antes, ao fazer uma chamada de ajax. Então, o que ele está basicamente pedindo é um construtor nessa class de modelo que está sendo chamado pelo contoller, não tem nenhum parâmetro.

Aqui está um exemplo

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