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.
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.
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.
ModelBindingContext "kennt" den Typ des Modells, das übergeben wird, weil Sie entweder:
müssenBeispiel 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%Abfrage der ModelBindingContext.ModelType entspricht Ihrem Modell z.
%Vor%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
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.
Tags und Links asp.net-mvc modelbinders custom-model-binder