ASP.NET MVC: Geen parameterloze constructor gedefinieerd voor dit object

Ik volgde het boek ‘Pro ASP.NET MVC Framework‘ van Steven Sanderson. Op pagina 132 heb ik, in overeenstemming met de aanbeveling van de auteur, de ASP.NET MVC Futures-assemblage gedownload en toegevoegd aan mijn MVC-project. [Opmerking: dit kan een rode haring zijn.]

Hierna kon ik mijn project niet meer laden. De bovenstaande fout hield me koud.

Mijn vraag is niet: “Kun je me helpen mijn code te herstellen?”

In plaats daarvan zou ik graag meer in het algemeen willen weten:

  • Hoe moet ik dit probleem oplossen?
  • Waar moet ik naar zoeken?
  • Wat kan de hoofdoorzaak zijn?

Het lijkt erop dat ik routering en controllers op een dieper niveau zou moeten begrijpen dan ik nu doe.


Antwoord 1, autoriteit 100%

Ik had net een soortgelijk probleem. Dezelfde uitzondering doet zich voor wanneer een Modelgeen parameterloze constructor heeft.

De call-stack was een methode aan het bedenken die verantwoordelijk was voor het maken van een nieuwe instantie van een model.

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


Hier is een voorbeeld:

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

Antwoord 2, autoriteit 39%

Dit kan ook worden veroorzaakt als uw model een SelectList gebruikt, omdat dit geen parameterloze constructor heeft:

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

Als dit de oorzaak is, moet u uw model refactoren om het op een andere manier te doen. Dus een IEnumerable<Contact>gebruiken en een extensiemethode schrijven die de vervolgkeuzelijst maakt met de verschillende eigenschapdefinities:

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

Of u kunt de @Mark- en @krilovich-aanpak gebruiken, u hoeft alleen SelectList te vervangen door IEnumerable, het werkt ook met MultiSelectList.

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

Antwoord 3, autoriteit 10%

Je hebt de actie nodig die overeenkomt met de controller om geen parameter te hebben.

Zo te zien is de combinatie van controller en actie die je hebt:

public ActionResult Action(int parameter)
{
}

maar je hebt

. nodig

public ActionResult Action()
{
}

Bekijk ook de Route Debuggervan Phil Haack. om problemen met routes op te lossen.


Antwoord 4, autoriteit 9%

Standaard vereisen MVC-controllers een standaardconstructor zonder parameters. Het eenvoudigst zou zijn om een ​​standaardconstructor te maken die degene met parameters aanroept:

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

U kunt deze functionaliteit echter overschrijven door uw eigen ControllerFactoryte gebruiken. Op deze manier kun je MVC vertellen dat wanneer je een MyControlleraanmaakt, deze een instantie van Helpergeeft.

Hierdoor kun je Dependency Injection-frameworks gebruiken met MVC en echt alles loskoppelen. Een goed voorbeeld hiervan is te vinden op de StructureMap-website. De hele quickstart is goed, en hij wordt specifiek voor MVC onderaan bij “Auto Wiring”.


Antwoord 5, autoriteit 9%

Deze fout treedt ook op bij gebruik van een IDependencyResolver, zoals bij gebruik van een IoC-container, en de afhankelijkheidsresolver retourneert null. In dit geval gebruikt ASP.NET MVC 3 standaard de DefaultControllerActivator om het object te maken. Als het object dat wordt gemaakt geen openbare no-args-constructor heeft, wordt er een uitzondering gegenereerd wanneer de opgegeven afhankelijkheidsresolver null heeft geretourneerd.

Hier is zo’n stacktracering:

[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

Antwoord 6, autoriteit 6%

Je kunt deze uitzondering op veel verschillende plaatsen in het MVC-framework krijgen (het kan bijvoorbeeld de controller niet maken, of het kan geen model maken om die controller te geven).

De enige gemakkelijke manier die ik heb gevonden om dit probleem te diagnosticeren, is door MVC zo dicht mogelijk bij de uitzondering te overschrijven met uw eigen code. Dan breekt uw code in Visual Studio wanneer deze uitzondering optreedt, en kunt u het type dat het probleem veroorzaakt uit de stacktracering lezen.

Dit lijkt een vreselijke manier om dit probleem aan te pakken, maar het is erg snel en erg consistent.

Als deze fout bijvoorbeeld in de MVC-standaardmodelbinder (die weet door het stapelspoor te controleren), vervang dan de standaardmodelbinder met deze code:

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

en update uw globaal.asax.cs:

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

Nu de volgende keer dat u die uitzondering krijgt, stopt Visual Studio in uw MyDefaultmodelbinderklasse, en u kunt de eigenschap “ModelType” controleren om te zien welk type het probleem is veroorzaakt.

Het bovenstaande voorbeeld werkt voor wanneer u de “Geen parameterless constructeur hebt gedefinieerd die is gedefinieerd voor dit object” uitzondering tijdens modelbinding, alleen. Maar vergelijkbare code kan worden geschreven voor andere uitbreidingspunten in MVC (bijvoorbeeld controllerconstructie).


7, Autoriteit 3%

Ik kreeg dezelfde fout, de boosdoener in mijn geval was de constructeur die niet publiek noch privé was.

Geen parameterloze constructeur gedefinieerd voor dit object.

Uitzonderingsdetails: System.missingMethodexception: geen parameterloze constructeur gedefinieerd voor dit object.

Repro-code: Zorg ervoor dat de constructeur er eerder openbaar heeft.

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

8, Autoriteit 3%

Ik heb dezelfde fout bij:

Gebruik een aangepaste modelview, beide acties (Get and Post) passeren het ModelView dat twee objecten bevatte:

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

En de post accepteren ook dezelfde modelweergave:

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

Probleem was de weergave die het ModelView heeft ontvangen (benodigde producten en lijst met categorieën info), maar na ingediend was alleen het productobject terugkeren, maar als de post toevoegende verwachting een productmodelview het een nul heeft geslaagd, maar dan is het gebruik van de productmodelview. Twee parameters (product, ropcategorieën), dan probeerde het een andere constructor te vinden zonder parameters voor deze null-behuizing mislukt dan met “Geen parameterles …”

Dus, het vaststellen van de post toevoegen als volgt, correct het probleem:

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

Ik hoop dat dit iemand kan helpen (ik heb bijna de halve dag doorgebracht om dit te vinden!).


9, Autoriteit 2%

Ik had een soortgelijk probleem, en eigenlijk is het punt dat er enkele argumenten zijn in de actiemethode die niet werden geleverd door het modelbindproces, (en met andere woorden deze velden werden niet ingediend door de indiening van pagina).

Dit probleem zal eruit komen, zelfs als alle argumenten maar één worden geleverd, en zelfs als de menist een onmerkbaar type is.

Het probleem kan ook een resultaat zijn van een typfout, waarin de naam van het argument en de naam van het formulierveld niet identiek is.

De oplossing is op 1) Controleer of de namen overeenkomen met 2) een standaardwaarde bieden voor het argument 3) of een andere actiemethode bieden zonder dit argument.


10, Autoriteit 2%

Ik had dit probleem ook en dacht dat ik zou delen sinds ik mijn probleem hierboven niet kan vinden.

Dit was mijn code

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

Bellen met deze actionResult:

public ActionResult Overview(int id)

Ik ging ervan uit dat het slim genoeg zou zijn om erachter te komen dat de waarde die ik passeer het is de ID-paramler voor overzicht, maar het is het niet. Dit heeft het opgelost:

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


11, Autoriteit 2%

Ik heb dezelfde uitzondering vanwege er was geen parameterloze openbare contructor

code was als volgt:

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

gewijzigd in

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

Probleem opgelost voor mij.


12, Autoriteit 2%

Alle antwoorden zeggen om een ​​parameters minder constructor te maken die niet ideaal is als u geen andere Devs gebruikt die het gebruiken en alleen het modelbinder.

Het attribuut [Obsolete("For model binding only", true)]boven een openbare constructeur gooit een compiler-fout als een andere Dev probeert dit te gebruiken. Nam me eeuwen om dit te vinden, hoop dat het iemand helpt.


13

Ik heb deze fout. Ik gebruikte interfaces in mijn constructeur en mijn afhankelijkheid resolver was niet in staat om op te lossen, als ik geregistreerd, dan wordt de fout ging weg.


14

Ik had het zelfde probleem …

Als je met behulp van een interface om uw verbinding tegen je DbContext ontkoppelen (zoals ik) die u kunt gebruiken structuremap.mvc (3 of 4 – nudget pakket ) om te kunnen een constructure gebruiken in uw controller klasse. Dit geeft je een DependencyResolution folder geven. Verander enkel de commentaar lijn met uw Voor & lt; InterfaceClass & gt; () en Use & lt; DbContextClass & gt;. ()


15

Hoewel dit voor sommigen duidelijk zal zijn, was de boosdoener van deze fout voor mij dat mijn MVC-methode gebonden was aan een model dat een eigenschap van het type Tuple<>bevatte. Tuple<>heeft geen parameterloze constructor.


Antwoord 16

Ik had hetzelfde probleem, maar ontdekte later dat het toevoegen van een nieuwe interface en de bijbehorende klasse vereist dat deze wordt geregistreerd onder Initializable Module voor afhankelijkheidsinjectie. In mijn geval was het als volgt in de code:

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

}


Antwoord 17

In mijn geval had mijn klas het kenmerk [Serializable].

U moet een constructor hebben die geen parameters nodig heeft als uw klasse [Serializable]

is


Antwoord 18

Ik heb een parameterloze constructor toegevoegd aan het model in de DOMAIN-map en het probleem is opgelost.

public User()
        {
        }

Antwoord 19

Deze typefout kan optreden als gevolg van een ontbrekende afhankelijkheidsinjector/resolver-container en/of ontbrekende bindingen

  1. Voeg Dependency-injector toe aan uw project met NugetPacketManager (Unity, Ninject of wat u maar wilt)
  2. Voeg binding(en) toe voor interface en concrete implementatie voor de klassen

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

Antwoord 20

Deze fout begon voor mij toen ik een nieuwe manier toevoegde om een ​​klas te instantiëren.

Voorbeeld:

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

De fout is opgelost toen ik deze toevoegde toen ik deze wijziging aanbracht, door een parameterloze constructor toe te voegen. Ik geloof dat de compiler standaard een parameterloze constructor maakt, maar als je die van jezelf toevoegt, moet je deze expliciet maken.

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

Antwoord 21

Ik had een DropDownListaan mijn formulier toegevoegd, maar in mijn geval werd het niet (en was het ook niet bedoeld) ingediend bij het formulier omdat het buiten de <form></form>-tags:

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

Omdat het model het veld alleen voor weergave bevatte, veroorzaakte dit ook de fout No parameterless constructor defined for this objectomdat het veld helemaal niet werd ingediend.

In dit geval heb ik het opgelost door een uitsluitingsbinding toe te voegen:

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

Antwoord 22

Dit overkwam mij, en de resultaten op deze pagina waren een goede bron die me in vele richtingen leidde, maar ik wil graag nog een mogelijkheid toevoegen:

Zoals vermeld in andere antwoorden, verwijdert het maken van een constructor met parameters de impliciete parameterloze constructor, dus je moet het expliciet typen.

Mijn probleem was dat een constructor met standaardparameters ook deze uitzondering activeerde.

Geeft fouten:

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

Werkt:

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

Antwoord 23

Hoogstwaarschijnlijk heeft u een geparametriseerde constructor in uw controller en welke afhankelijkheidsresolver u ook gebruikt, kan de afhankelijkheid niet correct oplossen. Je moet een breekpunt plaatsen waar de methode voor het oplossen van afhankelijkheid is geschreven en je krijgt de exacte fout in innerlijke uitzondering.


Antwoord 24

Ik had hetzelfde probleem.

Zojuist HttpFileCollectionBase filesverwijderd uit argument Post Action-methode
en toegevoegd zoals HttpFileCollectionBase files = Request.Files;in methode body.


Antwoord 25

Dus ik heb die melding ook eerder gekregen, toen ik een ajax-oproep deed. Dus waar het in feite om vraagt, is een constructor in die modelklasse die wordt aangeroepen door de contoller, die geen enkele parameter heeft.

Hier is een voorbeeld

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

Other episodes