Frage

Ich bin Kratzen meinem Kopf ein wenig an, wie Modell Binder ihre Arbeit in ASP.Net MVC.

Um spezifisch zu sein, die BindModel () -Methode hat einen ModelBindingContext Parameter, der den Modellnamen und die Art hält, aber ich verstehe nicht, wie die ModelBindingContext diese Werte erhält.

Ein MVC-Modell hat aus gebuchten Formularwerten oder Query-String-Parametern oder anderen Datenquellen gefüllt werden. Aber was Mechanismus bestimmt die Art Modell zum ModelBindingContext geben, und wie ist ein Modelltyp über einen anderen Modelltyp gewählt, über selbst (sagen wir) eine einfache Liste der einzelnen Gebuchte Werte enthalten?

Es scheint mir nur die ModelBindingContext „weiß“ die Art des Modells ist es geben wird, und ich bin nicht sicher, wo das ist, das von einer oder der Workflow in bevölkern sie beteiligt sind.

War es hilfreich?

Lösung

Interessante Frage. Hier ist eine einfache Übersicht, was MVC tut. Es ist alles von der ControllerActionInovker Klasse behandelt. Dies ist nicht in einer bestimmten Reihenfolge, aber in der Nähe.

  1. ControllerActionInovker bestimmt den Parametertyp über Reflexion.
  2. Weiter ValueProviders von dem Httpcontext Anfrageformular, Route, Abfrage-Zeichenfolge, usw. Eigenschaften erstellt. Sie können auch Ihren eigenen Wert-Provider bieten.
  3. Diese ValueProviders zu einem ModelBindingContext über eine Sammlung geliefert, die als virtuelle Valueprovider wirkt.
  4. Dann sieht ControllerActionInovker für einen Modelbinder für die spezifische Art. Wenn es nicht findet man es standardmäßig auf den eingebauten Default.
  5. In den meisten Fällen ist die Default verwendet wird. Es hat die Aufgabe, ein Modell zu erstellen, und die ValueProviders verwenden, um die Eigenschaften zu verbinden mit Werten, die Modell-Eigenschaften Namen als Schlüssel. Wenn die ValueProviders einen Wert haben, kehren sie ein ValueProviderResult Objekt, das für die Typumwandlung zuständig ist.

Sie können diese sehen Sie selbst in der Quelle ASP.net MVC liegt bei codeplex.com . Suchen Sie nach der ControllerActionInvoker Klasse und der GetParameterValue Methode.

Andere Tipps

Die ModelBindingContext "weiß" die Art des Modells es geben hat, weil Sie müssen entweder:

  • Fügen Sie ein Attribut Modelbinder zu Ihrem Modell
  • Register der Modelbinder mit Ihrem Modell der ModelBinders.Binders.Add () Methode verwendet wird.

Beispiel Modelbinder Attribut:

[ModelBinder(typeof(ContactBinder))]
public class Contact { ... }

Beispiel für ModelBinders.Binders.Add ():

void Application_Start()
{
  ModelBinders.Binders[typeof(Contact)] = new ContactBinder();
}

Wenn Sie Ihre Modelbinder registriert und haben die BindModel Methode implementiert:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ... }
  1. Abfrage der ModelBindingContext.ModelType gleich Ihr Modell z.B.

    if (bindingContext.ModelType == typeof(Contact)) { ... }
    
  2. Rehydrate Ihr Modell aus der ModelBindingContext.ValueProvider Eigenschaft ValueProviderResult Instanzen abzurufen, die die Daten aus FORMULARPLZ, Routendaten und die Query-String z darstellen.

    bindingContext.ValueProvider["Name"].AttemptedValue;
    

Die folgenden Bücher wurden verwendet, ASP.NET MVC 2 in Aktion und ASP.NET MVC 1.0 schnell

So wie ich es sehe, ist, dass ControllerActionInvoker Reflexion verwendet den Parameter-Typen zu erhalten, es prüft dann, wenn ein Modelbinder zugeordnet mit dieser Art zu behandeln, wenn so es diesen Modelbinder instanziiert und übergibt ihn den Binding, die das (Modell enthalten Objekt, Modellname, Modelltyp, Eigenschaftsfilter) für diesen Parameter Typ Objekt und einem Wert Anbieter Sammlung (ModelBindingContext.ValueProvider) aller anderen Wert Provider (Form, Query String etc.), als ein großer virtueller Wert Anbieter handeln.

Die Modelbinder dann selbst verwendet Reflektion alle Eigenschaftsnamen zu bekommen für die Art seiner zu binden zugeordnet und läuft selbst rekursiv gegen alle Wert-Anbieter in (ModelBindingContext.ValueProvider) und sucht nach den Eigenschaftsnamen in diesen Wert Provider, verbindlich diese Werte für die die Namen (vom Client genommen), um die Art Eigenschaftsnamen übereinstimmen, wenn sie den Wert Anbieter liefert ein ValueProviderResult Objekt übereinstimmen, den Namen und den Wert für das jeweilige Objekt auf dem Modell trägt.

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