ASP.NET MVC: Für dieses Objekt ist kein parameterloser Konstruktor definiert

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

Ich folgte Steven Sandersons Buch ' Pro ASP.NET MVC Framework '. Auf Seite 132 habe ich gemäß der Empfehlung des Autors die ASP.NET MVC Futures-Assembly heruntergeladen und meinem MVC-Projekt hinzugefügt. [Hinweis: Dies könnte ein roter Hering sein.]

Danach konnte ich mein Projekt nicht mehr laden. Der obige Fehler hat mich kalt gehalten.

Meine Frage lautet nicht : "Können Sie mir helfen, meinen Code zu reparieren?"

Stattdessen möchte ich allgemeiner wissen:

  • Wie soll ich dieses Problem beheben?
  • Was soll ich suchen?
  • Was könnte die Grundursache sein?

Es scheint, als sollte ich Routing und Controller auf einer tieferen Ebene verstehen als jetzt.

Jim G.
quelle

Antworten:

226

Ich hatte gerade ein ähnliches Problem. Die gleiche Ausnahme tritt auf, wenn a Modelkeinen parameterlosen Konstruktor hat.

Der Aufrufstapel stellte eine Methode fest, die für die Erstellung einer neuen Instanz eines Modells verantwortlich ist.

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


Hier ist ein Beispiel:

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
    {
    }
}
SandRock
quelle
16
Beim POSTEN von JSON-Daten zu meiner Aktion wurde ein ähnlicher Fehler angezeigt. Es stellt sich heraus, dass mein Modell, an das es zu binden versucht, keinen parameterlosen Konstruktor hat!
Tim
1
NB: Ich habe dieses Problem (kein parameterloses bla bla ...) während der Serialisierung nur, wenn ich einen Konstruktor und keinen parameterlosen Konstruktor definiere. Ich meine, in diesem Beispiel verschwindet das Problem, wenn Sie den von Ihnen definierten Konstruktor löschen (public MyModel (IHelper helper) {}). Jedes Mal, wenn Sie einen Konstruktor erstellen, müssen Sie einen parameterlosen erstellen ... Ich kann verstehen Das heißt: Sobald Sie einen Konstruktor definiert haben, geht das System nicht das Risiko ein, 'Standardobjekte' zu erstellen, da es nicht weiß, ob es sinnvoll ist ... so etwas.
H_He
1
Tupel ... vielleicht für einige andere Leute, die hierher kommen: Wenn Sie nur Tupel (wie Tupel <string, string> data;) in Ihrer Klasse haben, ist die Serialisierung in Ordnung (weil ich dieses Problem während der JSON-Serialisierung festgestellt habe) ... aber wenn Sie so etwas wie List <Tuple <string, string >> data verwenden; Es wird der Fehler "kein parameterloser Konstruktor" angezeigt. Weil .Net keine Tupel erstellen kann / kann (ich habe keine Referenz dafür, aber Tuple <string, string> data = new Tuple <string, string> (); wird nicht kompiliert ... während Tuple <string, string> data = new Tuple <string, string> ("", ""); ist in
Ordnung
3
Ja, aber wie fügt man einer Klasse mit Abhängigkeiten einen parameterlosen Konstruktor hinzu und möchte sie in den Konstruktor einfügen? Das ist der Teil des Problems, das ich nicht bekomme ...
EluciusFTW
2
@ToaoG Ihre Abhängigkeitsinjektionsbibliothek sollte Ihnen eine Möglichkeit bieten, den "Injektionskonstruktor" auszuwählen. Übrigens sieht eine Abhängigkeitsinjektion in Ansichtsmodellen seltsam aus.
SandRock
89

Dies kann auch verursacht werden, wenn Ihr Modell eine SelectList verwendet, da diese keinen parameterlosen Konstruktor hat :

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

Sie müssen Ihr Modell umgestalten, um es anders zu machen, wenn dies die Ursache ist. Verwenden Sie also eine IEnumerable<Contact>und schreiben Sie eine Erweiterungsmethode, mit der die Dropdown-Liste mit den verschiedenen Eigenschaftsdefinitionen erstellt wird:

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

Oder Sie können den Ansatz @Mark und @krilovich verwenden. Sie müssen lediglich SelectList durch IEnumerable ersetzen. Dies funktioniert auch mit MultiSelectList.

 public class MyViewModel
    {
        public Contact SelectedContact { get;set; }
        public IEnumerable<SelectListItem> Contacts { get;set; }
    }
Chris S.
quelle
1
Ich habe so viel Zeit damit verschwendet ... und musste meine Hilfsfunktion, die eine SelectList zurückgab, in eine umwandeln, die eine List <SelectListItem> zurückgibt .... blarg
Mark
Sie können IEnumerable <SelectListItem> verwenden und diese in Ihrem Konstruktor als neue Liste <SelectListItem> () instanziieren.
krilovich
Vielen Dank 3,5 Jahre später!
Tonyapolis
Vielen Dank, das war sehr hilfreich!
Kevin Coulson
Noch 5 Jahre später gültig. Vielen Dank!
Neill
23

Sie benötigen die Aktion, die der Steuerung entspricht, um keinen Parameter zu haben.

Sieht aus wie für die Controller / Action-Kombination, die Sie haben:

public ActionResult Action(int parameter)
{

}

aber du brauchst

public ActionResult Action()
{

}

Lesen Sie auch Phil Haacks Route Debugger, um Fehler in Routen zu beheben.

Martin
quelle
6
Die Ausnahme bezieht sich auf den Konstruktor und nicht auf die Aktionsmethode.
Jason Wicker
4
@ Logrythmik. Die gemeldete Ausnahme betrifft den Konstruktor, das Problem liegt jedoch in der Aktionsmethode. Ich hatte eine Klassen- und Aktionsmethode, die funktionierten, fügte dann der Aktionsmethode einen Parameter hinzu und bekam diesen Fehler. Eine alternative Lösung besteht darin, einen Wert für den Parameter anzugeben. Oder machen Sie den Parameter optional - dies sollte funktionieren, wenn der Controller in C # ist, aber es war nicht für mich mit F #
Stephen Hosking
Wenn Sie beispielsweise @ Html.Action ("SomeAction", new {myParameter = "42"}) ausführen, stellen Sie sicher, dass der Name des Parameters in Ihrem Html.Action-Aufruf mit dem Namen des in definierten Parameters übereinstimmt Ihre Handlungsmethode!
JT Taylor
20

Standardmäßig benötigen MVC-Controller einen Standardkonstruktor ohne Parameter. Am einfachsten wäre es, einen Standardkonstruktor zu erstellen, der den mit Parametern aufruft:

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

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

Sie können diese Funktionalität jedoch überschreiben, indem Sie Ihre eigenen rollen ControllerFactory. Auf diese Weise können Sie MVC mitteilen, dass Sie beim Erstellen MyControllereiner Instanz eine Instanz von geben Helper.

Auf diese Weise können Sie Dependency Injection-Frameworks mit MVC verwenden und wirklich alles entkoppeln. Ein gutes Beispiel dafür finden Sie auf der StructureMap-Website . Der ganze Schnellstart ist gut und er wird bei "Auto Wiring" ganz unten auf MVC zugeschnitten.

Swilliams
quelle
6
Ich denke nicht, dass dies die richtige Antwort ist, @swilliams. Der Schlüssel hier ist der Teil: definiert für dieses Objekt . Das ist eine Mistfehlermeldung, die tatsächlich darauf hinweist, dass die übergebenen EINGANGSMODELLE nicht erstellt werden können. Wenn Sie also ein Eingabemodell haben, das keinen parameterlosen Konstruktor hat, wird dieser Fehler angezeigt. Sehr leicht zu glauben, dass es mit dem CONTROLLER-Konstruktor zusammenhängt. Aber es ist nicht.
Pure.Krome
1
Es ist eine beschissene Nachricht, die Sie auf eine wilde Gänsejagd bringt, wenn es keine Antworten wie diese gäbe. Dank dieser Antwort und der obigen Antwort konnte ich die Dinge in Ordnung bringen. Ich denke, es geht darum, nicht vollständig zu verstehen, was der Ordner hinter den Kulissen tut. Ich dachte, es würde nur jede Eigenschaft festlegen, aber aus irgendeinem Grund ruft es beim Posten auch das Get vor dem Festlegen auf. Da ich meinen Konstruktor überlastet und mit einem Konstruktor ohne Parameter kompensieren musste, musste ich Nullen berücksichtigen, die ein Teil meiner Eigenschaft erhält, was ebenfalls unerwartet war.
eaglei22
18

Dieser Fehler tritt auch bei Verwendung eines IDependencyResolver auf , z. B. bei Verwendung eines IoC-Containers, und der Abhängigkeitsauflöser gibt null zurück. In diesem Fall verwendet ASP.NET MVC 3 standardmäßig den DefaultControllerActivator, um das Objekt zu erstellen. Wenn das zu erstellende Objekt keinen öffentlichen Konstruktor no-args hat, wird jedes Mal eine Ausnahme ausgelöst, wenn der bereitgestellte Abhängigkeitsauflöser null zurückgegeben hat.

Hier ist eine solche Stapelverfolgung:

[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
Kaleb Pederson
quelle
2
Dies verursachte mein Problem: Mein Abhängigkeitsauflöser konnte meinen Controller aufgrund einer Ausnahme nicht erstellen. Es wurde vom Resolver verschluckt, gab null zurück und das MVC-Framework wechselte zum Standard-Controller-Aktivator, was zu dem beschriebenen Fehler führte.
Beriz
@ jmona789 Überprüfen Sie, ob Sie alle Ihre injizierten Abhängigkeiten in Ihrer Global.asax festgelegt haben.
Aloisdg wechselt zu codidact.com
13

Sie können diese Ausnahme an vielen verschiedenen Stellen im MVC-Framework erhalten (z. B. kann der Controller nicht erstellt werden oder es kann kein Modell für diesen Controller erstellt werden).

Die einzige einfache Möglichkeit, dieses Problem zu diagnostizieren, besteht darin, MVC so nah wie möglich an der Ausnahme mit Ihrem eigenen Code zu überschreiben. Wenn diese Ausnahme auftritt, wird Ihr Code in Visual Studio unterbrochen, und Sie können den Typ, der das Problem verursacht, aus dem Stack-Trace lesen.

Dies scheint ein schrecklicher Weg zu sein, um dieses Problem anzugehen, aber es ist sehr schnell und sehr konsequent.

Wenn dieser Fehler beispielsweise im MVC DefaultModelBinder auftritt (was Sie anhand der Stapelverfolgung erkennen können), ersetzen Sie den DefaultModelBinder durch diesen 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);
    }
}

Und aktualisieren Sie Ihre Global.asax.cs:

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

Wenn Sie diese Ausnahme das nächste Mal erhalten, stoppt Visual Studio in Ihrer MyDefaultModelBinder-Klasse, und Sie können die Eigenschaft "modelType" überprüfen, um festzustellen, welcher Typ das Problem verursacht hat.

Das obige Beispiel funktioniert nur, wenn während der Modellbindung die Ausnahme "Kein parameterloser Konstruktor für dieses Objekt definiert" angezeigt wird. Ein ähnlicher Code kann jedoch auch für andere Erweiterungspunkte in MVC geschrieben werden (z. B. Controller-Konstruktion).

Josh Mouch
quelle
Das habe ich mir für mein Problem überlegt.
Doug Chamberlain
Ich wünschte, ich könnte dies mehr unterstützen. Hat mir mehr als ein paar Minuten meiner Zeit gespart.
Keith
8

Ich habe den gleichen Fehler bekommen, der Schuldige in meinem Fall war der Konstruktor, der weder öffentlich noch privat war .

Für dieses Objekt ist kein parameterloser Konstruktor definiert.

Ausnahmedetails: System.MissingMethodException: Für dieses Objekt ist kein parameterloser Konstruktor definiert.

Repro-Code: Stellen Sie sicher, dass der Konstruktor öffentlich ist.

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

    public string name
    {
        get;
        set;
    }
}
Hammad Khan
quelle
4
Nur als Hinweis: Das Fehlen von Zugriffsmodifikatoren in einem Konstruktor ist im Compiler standardmäßig "intern".
lsuarez
1
Wenn Sie den Modifikator "privat" eingeben, wird das Problem nicht gelöst.
krzyski
7

Erstes Video auf http://tekpub.com/conferences/mvcconf

47:10 Minuten in zeigen den Fehler und zeigen, wie die Standard-ControllerFactory überschrieben wird. Dh um eine Strukturkarten-Controller-Fabrik zu erstellen.

Grundsätzlich versuchen Sie wahrscheinlich, die Abhängigkeitsinjektion zu implementieren?

Das Problem ist, dass die Schnittstellenabhängigkeit ist.

Dan B.
quelle
Und Sie können die StructureMapControllerFactory-Klasse aus dem MVC Storefront-Projekt
Gautam Jain
6

Ich habe den gleichen Fehler erhalten, wenn:

Bei Verwendung einer benutzerdefinierten ModelView haben beide Aktionen (GET und POST) die ModelView übergeben, die zwei Objekte enthielt:

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

Und der POST akzeptiert auch dieselbe Modellansicht:

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

Das Problem war, dass die Ansicht die ModelView erhielt (benötigte sowohl Produkt- als auch Liste der Kategorieninformationen), aber nach dem Senden nur das Product-Objekt zurückgab. Da POST Add jedoch eine ProductModelView erwartete, übergab es eine NULL, aber der ProductModelView-Konstruktor benötigte nur zwei Parameter ( Produkt, RootCategories), dann wurde versucht, einen anderen Konstruktor ohne Parameter für diesen NULL-Fall zu finden, und dann schlägt er mit "no parameterles ..." fehl.

Wenn Sie den POST Add wie folgt beheben, wird das Problem behoben:

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

Hoffe, das kann jemandem helfen (ich habe fast einen halben Tag damit verbracht, das herauszufinden!).

Nestor
quelle
Nestor, das ist aufschlussreich und scheint richtig zu sein. Aber warum gibt die Ansicht ein anderes Objekt zurück als sie empfängt, dh ein Produktobjekt und nicht das ProductViewModel?
GilShalit
Oh, dies war spezifisch für meinen Fall, da ich nur Daten für Produkte aufbewahren muss. Die RootCategories wurden nur zum Ausdrucken an die Ansicht übergeben. Es wurden keine Eingaben vorgenommen, sodass ihre Werte (RootCategories) nicht in der <Eingabe beibehalten wurden > oder irgendwo anders. Soll ich das gleiche ViewModel behalten, das ich mit dem Formular <Eingabe>, den Ansichtsdaten oder etwas anderem beibehalten würde?
Nestor
GilShalit, heute habe ich eine Antwort gefunden (sorry, ich bin langsam!). Als ich mir das gerenderte HTML ansah, sah ich, dass die Eingabe den Namen [ObjectName] hatte. [Property], aber es gibt keine Spur des ursprünglichen ViewModel, sodass Sie nur jedes einzelne abrufen können Objekt im ViewModel, aber nicht das gesamte ViewModel selbst. Beispiel: Wenn Ihre ProductViewModel-VM in den Objekten Produkt p und Kategorie c enthalten ist, sendet Ihr GET-Controller eine Modell-VM an die Ansicht. Der POST-Controller kann nur Parameter wie (Produkt p, Kategorie c) akzeptieren, nicht jedoch die VM. .. wenn ich falsch liege würde ich mich über ein Feedback freuen.
Nestor
5

Das gleiche für mich. Mein Problem trat auf, weil ich vergessen habe, dass meine Basismodellklasse bereits eine Eigenschaft mit dem Namen hat, der in der Ansicht definiert wurde .

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

... und Controller-Verarbeitungsmodell:

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

Nichts besonderes, oder? Aber dann definiere ich die Ansicht ...

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

... was bei POST-Anfrage den Fehler "Parameterloser Konstruktor" verursacht.

Hoffentlich hilft das.

Anonym
quelle
5

Ich hatte ein ähnliches Problem, und im Grunde ist der Punkt, dass es einige Argumente in der Aktionsmethode gibt, die nicht vom Modellbindungsprozess bereitgestellt wurden (und mit anderen Worten, diese Felder wurden nicht von der übergebenden Seite übermittelt).

Dieses Problem tritt auch dann auf, wenn alle Argumente außer einem angegeben werden und wenn das fehlende ein nullbarer Typ ist.

Das Problem kann auch auf einen Tippfehler zurückzuführen sein, bei dem der Name des Arguments und der Name des Formularfelds nicht identisch sind.

Die Lösung besteht darin, 1) zu überprüfen, ob die Namen übereinstimmen 2) einen Standardwert für das Argument bereitzustellen 3) oder eine andere Aktionsmethode ohne dieses Argument bereitzustellen.

yoel halb
quelle
Vielen Dank an @yo hal, Ihre Antwort hat meine spezielle Instanz dieses Fehlers gelöst. Die Fehlermeldung, die das Framework ausspuckt, ist in diesem Fall die am wenigsten nützliche Fehlermeldung .
Scott Lawrence
4

Ich hatte auch dieses Problem und dachte, ich würde es teilen, da ich mein Problem oben nicht finden kann.

Das war mein Code

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

Aufruf dieses Aktionsergebnisses:

public ActionResult Overview(int id)

Ich nahm an, dass es klug genug wäre, um herauszufinden, dass der Wert, den ich übergebe, der ID-Parameter für die Übersicht ist, aber nicht. Dies hat es behoben:

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

Brik
quelle
4

Ich habe die gleiche Ausnahme bekommen, weil es keinen parameterlosen öffentlichen Konstruktor gab

Code war wie folgt:

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

gewechselt zu

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

Problem für mich gelöst.

Muru Bakthavachalam
quelle
Ich hatte das gleiche Problem bei der Verwendung eines geschützten Konstruktors in einer Basisklasse - scheint jetzt eine offensichtliche Lösung zu sein!
keithl8041
4

Alle Antworten besagen, dass ein Konstruktor ohne Parameter erstellt werden soll, was nicht ideal ist, wenn Sie nicht möchten, dass andere Entwickler ihn verwenden, sondern nur den Modellordner.

Das Attribut [Obsolete("For model binding only", true)]über einem öffentlichen Konstruktor löst einen Compilerfehler aus, wenn ein anderer Entwickler versucht, dies zu verwenden. Ich habe ewig gebraucht, um das zu finden, hoffe, es hilft jemandem.

Martin Dawson
quelle
Perfekt - Durch Hinzufügen dieses Attributs konnte die MVC-Modellbindung zur Laufzeit ausgeführt werden, und durch Setzen des booleschen Parameters des Attributs auf true wurde (zur Kompilierungszeit) jeder Versuch verhindert, den parameterlosen Konstruktor zu instanziieren. Beste Antwort hier.
Greg Trevellick
3

Ich habe diesen Fehler bekommen. Ich habe Schnittstellen in meinem Konstruktor verwendet und mein Abhängigkeitsauflöser konnte nicht aufgelöst werden. Als ich ihn registrierte, verschwand der Fehler.

Ahmed
quelle
Wenn Sie eine neue Frage haben, posten Sie diese bitte als solche. Dies sollte entweder ein Kommentar oder eine neue Frage sein, da nicht versucht wird, das Problem zu beantworten.
Nahuel Ianni
2

Ich hatte das gleiche Problem ...

Wenn Sie eine Schnittstelle verwenden, um Ihre Verbindung mit Ihrem DbContext zu entkoppeln (wie ich), können Sie structuremap.mvc (3- oder 4-Budget-Paket ) verwenden, um eine Konstruktion in Ihrer Controller-Klasse verwenden zu können. Dadurch erhalten Sie einen DependencyResolution-Ordner. Ändern Sie einfach die kommentierte Zeile mit Ihrer For <Schnittstellenklasse> () und verwenden Sie <DbContextClass> ().

JeppePepp
quelle
2

Während dies für einige offensichtlich sein mag, war der Schuldige für diesen Fehler für mich, dass meine MVC-Methode an ein Modell gebunden war, das eine Eigenschaft vom Typ enthielt Tuple<>. Tuple<>hat keinen parameterlosen Konstruktor.

Tyler Forsythe
quelle
1

Ich hatte das gleiche Problem, fand aber später heraus, dass das Hinzufügen einer neuen Schnittstelle und der entsprechenden Klasse die Registrierung unter Initializable Module für die Abhängigkeitsinjektion erfordert. In meinem Fall war es wie folgt im 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)
    {
    }
}

}}

Arokanika
quelle
1

In meinem Fall hatte meine Klasse das [Serializable]Attribut.

Sie benötigen einen Konstruktor, der keine Parameter akzeptiert, wenn Ihre Klasse ist [Serializable]

Kolob Canyon
quelle
0

Dieser Fehler begann für mich, als ich eine neue Methode zum Instanziieren einer Klasse hinzufügte.

Beispiel:

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

Der Fehler wurde behoben, als ich bei dieser Änderung einen parameterlosen Konstruktor hinzufügte. Ich glaube, der Compiler erstellt standardmäßig einen parameterlosen Konstruktor, aber wenn Sie Ihren eigenen hinzufügen, müssen Sie ihn explizit erstellen.

    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;
         }
     }
Futter
quelle
0

Ich hatte DropDownListmeinem Formular ein hinzugefügt , aber in meinem Fall wurde es nicht mit dem Formular gesendet (und sollte es auch nicht sein), da es sich außerhalb der <form></form>Tags befand:

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

Da das Modell das Feld nur zur Anzeige enthielt, verursachte dies auch den No parameterless constructor defined for this objectFehler, da das Feld überhaupt nicht gesendet wurde.

In diesem Fall habe ich das Problem behoben, indem ich eine Ausschlussbindung hinzugefügt habe:

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

Dies ist mir passiert und die Ergebnisse auf dieser Seite waren eine gute Ressource, die mich in viele Richtungen geführt hat, aber ich möchte noch eine weitere Möglichkeit hinzufügen:

Wie in anderen Antworten angegeben, wird beim Erstellen eines Konstruktors mit Parametern der implizite parameterlose Konstruktor entfernt, sodass Sie ihn explizit eingeben müssen.

Mein Problem war, dass ein Konstruktor mit Standardparametern diese Ausnahme ebenfalls auslöste.

Gibt Fehler:

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

Werke:

public CustomerWrapper(CustomerDto customer){...}
public CustomerWrapper():this(null){}
Bendik August Nesbø
quelle
0

Höchstwahrscheinlich haben Sie einen parametrisierten Konstruktor in Ihrem Controller und der von Ihnen verwendete Abhängigkeitsauflöser kann die Abhängigkeit nicht ordnungsgemäß auflösen. Sie müssen einen Haltepunkt setzen, an dem die Abhängigkeitsauflösungsmethode geschrieben ist, und Sie erhalten den genauen Fehler in der inneren Ausnahme.

Mahendra Savale
quelle
0

Ich hatte das gleiche Problem.

Nur HttpFileCollectionBase filesaus dem Post Action-Methodenargument entfernt und wie HttpFileCollectionBase files = Request.Files;im Methodenkörper hinzugefügt .

Muhammad Yasir
quelle
0

Ich habe dem Modell im DOMAIN-Ordner einen parameterlosen Konstruktor hinzugefügt, und das Problem ist gelöst.

Geben Sie hier die Bildbeschreibung ein

 public User()
        {

        }
Melodie
quelle
-3

Ich habe diese Nachricht also auch schon einmal erhalten, als ich einen Ajax-Anruf getätigt habe. Grundsätzlich wird also nach einem Konstruktor in dieser Modellklasse gefragt, der vom Controller aufgerufen wird und keinen Parameter hat.

Hier ist ein Beispiel

public class MyClass{

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

 }
Carla
quelle
Ich habe den Standardkonstruktor aus dem Modell entfernt. Dies funktioniert für mich.
Musakkhir Sayyed