Modelo ASP.NET MVC vs ViewModel

92

Bien, he estado escuchando discusiones sobre "ViewModels" en lo que respecta a ASP.NET MVC de MS.

Ahora, eso está destinado a ser un tipo específico de modelo, ¿correcto? No es un tipo específico de vista.

A mi entender, ¿es un tipo de modelo que tiene un propósito específico de interactuar con la vista? ¿O algo así?

Se agradecería alguna aclaración.

Qcom
fuente

Respuestas:

71

Básicamente, Model y View Model son clases simples con atributos.

El principal objetivo de estas clases es describir ("Modelar") un objeto para sus respectivas audiencias que son respectivamente el controlador y la vista.

Entonces tienes toda la razón cuando dices

A mi entender, es un tipo de modelo que tiene un propósito específico de interactuar con la vista

Entonces, mientras que las clases de modelo son efectivamente entidades de dominio con las que interactúa su aplicación, los modelos de vista son clases simples con las que interactúan sus vistas.

Espero eso ayude :)

Actualización :

Microsoft ha desarrollado una versión especializada de Presentation Pattern de Martin fowler basada en gran medida en Model-View-Controller y la llamó Model-View-ViewModel (MVVM) para la aplicación PF. Este patrón está dirigido a plataformas de desarrollo de UI modernas donde los desarrolladores de UI tienen diferentes requisitos basados ​​más en la lógica empresarial que los desarrolladores tradicionales. Echa un vistazo aquí para ver un poco de teoría.

Lorenzo
fuente
1
Bien, gracias, y también gracias por la actualización, ¡es muy útil! Entonces, sin tener en cuenta la versión especial de MS, con stock MVC 2, ¿coloca ViewModels en una carpeta especial designada? ¿O están esencialmente colocados directamente en la carpeta Modelos como cualquier otro? ¿O puedes hacer cualquiera de las dos?
Qcom
De nada. Por lo general, coloco modelos y veo modelos en la misma carpeta porque quiero agruparlos con respecto al dominio al que se refieren, pero esa es solo mi elección y estoy seguro de que hay mejores
Lorenzo
5
Se supone que ViewModel separa la vista del modelo (dominio). Por lo tanto, tiene sentido colocar ViewModel cerca de View, no cerca de Model.
Vitaliy Ulantikov
Mantendría mis clases de 'Modelo' fuera de mi proyecto MVC en lugar de en una carpeta Modelo; sin embargo, mantendría las clases de Modelo de vista dentro del proyecto MVC, de modo que, como dice Vitaliy, estarán cerca de la Vista.
Dan Harris
@Lorenzo En tu primera línea, dices "ambas clases simples con atributos". Creo que te refieres con propiedades? Si no es así, ¿a qué atributos se refería? Atributos vs Propiedades
xr280xr
69

En los términos más simples, me gusta pensar en lo siguiente:

Modelo: Se ve y se siente estrictamente como su modelo de datos. Para todos los efectos, es solo una representación de clase de su modelo de datos. No tiene conocimiento de su Vista ni de ningún elemento dentro de su Vista. Dicho esto, no debe contener ningún decorador de atributos (es decir, Requerido, Longitud, etc.) que usaría para su Vista.

Modelo de vista: sirve como un enlace de datos entre su vista y su modelo y, en muchos casos, también es un contenedor para su modelo. Se volvería inútil sin la Vista, por lo que normalmente no es reutilizable en múltiples Vistas y Controladores como lo es un Modelo estándar.

Como ejemplo, su modelo puede tener las siguientes propiedades, que son representaciones directas de su fuente de datos:

    public string FirstName { get; set; }
    public string LastName { get; set; }

Ahora, dado que su modelo de vista está vinculado a su vista, puede tener la siguiente propiedad, que concatena el campo Nombre del modelo y el campo Apellido juntos como una sola cadena:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
Jason Marsell
fuente
2
¿Podría proporcionar un ejemplo más completo de ViewModel? ¿Cómo sabe qué es myModel y cómo obtiene datos para myModel?
M Kenyon II
5
Por naturaleza, un ViewModel es un objeto C # (POCO) antiguo y nunca sabrá realmente cómo se ve su modelo de datos. Es más un híbrido de su modelo de datos y elementos específicos que su vista necesita mostrar. En cuanto a cómo obtiene los datos, debe cargarlos con los datos. Me gusta usar una clase intermedia separada, donde llamo a mi servicio para obtener los datos y luego cargo manualmente esos datos en mi ViewModel. Luego devuelvo el ViewModel completamente cargado a la acción del controlador.
Jason Marsell
26

Encontré este artículo como un recurso muy útil para comprender cómo interactúan el "Modelo de dominio" y el "Modelo de vista" dentro de una aplicación MVC, particularmente en lo que respecta al enlace. Lo mejor de todo incluye ejemplos en lugar de descripciones abstractas.

"Desde que se lanzó MVC, he observado mucha confusión sobre la mejor manera de construir modelos de vista. A veces, esta confusión no es sin una buena razón, ya que no parece haber mucha información disponible sobre recomendaciones de mejores prácticas. Además, no hay una solución de "talla única" que actúa como la fórmula mágica. En esta publicación, describiré algunos de los patrones principales que han surgido y las ventajas y desventajas de cada uno. Es importante tener en cuenta que muchos de estos patrones han surgido de personas que resuelven problemas del mundo real ".

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

misteraidan
fuente
19

WikiPedia tiene una descripción más completa de Model vs. ModelView de la que obtendrá en una respuesta SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

Yo cito:

Modelo : como en el patrón MVC clásico, el modelo se refiere a (a) un modelo de objeto que representa el contenido del estado real (un enfoque orientado a objetos), o (b) la capa de acceso a datos que representa ese contenido (un enfoque céntrico).

Vista : como en el patrón MVC clásico, la vista se refiere a todos los elementos mostrados por la GUI, como botones, ventanas, gráficos y otros controles.

ViewModel : ViewModel es un "Modelo de la Vista", lo que significa que es una abstracción de la Vista que también sirve en el enlace de datos entre la Vista y el Modelo. Podría verse como un aspecto especializado de lo que sería un controlador (en el patrón MVC) que actúa como un enlazador / convertidor de datos que cambia la información del modelo a información de la vista y pasa comandos de la vista al modelo. ViewModel expone propiedades públicas, comandos y abstracciones. El ViewModel se ha comparado con un estado conceptual de los datos en oposición al estado real de los datos en el modelo.

Ian Mercer
fuente
3
Si bien hay una descripción de Model y ViewModel, ese enlace solo describe el patrón arquitectónico MVVM. No son las diferencias entre modelos y modelos de vista
Lorenzo
5

Existe una noción de ViewModel, pero generalmente no se asocia con Asp.net MVC. MVC usa el patrón de controlador de vista de modelo, donde el controlador maneja interacciones, genera datos del modelo y luego pasa esos datos a la vista para su visualización.

ViewModels (y el patrón Model View ViewModel) se asocia más generalmente con Silverlight y WPF. Xaml es un poco diferente en el sentido de que las vistas pueden vincularse bidireccionalmente a los ViewModels, por lo que la tecnología es un poco diferente. Por ejemplo, si vincula un cuadro de texto a un campo, mientras escribe en ese cuadro de texto, el valor del campo se actualiza dinámicamente. Este tipo de interacción no es realmente posible en las páginas web, ya que las páginas web no tienen estado.

La similitud entre los dos patrones es que ambos intentan separar la lógica de la pantalla. El uso / razón más común para esto es la prueba: desea poder realizar desde el código (a través de un marco de prueba) todas las interacciones que un usuario invocará a través de la interfaz de usuario.

tsimon
fuente
En el libro que estoy leyendo, "Professional ASP MVC 2", ViewModel se presenta en el Capítulo 1 como un medio para mantener las interacciones de presentación / modelo tanto fuertemente tipadas como DRY. Los autores de microsoft incluyen a Scott Hansleman, Phil Haack, Scott Guthrie.
Berryl
Últimamente he visto mucho más que ViewModel se está utilizando en Asp.net MVC. parece que ViewModel tiene más negocios en la vista que el modelo de dominio. Entonces, el patrón que hemos estado usando es hacer que los modelos de dominio ensamblen las partes principales del ViewModel. Actualmente, utilizamos un patrón de comando modificado (operaciones) que trabaja con los modelos de dominio para realizar sus tareas. Los resultados se ensamblan en ViewModel y se envían a la vista. El modelo de vista en este caso contiene todas las anotaciones y una lógica simple y enfocada que respalda la vista.
Sinaesthetic