net mvc asp anotation anotaciones c# asp.net-mvc-3 viewmodel fill

c# - anotation - Cómo rellenar un ViewModel en ASP.NET MVC3



view asp net (2)

En mi Controlador tengo una clase ProductInfo de mi Modelo de Dominio y necesito algo de su información para completar mi Modelo de Vista ProductStatsVM .

¿Cómo se rellena el modelo de vista? Escuché tres formas posibles:

  1. Rellene el modelo de vista directamente desde el controlador (no es bueno, quiero mantener mi controlador delgado)
  2. Mediante el uso de un constructor de modelo de vista y pasar el modelo de dominio como parámetro. (Tengo que crear un constructor para cada clase de modelo de dominio que quiera usar)
  3. Mediante el uso de un método Fill () . (Lo vi en la web, no tengo idea de cómo funciona, supongo que de esta manera el ViewModel debería estar al tanto de la capa de servicio y crear un acoplamiento).

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


Dado que se necesitan modelos de vista para completar la interfaz de usuario, debería ser una buena idea rellenarlos a través de los controladores. Aún puedes mantenerlos delgados usando Automapper.


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

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

e incluso podría hacer que su controlador sea más delgado introduciendo un filtro de acción personalizado que interceptará automáticamente el Modelo en el evento OnActionExecuted y llamará a la capa de mapeo para sustituirlo con el modelo de vista correspondiente para que la acción de su controlador se convierta ahora en:

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

y, por supuesto, ahora la vista se escribe con fuerza en ProductViewModel:

@model ProductViewModel ...

Mapper.Map<TSource, TDest> usted implementar el 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 mapeo es algo que forma parte de la aplicación MVC. Debe estar al tanto de los modelos de dominio que provienen de su capa de servicio y los modelos de vista definidos en su aplicación MVC para poder realizar el mapeo.

No utilice constructores (aparte de los parámetros sin parámetros predeterminados) en sus modelos de vista. El enlazador de modelos predeterminado se ahogará si el modelo de vista no tiene un constructor sin parámetros en sus acciones POST y tendrá que implementar enlazadores de modelos personalizados.