Domanda

sto graffiare la mia testa un po 'a come modello leganti fanno il loro lavoro in ASP.Net MVC.

Per essere precisi, il metodo BindModel () ha un parametro ModelBindingContext che contiene il nome del modello e tipo, ma non capisco come il ModelBindingContext riceve questi valori.

Un modello MVC deve essere popolato da valori iscritti modulo o parametri di stringa di query, o altre fonti di dati. Ma quale meccanismo determina il tipo di modello consegnato alla ModelBindingContext, e quanto è un tipo di modello scelto rispetto ad un altro tipo di modello, oltre anche (ad esempio) un elenco semplice contenente i singoli valori iscritti?

Sembra solo a me la ModelBindingContext "conosce" il tipo di modello è in fase di consegna, e non sono sicuro dove questo è provenienti o il flusso di lavoro coinvolti in popolato.

È stato utile?

Soluzione

Domanda interessante. Ecco una panoramica semplice di quello che fa MVC. E 'tutto gestito dalla classe ControllerActionInovker. Questo non è in ordine specifico, ma è vicino.

  1. ControllerActionInovker determina il tipo di parametro tramite riflessione.
  2. Avanti ValueProviders sono creati dal HttpContext Form, Route, QueryString, Richiesta ecc proprietà. È inoltre possibile fornire il proprio provider di valore.
  3. Queste ValueProviders vengono forniti ad un ModelBindingContext tramite una collezione che funge ValueProvider virtuale.
  4. Poi ControllerActionInovker cerca un ModelBinder per il tipo specifico. Se non trova un valore predefinito è il costruito nel DefaultModelBinder.
  5. Nella maggior parte dei casi la DefaultModelBinder viene utilizzato. E 'compito è quello di creare un modello, e utilizzare le ValueProviders per collegare le proprietà con i valori utilizzando i nomi proprietà modello come chiave. Quando i ValueProviders hanno un valore, che restituisce un oggetto ValueProviderResult che è responsabile per la conversione.

Si può vedere questo per te nel fonte ASP.net MVC situato a codeplex.com . Cercare la classe ControllerActionInvoker e il metodo GetParameterValue.

Altri suggerimenti

Il ModelBindingContext "conosce" il tipo di modello è in fase di consegna, perché si deve uno:

  • Aggiungi un attributo ModelBinder al modello
  • Registrare il ModelBinder con il tuo modello utilizzando il metodo ModelBinders.Binders.Add ().

Esempio dell'attributo ModelBinder:

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

Esempio di ModelBinders.Binders.Add ():

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

Se hai registrato il tuo ModelBinder e hanno attuato il metodo BindModel:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ... }
  1. query il ModelBindingContext.ModelType è uguale al tuo modello per esempio

    if (bindingContext.ModelType == typeof(Contact)) { ... }
    
  2. reidratare il modello dalla proprietà ModelBindingContext.ValueProvider per recuperare le istanze ValueProviderResult che rappresentano i dati dai messaggi dei moduli, dati di percorso, e la stringa di query per es.

    bindingContext.ValueProvider["Name"].AttemptedValue;
    

I seguenti libri sono stati utilizzati ASP.NET MVC 2 in azione e ASP.NET MVC 1.0 rapidamente

Il mio modo di vedere è che ControllerActionInvoker utilizza la riflessione per ottenere il tipo di parametro, poi controlla se qualsiasi ModelBinder è assegnato a che fare con questo tipo, se così è un'istanza di questa ModelBinder e lo passa BindingContext che conterrà il (modello oggetto, il nome del modello, tipo di modello, filtro di proprietà) per quell'oggetto tipo di parametro e una collezione fornitore di valore (ModelBindingContext.ValueProvider) di tutti gli altri fornitori di valore (Form, Query String ecc), in qualità di un grande fornitore di valore virtuale.

Il ModelBinder poi si utilizza la reflection per ottenere tutti i nomi di proprietà per il tipo la sua assegnato a legare e si gestisce in modo ricorsivo contro tutti i fornitori di valore a (ModelBindingContext.ValueProvider) e cerca i nomi di proprietà in quei fornitori di valore, vincolante quei valori per i quali i nomi (presi dal cliente) corrispondono ai nomi di proprietà del tipo, quando corrispondono i rendimenti fornitore di valore di un oggetto ValueProviderResult, che porta il nome e il valore per la rispettiva proprietà sul modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top