ASP.Net MVC ModelBindingContext-Klasse - wie werden die Modellwerte aufgefüllt?

8

Ich kratze mich ein bisschen daran, wie Model-Ordner in ASP.Net MVC arbeiten.

Um genauer zu sein, die BindModel () -Methode hat einen ModelBindingContext-Parameter, der den Modellnamen und -typ enthält, aber ich verstehe nicht, wie der ModelBindingContext diese Werte empfängt.

Ein MVC-Modell muss aus veröffentlichten Formularwerten oder Abfragezeichenfolgenparametern oder anderen Datenquellen ausgefüllt werden. Aber welcher Mechanismus bestimmt den Modelltyp, der dem ModelBindingContext übergeben wird, und wie wird ein Modelltyp gegenüber einem anderen Modelltyp gewählt, sogar gegenüber einer einfachen Liste, die die einzelnen gebuchten Werte enthält?

Es scheint mir nur, dass der ModelBindingContext den Typ des Modells, das übergeben wird, "weiß", und ich bin mir nicht sicher, woher das kommt oder welchen Workflow es benötigt.

    
larryq 19.08.2010, 16:06
quelle

3 Antworten

12

Interessante Frage. Hier ist ein einfacher Überblick über das, was MVC tut. Es wird alles von der ControllerActionInovker-Klasse behandelt. Dies ist nicht in einer bestimmten Reihenfolge, aber ist nahe.

  1. ControllerActionInovker bestimmt den Parametertyp durch Reflektion.
  2. Die nächsten ValueProvider werden aus den Eigenschaften HttpContext Request Form, Route, QueryString usw. erstellt. Sie können auch eigene Value Provider bereitstellen.
  3. Diese ValueProvider werden einem ModelBindingContext über eine Sammlung bereitgestellt, die als virtueller ValueProvider fungiert.
  4. Dann sucht ControllerActionInovker nach einem ModelBinder für den bestimmten Typ. Wenn es keinen findet, wird standardmäßig der eingebaute DefaultModelBinder verwendet.
  5. In den meisten Fällen wird der DefaultModelBinder verwendet. Es ist Aufgabe, ein Modell zu erstellen und die ValueProvider zu verwenden, um die Eigenschaften mit Werten unter Verwendung der Modelleigenschaftsnamen als Schlüssel zu verbinden. Wenn die ValueProvider einen Wert haben, geben sie ein ValueProviderResult-Objekt zurück, das für die Typkonvertierung verantwortlich ist.

Sie können dies selbst in der ASP.net MVC-Quelle unter decodeplaces.com sehen. Suchen Sie nach der ControllerActionInvoker-Klasse und der GetParameterValue-Methode.

    
Lynn Eriksen 22.08.2010, 10:50
quelle
3

ModelBindingContext "kennt" den Typ des Modells, das übergeben wird, weil Sie entweder:

müssen
  • Fügen Sie Ihrem Modell ein ModelBinder-Attribut hinzu
  • Registrieren Sie den ModelBinder mit Ihrem Modell, indem Sie die ModelBinders.Binders.Add () -Methode verwenden.

Beispiel für das ModelBinder-Attribut:

%Vor%

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

%Vor%

Wenn Sie Ihren ModelBinder registriert und die BindModel-Methode implementiert haben:

%Vor%
  1. Abfrage der ModelBindingContext.ModelType entspricht Ihrem Modell z.

    %Vor%
  2. Rehydrieren Sie Ihr Modell aus der ModelBindingContext.ValueProvider-Eigenschaft, um ValueProviderResult-Instanzen abzurufen, die die Daten aus Formularposts, Routendaten und der Abfragezeichenfolge darstellen, z. B.

    %Vor%

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

    
Clive Seebregts 19.08.2010 19:34
quelle
1

Ich sehe es so, dass ControllerActionInvoker reflection verwendet, um den Parameter type zu erhalten. Dann prüft er, ob ein ModelBinder für diesen Typ zuständig ist, und instanziiert diesen ModelBinder und übergibt ihm den BindingContext, der das (model Objekt, Modellname, Modelltyp, Eigenschaftsfilter) für dieses Parametertyp-Objekt und eine Value-Provider-Sammlung (ModelBindingContext.ValueProvider) aller anderen Wertanbieter (Formular, Query-String usw.), die als ein großer virtueller Wertanbieter agieren.

Der ModelBinder verwendet dann reflection, um alle Eigenschaftsnamen für den zugewiesenen Typ zu binden. Er führt rekursiv selbst gegen alle Wertanbieter in (ModelBindingContext.ValueProvider) und sucht nach den Eigenschaftsnamen in diesen Wertanbietern, die diese Werte binden für die die Namen (vom Client übernommen) mit den Typeigenschaftsnamen übereinstimmen, wenn sie mit dem Wertprovider übereinstimmen, wird ein ValueProviderResult-Objekt zurückgegeben, das den Namen und den Wert für die jeweilige Eigenschaft im Modell enthält.

    
LaserBeak 14.06.2011 13:09
quelle