Question

Je me gratter la tête un peu comment classeurs modèles font leur travail dans ASP.Net MVC.

Pour être précis, la méthode bindModel () a un paramètre ModelBindingContext qui détient le nom du modèle et le type, mais je ne comprends pas comment le ModelBindingContext reçoit ces valeurs.

Un modèle MVC doit être rempli à partir des valeurs de formulaire affichées ou des paramètres de chaîne de requête, ou d'autres sources de données. Mais quel mécanisme détermine le type de modèle remis au ModelBindingContext, et comment est un type de modèle choisi sur un autre type de modèle, plus même (disons) une simple liste contenant les valeurs individuelles affiché?

Il semble juste pour moi le ModelBindingContext « connaît » le type de modèle, il est d'être remis, et je ne sais pas où que vient de ou le flux de travail impliqués dans la peuplant.

Était-ce utile?

La solution

Question intéressante. Voici un aperçu simple de ce qui fait MVC. Tout cela est géré par la classe ControllerActionInovker. Ce n'est pas ordre spécifique, mais est proche.

  1. ControllerActionInovker détermine le type de paramètre par réflexion.
  2. Suivant ValueProviders créés à partir du formulaire de demande HttpContext, Route, QueryString, etc. propriétés. Vous pouvez également fournir vos propres fournisseurs de valeur.
  3. Ces ValueProviders sont fournis à un ModelBindingContext via une collection qui agit comme un ValueProvider virtuel.
  4. Alors ControllerActionInovker cherche un ModelBinder pour le type spécifique. Si elle ne trouve pas sa valeur par défaut intégré dans DefaultModelBinder.
  5. Dans la plupart des cas, le DefaultModelBinder est utilisé. Il est son emploi pour créer un modèle et utiliser les ValueProviders pour relier les propriétés des valeurs en utilisant les propriétés du modèle noms comme clé. Lorsque les ValueProviders ont une valeur, ils retournent un objet ValueProviderResult qui est responsable de la conversion de type.

Vous pouvez voir par vous-même dans le source de ASP.net MVC situé à codeplex.com . Rechercher la classe ControllerActionInvoker et la méthode GetParameterValue.

Autres conseils

Le ModelBindingContext "connaît" le type de modèle, il est d'être remis parce que vous devez soit:

  • Ajoutez un attribut ModelBinder à votre modèle
  • Enregistrer le ModelBinder avec votre modèle en utilisant la méthode ModelBinders.Binders.Add ().

Exemple d'attribut ModelBinder:

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

Exemple de ModelBinders.Binders.Add ():

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

Si vous avez enregistré votre ModelBinder et ont mis en œuvre la méthode bindModel:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ... }
  1. Requête la ModelBindingContext.ModelType est égale à votre modèle par exemple

    if (bindingContext.ModelType == typeof(Contact)) { ... }
    
  2. Réhydrater votre modèle de la propriété ModelBindingContext.ValueProvider pour récupérer les instances ValueProviderResult qui représentent les données des postes de formulaire, les données d'itinéraire, et la chaîne de requête par exemple.

    bindingContext.ValueProvider["Name"].AttemptedValue;
    

Les livres suivants ont été utilisés ASP.NET MVC 2 en action ASP.NET MVC 1.0 rapidement

La façon dont je le vois est que ControllerActionInvoker utilise la réflexion pour obtenir le type de paramètre, il vérifie ensuite le cas échéant ModelBinder est attribué à traiter ce type, le cas échéant, il instancie cette ModelBinder et transmet la BindingContext qui contiendra le (modèle objet, le nom du modèle, le type de modèle, filtre propriété) pour cet objet de type de paramètre et une collection de fournisseur de valeur (ModelBindingContext.ValueProvider) de tous les autres fournisseurs de valeur (formulaire, chaîne de requête, etc.), agissant comme un grand fournisseur de valeur virtuelle.

Le ModelBinder alors lui-même utilise la réflexion pour obtenir tous les noms de propriétés du type lui a été attribué à se lier et se dirige récursive contre tous les fournisseurs de valeur dans (ModelBindingContext.ValueProvider) et recherche les noms de propriété de ces fournisseurs de valeur, liant ces valeurs pour lesquels les noms (pris du client) correspondent aux noms de propriétés de type, lorsqu'ils correspondent aux déclarations de fournisseur de valeur un objet ValueProviderResult, portant le nom et la valeur de la propriété respective sur le modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top