Ich arbeite an einer ASP.NET MVC2-Anwendung. Ich bin gekommen, um eine sehr überraschende, aber erstaunliche Sache, die MVC hinter den Kulissen mit dem ModelState und Modellbindung zu tun zu erkennen. Ich habe ein ViewModel, das eine ganze Reihe von Daten hat - einige Felder sind Teil eines Formulars, während andere einfach Teil der Benutzeroberfläche sind. Auf HttpPost verwendet meine Action-Methode den DefaultModelBinder, der versucht, das gesamte Modell zu binden, aber nur Felder, die Teil des Formulars waren, werden erfolgreich deserialisiert - alle anderen bleiben null. Das ist in Ordnung und verständlich. Wenn der ModelState ungültig ist, muss ich aktualisieren das Modell aus der Datenbank und binden diese bestimmten Formularfelder, bevor sie in dieselbe Bearbeitungsansicht zurückkehren, um die zugehörigen ModelState-Validierungsfehler anzuzeigen.
Das ist der Punkt, an dem ich erstaunt und neugierig bin. Ich bin davon ausgegangen, dass ich, um binden die Formularfelder mit dem aktualisierten Modell zu füllen, musste ich entweder einen Aufruf an UpdateModel()
o TryUpdateModel<>()
und geht in das neu aufgefrischte Modell über. Zum Beispiel:
[HttpPost]
public ActionResult EditDetail(EditDetailItemModel model)
{
if (model.IsValid)
{
// Save the results to the db
return RedirectToAction(...)
}
// Can't simply "return View(model)". Not all fields in EditDetailItemModel
// were part of the form - thus they returned null. Have to refresh
// model from the db.
var refreshedModel = RefreshModelFromDB();
// Is this line necessary?????
TryUpdateModel<EditDetailItemModel>(refreshedModel);
return View(refreshedModel);
}
Aber ich habe festgestellt, dass ich, wenn ich einfach zurückkehre refreshedModel
in die Ansicht, OHNE einen Aufruf an TryUpdateModel<>()
, das aktualisierte Modell wurde automatisch mit den Werten der Formularfelder verbunden, die gebucht wurden !! Daher ist die TryUpdateModel<>()
ist hier nicht erforderlich!
Die einzige Möglichkeit, die ich mir vorstellen kann, ist, dass, da der ModelState in einem ungültigen Zustand ist, sobald ich die Ansicht mit dem aktualisierten Modell zurückgegeben habe, die "MVC-Rendering-Engine" die ModelState-Fehler in einer Schleife überprüft und diese Eigenschaftswerte mit meinem aktualisierten Modell verbunden hat. Das ist einfach GROSSARTIG! Aber ich möchte einen Beweis für diese Annahme. Ich kann nirgendwo im Web eine Dokumentation dazu finden. Kann jemand entweder meine Hypothese bestätigen, WARUM/WIE dieses großartige automatische Bindungsverhalten auftritt, und/oder mich darüber aufklären, warum/wie es geschieht, hoffentlich unterstützt durch einige Online-Dokumentationslinks, damit ich besser verstehe, was unter der Decke vor sich geht?