vistas vista una pasar pagina mvc multiples modelos modelo misma datos controlador model-view-controller model separation-of-concerns

model view controller - una - MVC: Modelos de datos y modelos de vista



pasar datos de una vista a un controlador c# (7)

¿por qué? ¡porque la vista no debería tener la capacidad de usar el objeto modelo!

Imagine que pasa el proyecto a un diseñador web para hacer la capa de visualización. De repente él / ella tiene la capacidad de meterse con los datos de su aplicación a través de la capa del modelo. Eso no es bueno.

Por lo tanto, siempre solo pase los datos que necesita la vista, en lugar del objeto con métodos.

He leído algunos consejos de MVC en el pasado con respecto a los modelos que indican que no debe volver a utilizar los mismos objetos del modelo para el dominio y la vista; pero no he podido encontrar a nadie dispuesto a discutir por qué esto es malo.

En mi opinión, la creación de dos modelos separados, uno para el dominio y otro para la vista, y el mapeo entre ellos crea una gran cantidad de duplicaciones, además de tedioso código de mapeo (algunos de los cuales podrían ser aliviados por cosas como AutoMapper ) que probablemente ser propenso a errores

¿Qué hace que tener un modelo separado para las dos preocupaciones valga la pena de la duplicación y el código de mapeo?


En el fondo, dos modelos tratan sobre la separación de preocupaciones. Quiero que mi Vista funcione con un único Modelo. Quiero que mi Modelo de Dominio represente el modelo conceptual que construyo con los expertos en el dominio. ViewModel a menudo tiene restricciones técnicas. El Modelo de dominio es sobre POCO y no está sujeto a restricciones técnicas de los datos mostrados (Vista) o persistentes (en un DB o de otro modo).

Supongamos que tengo tres entidades mostradas en una pantalla. ¿Eso significa que necesito forzar una relación entre los tres? O simplemente cree un objeto componente de ViewModel que contenga los tres elementos. Con un ViewModel separado, las inquietudes de Vista están separadas de mi dominio.


Finalmente me he bebido el asistente de frío, me gusta poder marcar mi modelo de vista con instrucciones de visualización y hacer que todo esté conectado automáticamente.

Lo que exijo ahora es algún tipo de autogenerador de viewmodels de entidades poco. Siempre configuro una cadena como int y me lleva mucho tiempo encontrarla. Ni siquiera pienses en hacer esto sin automapper a menos que te guste el dolor.


Incluso hay inquietudes más simples, incluida la capacidad del modelo de vista de ser especialmente formateado y, desde luego, nulo-seguro.


Parece que también tengo duplicación de reglas.

es decir. validación de objetos del cliente en la interfaz de usuario, luego asignación al objeto de dominio que debe validarse.

Sin embargo, lo que tiendo a hacer es mapear mi conjunto de objetos de dominio para crear un modelo, es decir. una página web que muestra información del cliente, información de stock, etc ... mi modelo se convierte en una estructura que contiene un objeto Cliente y un objeto Stock.

CompanyPageModel

public Customer Customer {get;} public Stock de acciones {get;}

luego en mi proyecto de mvc ViewData.Model.Customer.Name ViewData.Model.Stock.CurrentStocks

La separación ''parece'' más trabajo, pero más tarde, es bueno tener esta división del modelo de UI / Dominio ... por así decirlo, escribir pruebas :)


Supongo que la idea es que los modelos de tu dominio se extiendan a otras implementaciones, no solo a tu aplicación MVC y eso rompería el principio de las separaciones de las preocupaciones. Si su modelo de vista ES su modelo de dominio, entonces su modelo de dominio tiene dos razones para cambiar: un requisito de cambio de dominio Y un cambio en el requisito de vista.


Los DTO de Screen Bound de JP Boodhoo lo ayudarán a comprender el beneficio del diseño.

También hay un beneficio de seguridad sobre el que he escrito.

Tener un modelo de presentación simplifica tus puntos de vista. Esto es especialmente importante porque las vistas son generalmente muy difíciles de probar. Al tener un modelo de presentación, mueves mucho trabajo fuera de la vista y dentro del modelo de dominio-> presentación. Cosas como formatear, manejar valores nulos y aplanar gráficos de objetos.

Estoy de acuerdo en que el mapeo extra es un problema, pero creo que probablemente deba probar ambos enfoques en su contexto específico para ver qué funciona mejor para usted.