2009-11-14 3 views
2

J'ai une hiérarchie de classes dérivant toutes d'un type de base et le type de base implémente également une interface. Ce que je veux faire est d'avoir un contrôleur pour gérer la gestion de toute la hiérarchie (puisque les actions exposées via le contrôleur sont identiques). Cela étant dit, je veux que les vues aient les champs spécifiques au type et que le classeur modèle se lie à une valeur de champ cachée. quelque chose comme:Utilisation générique des classeurs de modèle mvc asp.net

<input type="text" name="model.DerivedTypeSpecificField" /> 
<input type="hidden" name="modelType" value="MyDerivedType" /> 

Cela étant dit, les liants modèles semblent asp.net mvc exiger le type de béton qu'ils vont créer, à cause de cette raison, je aurais besoin de créer un contrôleur différent pour chaque type dérivé.

Est-ce que quelqu'un a déjà fait cela ou sait comment manipuler le modèle de liant pour qu'il se comporte ainsi? Je pourrais écrire mon propre modèle de classeur, mais je ne veux rien après le comportement de base du modèle de liaison des propriétés d'assignation et des tableaux de construction sur le type de cible.

Merci!

Répondre

3

Je ne sais pas si cela va fonctionner, mais vous pouvez essayer quelque chose comme:

public class MyBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.ModelType = System.Type.GetType(controllerContext.HttpContext.Request["modelType"]); 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

qui est juste simple changement de liant modèle de base.

+0

Je l'ai compris. Ma solution est presque identique à la vôtre, sauf que je récupère le modelType dans le tableau ValueProviders. Merci! –

2

Extraction du type dérivé ModelBinder dans MvcContrib. Cela vous permet de modéliser des types dérivés à l'aide du processus de 'typage de texte' - qui est géré automatiquement pour vous lorsque vous utilisez l'assistant RenderTypedPartial (...). Les partiels MvcContrib maintiennent l'état de liaison entre les partiels, de sorte que les préfixes Name/Id sont correctement conservés sur un graphe d'objets profonds. Si vous utilisez d'autres mécanismes tels que les modèles, vous devrez gérer vous-même le typage. Ceci est expliqué dans la page de documentation.

Pour revenir à vos questions et comment les types dérivés sont résolus avec ModelBinder, vous pouvez enregistrer les variations de types dérivés avec des attributs dans un mécanisme similaire au KnownTypeAttribute WCF ou vous pouvez faire l'enregistrement au démarrage. De toute façon, ces variations sont enregistrées une fois et conservées pour des considérations de performance.

Le classeur modèle résout également ce problème d'une manière qui n'interfère pas avec les attributs d'annotation/validation de données. Ils fonctionneront comme vous les attendez dans n'importe quel autre scénario.

Questions connexes