2012-02-20 11 views
20

En mi controlador que tienen una clase de mi ProductInfomodelo de dominio y necesito algo de su información para difundir mi Ver ModeloProductStatsVM.cómo llenar un modelo de vista en ASP.NET MVC3

¿Cómo puebla el modelo de visualización? Oí tres maneras posibles:

  1. pueblan el Modelo Vista directamente desde el controlador (no es bueno, quiero mantener mi controlador delgado)
  2. Mediante el uso de un constructor Ver Modelo y aprobar el modelo de dominio como parámetro. (Tengo que crear un constructor para cada clase de modelo de dominio que quiero usar)
  3. Al usar un método Fill(). (Lo vi en la web, no tengo idea de cómo funciona, supongo que de esta forma el ViewModel debería conocer la capa de servicio y crear un acoplamiento).

Sé que hay herramientas como AutoMapper, que voy a utilizar de hecho, pero antes quiero entender la lógica sobre cómo llenar un Modelo de Vista desde el Controlador sin usar ninguna herramienta adicional.

+0

parece que ha respondido su propia pregunta allí. – dice

+1

Me alegro de que me haya preguntado esto, estoy sorprendido de que nadie tenga +1 en esta pregunta como si lo hicieran en el día. He estado jugando con varias sugerencias y prácticas propuestas, pero la respuesta de Darin está en mi calle, buena pregunta, gran respuesta. – LenPopLilly

Respuesta

27

La idea es que la acción de su controlador consulte algún repositorio para obtener un modelo de dominio. Luego se pasa a este modelo de dominio a una capa de mapeo que se encarga de convertirlo en un modelo de vista y finalmente pasa la vista del modelo a la vista:

public ActionResult Index(int id) 
{ 
    ProductInfo product = repository.GetProductInfo(id); 
    ProductViewModel viewModel = Mapper.Map<ProductInfo, ProductViewModel>(product); 
    return View(viewModel); 
} 

y podría incluso provocar que el controlador más delgado mediante la introducción de una costumbre filtro de acción que interceptará automáticamente el modelo en caso OnActionExecuted y poner en la capa de mapeo para sustituirlo por el modelo vista correspondiente para que su acción del controlador se convierte ahora en:

[AutoMapTo(typeof(ProductViewModel))] 
public ActionResult Index(int id) 
{ 
    ProductInfo product = repository.GetProductInfo(id); 
    return View(product); 
} 

y por supuesto ahora la vista es fuertemente tipado a ProductViewModel:

@model ProductViewModel 
... 

Hasta usted para implementar el método Mapper.Map<TSource, TDest>. Y si no quiere implementarlo usted mismo, puede descargar AutoMapper que ya tiene este método para usted.

La capa de asignación es algo que forma parte de la aplicación MVC. Debe tener en cuenta tanto los modelos de dominio provenientes de su capa de servicio como los modelos de vista definidos en su aplicación MVC para poder realizar la asignación.

No use constructores (que no sean el parámetro sin parámetros) en sus modelos de vista. El encuadernador de modelo predeterminado se ahogará si el modelo de vista no tiene un constructor sin parámetros en sus acciones POST y deberá implementar carpetas de modelo personalizadas.

+0

Increíblemente claro y completo como siempre. ¡Muchas gracias! – CiccioMiami

+0

Respuesta realmente genial :) –

+0

Por cierto, ¿dónde se configura la asignación (es decir, Mapper.CreateMap () ...)? – Abe

1

Dado que se necesitan modelos de vista para poblar la IU, conviene que se llenen a través de los controladores. Aún puede mantenerlos delgados al usar Automapper.

Cuestiones relacionadas