Esta pregunta ha sido asked before en versiones anteriores de MVC. También hay this blog entry sobre una forma de evitar el problema. Me pregunto si MVC3 ha introducido algo que podría ayudar, o si hay otras opciones.Enlace de modelo polimórfico
En pocas palabras. Aquí está la situación. Tengo un modelo base abstracto y 2 subclases concretas. Tengo una vista fuertemente tipada que muestra los modelos con EditorForModel()
. Luego tengo plantillas personalizadas para representar cada tipo concreto.
El problema viene en el tiempo del mensaje. Si hago que el método de acción posterior tome la clase base como parámetro, entonces MVC no puede crear una versión abstracta de la misma (que de todos modos no desearía, me gustaría que cree el tipo concreto actual). Si creo varios métodos de acción posterior que varían solo por la firma del parámetro, entonces MVC se queja de que es ambiguo.
Por lo que puedo decir, tengo algunas opciones sobre cómo resolver este problema. No me gusta ninguno de ellos por diversas razones, pero voy a enumerarlos aquí:
- Crear una carpeta de modelo personalizado como Darin sugiere en el primer post he vinculado.
- Cree un atributo discriminador como sugiere la segunda publicación a la que me he vinculado.
- Publicar en diferentes métodos de acción según el tipo
- ???
No me gusta 1, porque es básicamente la configuración que está oculta. Algún otro desarrollador que trabaje en el código puede no saberlo y perder mucho tiempo tratando de descubrir por qué las cosas se rompen cuando cambia las cosas.
No me gusta 2, porque parece un poco hacky. Pero, me estoy inclinando por este enfoque.
No me gusta 3, porque eso significa violar DRY.
¿Alguna otra sugerencia?
Editar:
decidí ir con el método de Darin, pero hice un pequeño cambio. He añadido esto a mi modelo abstracto:
[HiddenInput(DisplayValue = false)]
public string ConcreteModelType { get { return this.GetType().ToString(); }}
A continuación, una oculta automáticamente se genera en mi DisplayForModel()
. Lo único que debe recordar es que si no está usando DisplayForModel()
, tendrá que agregarlo usted mismo.
Hmm .. Eso definitivamente mejora la capacidad de mantenimiento. Y funcionaría donde sus modelos concretos no difieran por las firmas de la propiedad (una falla en el método Atributo). Sin embargo, no estoy seguro si me gusta contaminar mi punto de vista con este tipo de discriminadores. –
Elegí tu solución, pero hice un pequeño cambio. Ver mi edición –
Descubrí una solución diferente también, (ver mi respuesta) que resulta mucho más simple y un poco más segura ya que no implica exponer el tipo de datos al cliente, y espero que no haya sido enredado con un hacker. –