MVC Custom-ViewModel und die automatische Bindung
Habe ich eine benutzerdefinierte ViewModel definiert als :
public class SampleFormViewModel
{
public SampleFormViewModel(SelectList companies, Widget widget)
{
Companies = companies;
Widget = widget;
}
public SelectList Companies { get; private set; }
public Widget Widget { get; private set; }
}
In mein Edit-POST-handler habe ich den folgenden Eintrag:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(SampleFormViewModel model)
{
Edit-Formular eingerichtet ist:
Inherits="System.Web.Mvc.ViewPage<Sample.Web.Models.SampleFormViewModel>"
Ist und es nur in die Luft sprengt, nicht sicher, was Los ist, hat die folgende Fehlermeldung:
Keine parameterlosen Konstruktor für dieses Objekt definiert.
Sicher, ich bin etwas fehlt wirklich hier offensichtlich. Einige Hintergrundinformationen, die BEKOMMEN, funktioniert tadellos und zeigt die dropdown aus der Auswahlliste, wie erwartet.
Ich vermute, der auto-Bindung zurück, um die benutzerdefinierte Ansicht-Modell ist, was fehlschlägt, aber nicht sicher, was zu tun ist.
- Was bedeutet die form, die Sie veröffentlichen Aussehen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie einen parameterlosen Konstruktor, und ich glaube, dass die Eigenschaften haben müssen, die öffentlichen setter. Die Standard-Bindemittel erstellt das Objekt mit einem Konstruktor, der keine Parameter hat, dann setzt Reflexion auf die öffentlichen Eigenschaften, um Werte aus dem Formular/query-Parametern.
Ich vermute aber, dass das, was Sie wirklich wollen, zu tun ist nicht die Ansicht Modell, aber das zugrunde liegende Modell Widget und wählen Sie in der Liste Wert auf Formular veröffentlichen. Ich glaube nicht, dass der binder wird in der Lage sein, zu rekonstruieren, eine Auswahlliste auf der post, da es nur den ausgewählten Wert in die Parameter.
MVC, benötigt, auf stark typisierte sichten, die der Ansicht erstellen können, die die Klasse verwendet, auf diese Ansicht. Dies bedeutet, dass ein Konstruktor ohne Parameter. Und das macht Sinn. Leute neue MVC-sehen ähnlich wie "hä?" Fragen, wenn Sie vergessen/versäumen, die Parameter, die öffentlichkeit und alle zugehörigen Fehler-popup, wenn der Blick versucht, setzen sich zusammen aus (im Gegensatz zu einem compiler-Fehler).
Aber was ist "interessant" in dieser Klasse der parameterlose Konstruktor Probleme, wenn Sie eine Eigenschaft der Klasse ist auch NICHT über einen parameterlosen Konstruktor. Ich denke, das ist die pessimistische Herangehensweise?
Verbracht und einige Zeit lernen über die SelectList-Klasse - eine spezifische Klasse von MVC - ich wollte hoffentlich helfen, einige Leute sparen ein paar Minuten/Stunden.
Dieses wirklich wichtige tool/Klasse für dropdown-Listen-Erstellung, hat die folgenden Konstruktoren:
öffentlichen SelectList(IEnumerable-Objekte);
öffentliche SelectList(IEnumerable-Objekte, object selectedValue);
öffentliche SelectList(IEnumerable-Objekte, die string-dataValueField, string dataTextField);
öffentliche SelectList(IEnumerable-Objekte, die string-dataValueField, string dataTextField, object selectedValue);
..und daher, wenn diese Eigenschaften in Ihrer Klasse (bei der Ansicht), MVC geben Sie die schwer fassbare "Keine parameterlosen Konstruktor" Fehler.
ABER, wenn Sie so etwas wie eine helper-Klasse, cut-n-paste den genauen code von der ursprünglichen Klasse, und dann machen, dass die helper-Klasse einen parameter (NICHT über get/set) auf Ihre ursprünglichen Klasse; du bist gut zu gehen.
Und auf diese Weise können Sie eine einzige Ansicht für die gets und posts. Was ist schöner 🙂
Persönlich, hätte ich entweder erstellt der compiler zu erkennen, die Verbände und Anforderungen von stark typisierten Ansichten, oder lassen Sie das dropdown (oder anderen "Kunden" der SelectList) einfach nicht funktionieren, eher dann Wundern, wenn es eine bestimmte Stufe der rekursiven überprüfung auf paramerterless Konstruktoren.
Glücklicherweise ist die aktuelle version scheint nur auf oberster Ebene. Fühlt sich an wie ein hack und ich hoffe, es ist by design.
HTH.