2010-07-18 15 views
1

J'ai regardé la plupart des exemples de ModelBinding mais je n'arrive pas à glaner ce que je recherche.Ajout de plusieurs préfixes à DefaultModelBinder MVC2

Je voudrais:

<%= Html.TextBox("User.FirstName") %> 
<%= Html.TextBox("User.LastName") %> 

pour se lier à cette méthode sur le post

public ActionResult Index(UserInputModel input) {} 

où UserInputModel est

public class UserInputModel { 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

La convention est d'utiliser les sans nom de classe " InputModel ", mais je ne voudrais pas avoir à spécifier à chaque fois avec le BindAttribute, à savoir:

public ActionResult Index([Bind(Prefix="User")]UserInputModel input) {} 

J'ai essayé de remplacer le DefaultModelBinder mais je n'arrive pas à trouver l'emplacement approprié pour injecter ce petit bout de fonctionnalité.

Répondre

1

Le BindAttribute peut être utilisé au niveau de la classe pour éviter de le dupliquer pour chaque instance du paramètre UserInputModel.

====== ====== EDIT

Il suffit de laisser tomber le préfixe de votre forme ou en utilisant le BindAttribute sur le modèle de vue serait l'option la plus facile, mais une alternative serait d'enregistrer un classeur de modèle personnalisé pour le type UserInputModel et recherchant explicitement le préfixe que vous voulez.

+0

C'est bon à savoir, et rend ma tâche plus facile à gérer. Bien que j'aimerais toujours savoir si cela peut être fait dans les coulisses dans le processus de liaison de modèle puisque l'attribut nécessite des valeurs constantes. –

+0

Peut-être que ma question initiale n'était pas claire. Je voudrais savoir comment dériver de DefaultModelBinder et ajouter ce contrôle de préfixe supplémentaire basé sur le type de modèle. –

1

La propriété ModelName dans l'objet ModelBindingContext transmise à la fonction BindModel est ce que vous voulez définir. Voici un modèle de liaison qui fait cela:

public class PrefixedModelBinder : DefaultModelBinder 
{ 
    public string ModelPrefix 
    { 
     get; 
     set; 
    } 

    public PrefixedModelBinder(string modelPrefix) 
    { 
     ModelPrefix = modelPrefix; 
    } 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.ModelName = ModelPrefix; 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

Inscrivez-vous dans votre Application_Start comme ceci:

ModelBinders.Binders.Add(typeof(MyType), new PrefixedModelBinder("Content")); 

Maintenant, vous ne pourrez plus avoir besoin d'ajouter le Bind attribut pour les types que vous spécifiez utilisent ce modèle de liaison !

+0

+1 pour l'inspiration, cela m'a aidé à résoudre un problème de longue durée – Odys