Question

Je veux une liste des différents (dérivés) types d'objets de travail avec le défaut ModelBinder dans Asp.net MVC 2.

Je le ViewModel suivant:

public class ItemFormModel
    {       
        [Required(ErrorMessage = "Required Field")] 
        public string Name { get; set; }
        public string Description { get; set; }

        [ScaffoldColumn(true)]
        //public List<Core.Object> Objects { get; set; }       
        public ArrayList Objects { get; set; }                  
    }

Et la liste contient des objets de types dérivés de diffent, par exemple.

public class TextObject : Core.Object
    {
        public string Text { get; set; }
    }

    public class BoolObject : Core.Object
    {
        public bool Value { get; set; }
    }

Peu importe si j'utilise la liste ou la mise en œuvre de ArrayList, tout get échafaudés bien dans la forme, mais le ModelBinder ne résout pas les propriétés de type objet dérivé pour moi lors de la publication de retour à la ActionResult.

Qu'est-ce que pourrait être une bonne solution pour la structure viewmodel pour obtenir une liste des différents types d'objets manipulés? Avoir une liste supplémentaire pour chaque type d'objet (par exemple, Liste, Liste etc.) semble ne pas être une bonne solution pour moi, car il y a beaucoup de frais généraux à la fois dans la construction de la viewmodel et la cartographie de nouveau au modèle de domaine.

En pensant à l'autre approche de lier toutes les propriétés dans un liant modèle personnalisé, comment puis-je faire utiliser les annotations données approche ici (validation des attributs requis, etc.) sans beaucoup de frais généraux?

Était-ce utile?

La solution

Consultez la Dérivées type ModelBinder MvcContrib. Cela vous permet de modelbind de types dérivés à travers le processus de « typestamping » - qui est géré automatiquement pour vous lorsque vous utilisez l'assistant RenderTypedPartial (...). état de liaison partials maintiennent MvcContrib à travers les préfixes afin partials Nom / Id sont correctement entretenus sur un objet graphique profond. Si vous utilisez d'autres mécanismes comme modèles, vous devrez gérer vous-même typestamping. Ceci est expliqué dans la page de documentation.

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

Le modèle de liaison permet également de résoudre ce problème d'une manière qui ne gêne pas l'annotation de données / validation des attributs. Ils travailleront comme vous les attendez dans tout autre scénario.

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