mvc dataannotations data annotation asp.net-mvc model-view-controller asp.net-mvc-2 viewmodel

asp.net-mvc - dataannotations mvc validation



¿El uso de ViewModels y las referencias a System.Web.Mvc violan el patrón MVC? (3)

¿Esto viola los patrones de MVC cuando comenzamos a agregar IEnumerable a nuestras clases modelo?

En realidad no, PERO si está tratando de usar un Diseño Dirigido por Dominio o separación de preocupaciones entre su capa de negocios y MVC / capa de presentación, es una violación.

  • Los modelos son sus entidades, su dominio, sus objetos de la capa de negocios.

  • ViewModels son sus pantallas, publicaciones de formularios, visualización de depósitos de datos.

Los modelos se asignan a ViewModels que pueden contener elementos dependientes de MVC. Piense si es así, ViewModels es directamente para MVC. Los modelos pueden ser para un servicio, winform, WPF o cualquier presentación programática del sistema de sistema de negocios.

Lo he visto por todos lados, blogs y libros, donde los autores dicen que agreguen ViewModels específicos para su vista en sus proyectos de modelo como envoltorios para sus objetos de modelo subyacentes. La idea es hacerlo muy simple y específico cuando vaya a hacer el enlace del modelo a la Vista. Aquí hay un buen ejemplo: listas desplegables de representación y vinculación usando ASP.NET MVC 2 EditorFor

Sin embargo, me molesta un poco que haya referencias ahora a System.Web.Mvc en mi modelo, que de otro modo podría haber sido utilizado para múltiples puntos de venta (tal vez WCF API, Silverlight, etc.), pero ahora tengo referencias específicas a MVC dll eso se requerirá para que mi proyecto modelo se construya.

Mi pregunta es: ¿esto viola los patrones de MVC cuando comenzamos a agregar IEnumerable<SelectListItem> a nuestras clases modelo? ¿Y hay una capa alternativa viable para mover esto ay cómo, es decir, Controlador?

Cualquier pensamiento o comentario apreciado.


No, los ViewModels están destinados a ser consumidos por la Vista y deberían estar ubicados en su proyecto web. Sin embargo, su Modelo real no debería tener ninguna referencia a MVC o su proyecto web. Piense en su ViewModel como un puente de ese espacio web desde su Modelo a su Vista.


Personalmente, solo creo la lista de selección sobre la marcha en la vista, desde una lista IEnumerable más reutilizable en mi modelo, lo que significa que mi modelo no tiene nada relacionado con SelectLists, SelectListItems ni nada MVC específico.

Ejemplo como prometido: cree la lista de selección en la vista, utilizando todos los bits de motor de vista normal ...

<%= Html.ListBox("SelectedStuff", new SelectList(Model.SomeOptions, "id", "name", Model.SelectedStuff)) %>