8
votes

ASP.NET MVC ModelBindingContext Classe-- Comment ses valeurs de modèle sont-elles peuplées?

Je gratte un peu la tête à la manière dont les liants de modèle font leur travail dans ASP.NET MVC.

Pour être spécifique, la méthode BinModel () comporte un paramètre ModelBindingContext qui contient le nom de modèle et le type, mais je ne comprends pas comment le modèleBindingContext reçoit ces valeurs.

Un modèle MVC doit être rempli à partir de valeurs de formulaire posté ou de 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 confié au modèleBindingContext et comment est-ce que l'un type de modèle choisi par un autre type de modèle, plus de (dire) une liste simple contenant les valeurs postées individuelles?

Il me semble juste que le modèleBindingContext "sait" le type de modèle à la main, et je ne suis pas sûr de l'origine ou du flux de travail impliqué dans la population.


1 commentaires

Jeez, désolé, j'ai marqué de fermer sur la mauvaise question


3 Réponses :


3
votes

Le modèleBindingContext "sait" le type de modèle à remettre parce que vous devez soit: strong>

  • Ajoutez un attribut ModelBinder à votre modèle LI>
  • Enregistrez le modèle ModelBinder avec votre modèle à l'aide de la méthode ModelBinders.Binders.add (). LI> ul>

    Exemple d'attribut ModelBinder: strong> p> xxx pré>

    Exemple de modelbinders.binders.add (): Fort > p> xxx pré>

    Si vous avez enregistré votre modèleBinder et avez implémenté la méthode Bindmodel: strong> p>

    bindingContext.ValueProvider["Name"].AttemptedValue;
    


1 commentaires

Merci. Je suis toujours confus sur quel code prend et lit les informations de formulaire posté, décide que c'est un contact, puis le transmet à l'objet ModelBindingContext dans la classe ContactBuenter.



14
votes

question intéressante. Voici un simple aperçu de ce que MVC fait. Tout est géré par la classe de contrôlageInovker. Ce n'est pas dans une commande spécifique, mais est proche.

  1. ControllerAckerInovker détermine le type de paramètre via une réflexion.
  2. Les projets de valeurs suivants sont créés à partir du formulaire de demande HTTPContext, de la route, de la requête, etc. Propriétés. Vous pouvez également fournir vos propres fournisseurs de valeur.
  3. Ces produits de valeurs sont fournis à un modèleBindingContext via une collection qui agit comme une valeur VirtualProvider.
  4. puis contrôleurAcker recherche un modèle modèle pour le type spécifique. S'il n'en trouve pas une valeur par défaut de la valeur par défaut intégréeModelbinder.
  5. Dans la plupart des cas, le paramètre de défaut est utilisé. Son travail est de créer un modèle et d'utiliser les produits de valeurs pour connecter les propriétés avec des valeurs à l'aide des noms de propriétés du modèle comme une clé. Lorsque les véhicules de valeur ont une valeur, ils renvoient un objet ValueProviderResult responsable de la conversion de type.

    Vous pouvez le voir pour vous-même dans le source ASP.NET MVC situé à CodePlex.com . Recherchez la classe ControllerActionInvoker et la méthode GetParameTervalue.


0 commentaires

1
votes

La façon dont je vois que le contrôleurInvoker utilise la réflexion pour obtenir le type de paramètre, il vérifie ensuite si un modèle de modèle est affecté à ce type, le cas échéant, il instanciait de ce modèle et la transmet le reliantContext qui contiendra le (modèle Objet, Nom du modèle, Type de modèle, Filtre de propriétés) Pour cet objet de type de paramètre et une collection de fournisseurs de valeur (ModelBindingContext.valueProvider) de tous les autres fournisseurs de valeurs (formulaire, chaîne de requête, etc.), agissant comme un grand fournisseur de valeur virtuelle.

Le modèle ModelBinder utilise alors une réflexion pour obtenir tous les noms de propriété du type SSE attribué pour se lier et s'exécute de manière récursive contre tous les fournisseurs de valeur dans (ModelBindingContext.valueprovider) et recherchent les noms de propriété dans ces fournisseurs de valeur, liant ces valeurs Pour qui les noms (extraits du client) correspondent aux noms de propriété Type, lorsqu'ils correspondent au fournisseur de valeur renvoie un objet ValueProviderResult, portant le nom et la valeur de la propriété respective sur le modèle.


0 commentaires