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.
Dies kann auch verursacht werden, wenn Ihr Modell eine SelectList verwendet, da diese keinen parameterlosen Konstruktor hat :
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:Oder Sie können den Ansatz @Mark und @krilovich verwenden. Sie müssen lediglich SelectList durch IEnumerable ersetzen. Dies funktioniert auch mit MultiSelectList.
quelle
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:
aber du brauchst
Lesen Sie auch Phil Haacks Route Debugger, um Fehler in Routen zu beheben.
quelle
Standardmäßig benötigen MVC-Controller einen Standardkonstruktor ohne Parameter. Am einfachsten wäre es, einen Standardkonstruktor zu erstellen, der den mit Parametern aufruft:
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 ErstellenMyController
einer Instanz eine Instanz von gebenHelper
.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.
quelle
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:
quelle
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:
Und aktualisieren Sie Ihre Global.asax.cs:
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).
quelle
Ich habe den gleichen Fehler bekommen, der Schuldige in meinem Fall war der Konstruktor, der weder öffentlich noch privat war .
Repro-Code: Stellen Sie sicher, dass der Konstruktor öffentlich ist.
quelle
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.
quelle
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:
Und der POST akzeptiert auch dieselbe Modellansicht:
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:
Hoffe, das kann jemandem helfen (ich habe fast einen halben Tag damit verbracht, das herauszufinden!).
quelle
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 .
... und Controller-Verarbeitungsmodell:
Nichts besonderes, oder? Aber dann definiere ich die Ansicht ...
... was bei POST-Anfrage den Fehler "Parameterloser Konstruktor" verursacht.
Hoffentlich hilft das.
quelle
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.
quelle
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});
quelle
Ich habe die gleiche Ausnahme bekommen, weil es keinen parameterlosen öffentlichen Konstruktor gab
Code war wie folgt:
gewechselt zu
Problem für mich gelöst.
quelle
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.quelle
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.
quelle
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> ().
quelle
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.quelle
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:
}}
quelle
In meinem Fall hatte meine Klasse das
[Serializable]
Attribut.Sie benötigen einen Konstruktor, der keine Parameter akzeptiert, wenn Ihre Klasse ist
[Serializable]
quelle
Dieser Fehler begann für mich, als ich eine neue Methode zum Instanziieren einer Klasse hinzufügte.
Beispiel:
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.
quelle
Ich hatte
DropDownList
meinem 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:Da das Modell das Feld nur zur Anzeige enthielt, verursachte dies auch den
No parameterless constructor defined for this object
Fehler, da das Feld überhaupt nicht gesendet wurde.In diesem Fall habe ich das Problem behoben, indem ich eine Ausschlussbindung hinzugefügt habe:
quelle
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:
Werke:
quelle
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.
quelle
Ich hatte das gleiche Problem.
Nur
HttpFileCollectionBase files
aus dem Post Action-Methodenargument entfernt und wieHttpFileCollectionBase files = Request.Files;
im Methodenkörper hinzugefügt .quelle
Ich habe dem Modell im DOMAIN-Ordner einen parameterlosen Konstruktor hinzugefügt, und das Problem ist gelöst.
quelle
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
quelle