viewmodels query net mvc example asp anotaciones asp.net-mvc asp.net-mvc-3 viewmodel

asp.net mvc - query - En MVC3, ¿debería tener modelos de "edición" separados frente a modelos de "pantalla"?



viewmodels asp net mvc (6)

Con MVC3, ¿debo diseñar mis modelos de vista de modo que haya uno que esté vinculado a la vista (DisplayModel), y uno que se envíe al controlador (EditModel)?

Para aclarar, no estoy preguntando sobre los modelos de datos frente a los modelos de vista. Sé que no es bueno vincular mis vistas / controladores a los modelos de datos / dominio.

Tampoco estoy preguntando acerca de compartir un modelo en dos vistas separadas, una vista que se usa para mostrar los datos y otra vista que se usa para editar los datos.

Más bien, estoy preguntando acerca de una vista que se usa para editar datos y el modelo que está vinculado a la vista en comparación con el modelo que está vinculado a la acción del controlador.

En otras palabras, si este es mi punto de vista:

@model MyApp.Models.CustomerModel

Si la acción de mi controlador se ve como:

public ActionResult Index(CustomerModel model)

O:

public ActionResult Index(CustomerEditModel model)

En un momento, estábamos haciendo lo segundo (por separado). Pero últimamente, hemos empezado a hacer lo anterior (compartido).

La razón de este cambio fue porque:

  1. Con la validación discreta de MVC3, si estoy usando Anotaciones de datos en mi modelo para la validación, esto es necesario en ambos modelos si están separados (en el modelo de pantalla para asignar la validación del lado del cliente y en el modelo de edición para la validación del lado del servidor) .

  2. A medida que nuestra aplicación maduraba, nos dimos cuenta de que nuestros modelos de visualización y edición eran idénticos en un 95%, con la excepción de las listas de selección que estaban en nuestros modelos de vista. Ahora los hemos movido a una clase compartida y ahora los estamos pasando a través de la vista.

Pero he visto algunas otras discusiones que apuntan a compartir modelos para la vista / controlador como una mala idea, y que viola la separación de preocupaciones.

¿Alguien me puede ayudar a entender las ventajas y desventajas de estos dos enfoques?


nos dimos cuenta de que nuestros modelos de visualización y edición eran idénticos en un 95%, con la excepción de las listas de selección que estaban en nuestros modelos de visualización. Ahora los hemos movido a una clase compartida y ahora los estamos pasando a través de la vista.

¿Son 95% idénticos en datos y operaciones o solo en datos? Recuerda que las clases encapsulan datos y comportamientos.

Si son similares en propiedades al 95% pero tienen operaciones totalmente diferentes, podría beneficiarse de dividirlas en dos clases. O puede que no :)

Como han señalado otros, no hay una respuesta única para todos y, en su caso, parece que una clase está bien ... pero si comienza a notar que el comportamiento de cada uno de ellos no está relacionado, no tenga miedo de replantearse te acercas


Creo que encontrará que es un éxito o un error, sin importar a dónde vaya, pero si puede tomar el camino de mantenimiento más fácil, entonces debería hacerlo. En mi experiencia, tener un solo modelo es mucho más fácil de mantener, obviamente, pero parece que siempre hay una decisión comercial que se toma que me obliga a dividir los modelos. Si estás en ese 95%, entonces creo que estás en muy buena forma. Su aplicación, desde una perspectiva de mantenibilidad relacionada con sus modelos, será fácil de mantener. Cuando llega un cambio, tienes un lugar para hacer ese cambio, en su mayor parte. El problema con el que siempre me encuentro es al escalar los cambios empresariales en múltiples modelos. Los problemas de copiar / pegar, o simplemente olvidarse de alguna propiedad en algún lugar, siempre me hacen daño debido al problema de varios modelos.


Estoy de acuerdo con la respuesta de rich.okelly de que no hay un enfoque correcto.

Sin embargo, hay un par de preocupaciones que tengo con el uso de un modelo.

Va a ser muy útil utilizar siempre un modelo sin tener propiedades innecesarias cuando la vista necesita mostrar una lista seleccionable de objetos. El modelo deberá tener la lista de objetos, así como una propiedad para aceptar el valor POSTed que el usuario elija. Estas propiedades innecesarias añaden una pequeña cantidad de desorden de código y gastos generales. (Una forma de evitar esto es hacer que el modelo contenga solo la ID seleccionada y tener ayudantes de HTML para construir las listas).

Otra preocupación está más relacionada con la seguridad. Un escenario común es mostrar información en un formulario que debe considerarse de solo lectura. En el caso de un ViewModel y un EditModel, el EditModel solo contendrá las propiedades que se espera POSTed, mientras que el ViewModel contendrá todas las propiedades. Por ejemplo, si un formulario muestra el salario de un usuario, un usuario podrá POSTAR un "salario" y tenerlo vinculado a la propiedad Salario de ViewModel automáticamente por MVC. En este punto, se debe hacer algo para garantizar que no termine en la base de datos. Podría ser si / else logic, un atributo Bind, Automapper logic o algo más, pero el punto es que es un paso que podría pasarse por alto. Al considerar la vida útil de una aplicación, me gusta la explicación explícita de EditModel a lo largo del tiempo.

Estas preocupaciones no significan que dos modelos sean buenos y un modelo sea malo, pero deben considerarse al elegir un diseño.


He visto argumentos perfectamente buenos a favor y en contra, solo depende de lo que funcione mejor para su aplicación. ¡No hay un enfoque único que se pueda aplicar a todos!

Si no lo has leído, Jimmy Bogard ha escrito una muy buena publicación sobre cómo su equipo hace MVC here , que trata este tema.


No - un modelo de vista para ambas direcciones. Mezclarlo no solo es más difícil de seguir, sino que uno podría fácilmente inyectar valores no válidos en la página que luego se vinculan automáticamente. Podría sobrescribir su ID de cliente (o crear una), por ejemplo.

Herede de un modelo de vista base si debe o no confiar en las anotaciones de datos y utilizar la API fluida en el modelo guardado.

Un gran enlace (un tanto no relacionado pero el mapa automático es bueno)

edit (lo siento, alguien más publicó esto más abajo que me di cuenta) here

¿También ASP.net MVC - One ViewModel por vista o por acción?

Usted (IMHO) debería ser generalmente vinculante para su método específico de VieWModel en lugar de un modelo de vista compartido. Podría quedar atrapado en una trampa de propiedades perdidas, etc., pero también puede funcionar bien para usted.

Usa el mapeador automático para ir entre ambos. Jimmy también tiene un buen atributo de AutoMap cuando regresa a la Vista. Volviendo al otro lado, no usaría un CustomerModel en general, ya que puede haber campos requeridos allí que no vienen de mi opinión, crear vista. Por ejemplo, un ID de cliente puede ser un campo obligatorio y para una acción "crear" no estará presente. Pero, si encuentra en la mayoría de sus casos que esto realmente funciona para usted, entonces no hay razón alguna para no usarlo.


Si las propiedades son las mismas para los modelos de visualización y edición, no veo ninguna razón para tener clases separadas.