Frage

Ich arbeite an einem ASP.NET MVC2 App. Ich bin gekommen, ein sehr überraschend, doch erstaunlich, was zu erkennen, dass MVC mit den Kulissen tut hinter mit dem Model und Modell zu tun zu binden. Ich habe ein Ansichtsmodell, das eine ganze Reihe von Daten hat - einige Felder Teil einer Form vorliegt, während andere einfach Teil der UI sind. Auf Httppost nutzt meine Aktion Methode, um die Default die Versuche, das gesamte Modell zu binden, sondern nur die Felder, die Teil der Form waren erfolgreich deserialisiert - alle anderen bleiben null. Das ist in Ordnung und verständlich. Wenn die Modelstate ungültig ist, muß ich Refresh das Modell aus der db und bind diese speziellen Formularfelder, bevor auf die gleiche Bearbeitungsansicht zurückkehren jene zugehörigen Modelvalidierungsfehler anzuzeigen.

Hier ist, wo mein Erstaunen und Neugier kommen. Es war meine Annahme, dass für mich, um zu bind die Formularfelder mit dem aufgefrischten Modell, mußte ich einen Anruf an beide UpdateModel() oder TryUpdateModel<>() machen, in dem neu aufgefrischt Modell vorbei. 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, was ich fand, war, dass, wenn ich einfach refreshedModel auf die Ansicht zurück, ohne einen Anruf zu TryUpdateModel<>() zu machen, das aufgefrischten Modell automatisch mit den Formularfeldwerten geschrieben gebunden !! Daher wird der TryUpdateModel<>() hier nicht benötigt!

Die einzige Art, wie ich keinen Sinn daraus machen kann, ist, dass, da das Model in einem ungültigen Zustand ist, sobald ich die Ansicht mit dem aufgefrischten Modell zurück, das „MVC-Rendering-Engine“ durchgeschleift die Model Fehler und diese Eigenschaftswert gebunden mit meinem aufgefrischt Modell. Das ist einfach super! Aber, ich will Beweise für diese Annahme. Ich kann keine Dokumentation zu diesem überall im Web finden. Kann jemand entweder bestätigen mir meine Hypothese WARUM / HOW dieses ehrfürchtige Autobindungsverhalten ist auftreten und / oder erziehen, warum / wie es passiert, hoffentlich mit einigen Online-Dokumentation Links gesichert, damit ich mehr verstehen, was auf unter die Decke gehen wird?

War es hilfreich?

Lösung

public ActionResult EditDetail(EditDetailItemModel model)

wird Diese Linie durchführt Modell verbindlich. Denken Sie an ActionMethod Parameter wie immer durch einen Aufruf von Update bevölkert wird.

Sie sind nicht refreshedModel Werte in der Ansicht zu sehen, Sie sehen die Model Einträge und Werte von EditDetailItemModel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top