2009-12-21 46 views
31

ViewModel es un término que se utiliza tanto en MVVM (Model-View-ViewModel) como en la implementación recomendada para ASP.NET MVC. Investigar "ViewModel" puede ser confuso dado que cada patrón usa el mismo término.MVVM ViewModel vs. MVC ViewModel

¿Cuáles son las principales diferencias entre MVC ViewModel y MVVM ViewModel? Por ejemplo, creo que MVVM ViewModel es más rico, dada la falta de un Controlador. ¿Es esto cierto?

Respuesta

42

Una pregunta bastante desafiante para responder sucintamente, pero lo intentaré. (Tenga en cuenta que las respuestas a este tipo de preguntas aún son tema de debate entre los desarrolladores.)

En MVC, ViewModel proporciona toda la información necesaria para que se visualice una vista. La información que contiene se crea usando los datos definidos en el Modelo. La Vista lee ViewModel y representa la salida. La entrada desde la Vista se pasa al Controlador, que manipula el Modelo, construye un Modelo de Vista apropiado, y lo pasa a la Vista para su representación.

En MVVM, ViewModel cumple la misma función que en MVC, pero también reemplaza parte del controlador MVC al proporcionar comandos que permiten que la vista manipule el modelo. El enlace de datos de WPF gestiona la actualización de la Vista de acuerdo con los cambios en el Modelo de Vista (y esto reemplaza efectivamente la función restante del Controlador MVC).

+0

En la práctica; ViewModel en ASP.NET MVC no permite 'Magic Strings' en la Vista; y proporciona un modelo muy tipado para la visualización (Intellisense incluido y todo ese jazz). De lo contrario, excelente respuesta. –

+0

Buena respuesta. @George: Aún puedes usar Magic Strings en MVC ... esto no es una preocupación de MVC ... no hace nada para evitar esta práctica. –

8

Ha sido un tiempo desde que jugué UI Design Patterns Bingo .. Sin embargo me dejaron tomar una puñalada en este ..

MVVM es sólo algo que MS ha llegado con ... porque le ayuda a obtener la mayor parte de WPF. Combina el estado y el comportamiento de la vista en una clase (un modelo de presentación) que es fácilmente comprobable + y luego utiliza el enlace de datos para obtener los datos en cualquier vista.

Este link tiene un resumen de la evolución de MVVM. Combine esto con la serie "GUI Architectures" de Fowler, y debería estar en camino.

Actualización: No sabía que había algo llamado MVC-VM. Aparentemente una idea original de la multitud ASP.NET MVC. Se ve y suena similar a MVVM (excepto afinado para ASP.NET MVC); la única diferencia es que impone una restricción de que existe una asignación 1: 1 entre VM y View. Hubiera adivinado 1: N, pero todo lo demás coincide.

3

Sé que esta es una (antigua) pregunta, pero me han señalado como un ejemplo del uso de "Ver modelo" en el contexto de MVC. Yo sostengo que esto es incorrecto y puede llevar a la confusión de las personas que son nuevas en los patrones de uno o ambos. Quien lo está haciendo, stahp. Aquí está el por qué (e incluso es una respuesta a la pregunta original de una manera indirecta).

Un ejemplo de cuándo ocurre esto se puede ver en this question. El usuario está tratando de usar un modelo de vista que implementa INotifyPropertyChanged en una aplicación ASP.NET MVC, combinando así el diseño de aplicaciones web de escritorio y sin estado en un error arquitectónico y angustia.

En pocas palabras, no hay "Ver modelo" en el patrón MVC. No es, sin embargo, un equivalente funcional, y ese es el controlador.Para ser claros acerca de las partes y sus purpouses,

MVVM (aplicaciones de escritorio):

  • Modelo - objetos de tipo fuerte que contiene los datos a transmitir entre la Vista y Vista Modelo
  • Ver - La interfaz de usuario vista por el usuario y mediante la cual el usuario interactúa con el sistema
  • Ver modelo - Interpreta las acciones del usuario (por ejemplo, a través de ICommand), las realiza, actualiza appl Estado icación

MVC (aplicaciones web):

  • Modelo - inflexible de tipos * objeto que contiene los datos que se pasa entre la Vista y Vista Modelo
  • Ver - Un generador de interfaz de usuario que combina el modelo, código y HTML para representar una página web
  • Controlador - Acepta solicitudes de los usuarios, las interpreta, actualiza el estado de la aplicación y utiliza una vista para convertir este estado en una página web HTML

El Modelo es prácticamente la misma en ambos modelos. Los modelos de escritorio pueden implementar notificaciones de eventos de actualización, los modelos web pueden ser dinámicos (es decir, no están fuertemente tipados), y ambos pueden incluir o no métodos de validación o metadatos.

La vista en el escritorio es lo que ve el usuario. En la web, es un generador que genera HTML para que los navegadores lo muestren en el lado del cliente. Debe interpretar la interacción del usuario en el escritorio, pero en la web que se maneja mediante javascript del lado del cliente, el navegador y las solicitudes que se envían al servidor.

El modelo/controlador de vista son prácticamente equivalentes funcionalmente, pero difieren mucho en cómo se implementan y cómo funcionan. En el Modelo de vista, la interacción del usuario con la aplicación se transfiere a Ver modelos a través de ICommands, eventos enrutados y otros métodos (muchos marcos MVVM proporcionan diferentes formas de enganchar Modelos de Vista a la UI y otras partes de la aplicación). En un Controlador, aparece una solicitud con toda la información necesaria para que el Controlador devuelva un resultado al usuario (suponiendo que sea una solicitud de 200 OK). El Controlador debe realizar cualquier trabajo que sea necesario para crear el estado (también conocido como Modelo) necesario para el generador HTML (la Vista) para crear la respuesta. Desde el punto de vista del diseño, el Controlador se encuentra sobre la Vista y el Modelo conociendo y controlando ambos, mientras que el Modelo de Vista se ubica al lado de la Vista, pasando el Modelo (y otra información) entre ellos.

Lo que realmente parece confundir a algunas personas es que hay marcos MVVM del lado del cliente que puede mezclar en su aplicación MVC. Estos existen únicamente en javascript en el navegador del usuario, y no tienen nada que ver con el patrón particular que está siguiendo en el lado del servidor. Puede ejecutar un sitio web ASP clásico que usa MVVM en el lado del cliente. Demonios, puedes ejecutar páginas HTML estáticas que usan MVVM en el lado del cliente. Ellos son eso separados.

Estos marcos javascript MVVM generalmente siguen un patrón similar al patrón MVVM de escritorio descrito anteriormente, pero ajustado para trabajar más en sintonía con la naturaleza del HTML DOM y javascript. Por ejemplo, no existe un sistema de enlace extenso entrelazado en el DOM, y javascript tiene un sistema de tipo muy limitado, por lo que emparejar plantillas a modelos es muy diferente que en WPF. También suelen funcionar desconectados del servidor, y cuando necesitan interactuar, prefieren las llamadas AJAX en lugar de POSTear la página de vuelta al Controlador (las llamadas AJAX normalmente las manejan los Controladores WebAPI en ASP.NET MVC).

Por lo tanto, para resumir, realmente no hay un modelo de vista en MVC. El controlador es el equivalente aproximado, pero es muy diferente en cuanto a cómo recibe la entrada del usuario, la interpreta y devuelve un resultado al usuario. Usar el término "Ver modelo" para referirse a cualquier cosa en MVC solo puede generar confusión y, por lo tanto, debe evitarse. Use los términos apropiados para las partes apropiadas del patrón. Puede parecer pedante, pero debería ayudar a mantener las cosas claras y ser menos confuso para las personas que son nuevas en ambos patrones.

+0

Lo siento, pero creo que esto es incorrecto y contribuye a la confusión que abunda con VM y MVC. La respuesta de Adams anterior es correcta en una línea: "En MVC, ViewModel proporciona toda la información necesaria para que se visualice una vista". IOW, no existe parte de la máquina virtual en el controlador. Un controlador no es un equivalente funcional a una VM. Una VM es un objeto único bien definido que tiene todas las propiedades necesarias para representar una vista. Les explico cómo construirlos aquí: http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc/29135747#29135747 – Sam

+0

@Sam Así que el controlador, al igual que ViewModel, no interpreta las acciones del usuario , traducirlos a lógica empresarial y devolver los resultados de estas acciones a Vistas para renderizar? – Will

+0

¡Absolutamente no! El trabajo de un controlador es devolver una vista a una solicitud. Y no una cosa más. Los controladores generalmente son bastante pequeños (google "controlador flaco"). El trabajo de la máquina virtual es completamente diferente y no está relacionado con el controlador. El trabajo de la VM es ensamblar objetos y servicios en un único objeto que se presenta a un motor de renderizado para que se pueda crear la vista. La VM contiene lógica para interactuar con el usuario (animar, colorear, ocultar/mostrar, etc.) y llama a los servicios comerciales según sea necesario en nombre de la vista. – Sam

Cuestiones relacionadas