Cette question a été posée avant dans les versions antérieures de la MVC. Il y a aussi cette entrée de blog sur un moyen de contourner le problème. Je me demandais si MVC3 a introduit quelque chose qui pourrait aider, ou si il y a d'autres options.
Dans une coquille de noix. Voici la situation. J'ai un résumé modèle de base, et 2 sous-classes concrètes. J'ai fortement typé vue qui rend les modèles avec EditorForModel()
. Puis-je avoir des modèles personnalisés pour le rendu de chaque type de béton.
Le problème vient à la fois de la poste. Si je fais le post de la méthode d'action de prendre la classe de base comme le paramètre, puis MVC ne peut pas créer une version abstraite (ce qui je ne voudrais pas, de toute façon, j'avais envie de créer le véritable type de béton). Si je créer plusieurs post méthodes d'action qui ne varient que par le paramètre signature, puis MVC se plaint que c'est ambigu.
Donc autant que je peux dire, j'ai un peu de choix sur la façon de résoudre ce problème. Je n'aime pas l'un d'eux, pour diverses raisons, mais je vais en faire la liste ici:
- Créer un modèle personnalisé classeur en tant que Darin suggère dans le premier post, je lien.
- Créer un discriminateur attribut comme le deuxième post je l'ai lié à l'indique.
- Post de différentes méthodes d'action basé sur le type
- ???
Je n'aime pas le 1, parce que c'est fondamentalement la configuration de ce qui est caché. Certains autres développeurs à travailler sur le code ne peut pas savoir à ce sujet et de déchets beaucoup de temps à essayer de comprendre pourquoi les choses casser quand change les choses.
Je n'aime pas les 2, car il semble genre de hacky. Mais, je me suis penché vers cette approche.
Je n'aime pas le 3, parce que cela signifie que la violation SÈCHE.
Toutes les autres suggestions?
Edit:
J'ai décidé d'aller avec Darin méthode, mais fait un léger changement. J'ai ajouté à mon modèle abstrait:
[HiddenInput(DisplayValue = false)]
public string ConcreteModelType { get { return this.GetType().ToString(); }}
Alors un cachée est automatiquement généré dans mon DisplayForModel()
. La seule chose que vous avez à retenir est que si vous n'utilisez pas d' DisplayForModel()
, vous devez les ajouter vous-même.