16

J'essaie de trouver quelques exemples de construction d'un classeur de modèle personnalisé pour un scénario de liaison unique que je dois gérer, mais tous les articles que j'ai trouvés étaient pour des versions plus anciennes de MVC qui sont n'est plus pertinent dans MVC2. J'ai référencé le code source de DefaultModelBinder pour essayer d'avoir une idée générale de ce que je dois faire, mais c'est plus compliqué que mon scénario et j'ai du mal à isoler la logique spécifique que j'ai besoin de mettre en œuvre.ASP.NET MVC2 - Exemples de liants de modèle personnalisé

Mon but est de prendre une collection de paires Checkbox/Textbox et pour toutes les paires Checked je voudrais créer une paire clé/valeur de la valeur Checkbox et la valeur de la Textbox associée. Après l'agrégation de ces données, je dois effectuer une sérialisation de chaîne sur la collection afin de pouvoir la stocker dans une propriété de chaîne du type Model souhaité. J'ai déjà les données envoyées à partir du formulaire dans un format gérable qui me permettra de relier une Checkbox donnée à une Textbox spécifique, c'est juste une question de trouver comment obtenir toutes les pièces où j'en ai besoin.

Est-ce que quelqu'un connaît des tutoriels à jour qui peuvent m'aider à construire un classeur de modèle personnalisé?

Répondre

12

Je ne sais pas pourquoi vous pensez que beaucoup de choses ont changé depuis MVC 1 en ce qui concerne les classeurs personnalisés. Mais si je comprends ce que vous essayez de faire, ce devrait être assez facile.

public class CustomModelBinder : DefaultModelBinder { 
    public override object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) { 

     NameValueCollection form = controllerContext.HttpContext.Request.Form; 
     //get what you need from the form collection 

     //creata your model 
     SomeModel myModel = new SomeMode(); 
     myModel.Property = "value"; 
     //or add some model errors if you need to 
     ModelStateDictionary mState = bindingContext.ModelState; 
     mState.Add("Property", new ModelState { }); 
     mState.AddModelError("Property", "There's an error."); 

     return myModel; //return your model 
    } 
} 

Et votre action:

public ActionResult Contact([ModelBinder(typeof(CustomModelBinder))]SomeModel m){ 
    //... 
} 

Était-ce le genre d'information que vous cherchez?

+2

Cette technique fonctionne totalement pour moi, mais j'avais l'impression que je devais utiliser le 'bindingContext.ValueProvider' plutôt que d'accéder directement au HttpContext (pour des raisons de testabilité). –

+0

@Nathan Taylor, je vois. Dans ce cas, la technique décrite ici peut vous aider à démarrer. http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx S. Hanselman fournit également un exemple ici sur la façon de tester le classeur: http://stackoverflow.com/questions/253574/how-to-test-custom -model-binders-in-asp-net-mvc/589250 # 589250 –

+0

En outre, si vous recherchez une liaison de modèle basée sur un type spécifique (ou générique), consultez le post ici: http://stackoverflow.com/questions/1487005/asp-net-mvc-modèle-lieur-pour-type-générique –

1

Jetez un oeil à plusieurs exemples de Custom MVC Model binders sur mon blog.

+1

Le site web est en panne et les exemples devraient être postés ici - pas un site externe. –

Questions connexes