在我的控制器中,我的域模型中有ProductInfo
个类,我需要一些信息来填充查看模型 ProductStatsVM
如何填充视图模型?我听说过三种可能的方法:
我知道有些像AutoMapper这样的工具,我确实会使用它,但之前我想了解如何在不使用任何其他工具的情况下从Controller中填充视图模型的逻辑。
答案 0 :(得分:27)
这个想法是你的控制器动作查询某个存储库以获取域模型。然后它将此域模型传递给映射层,映射层负责将其转换为视图模型,最后将视图模型传递给视图:
public ActionResult Index(int id)
{
ProductInfo product = repository.GetProductInfo(id);
ProductViewModel viewModel = Mapper.Map<ProductInfo, ProductViewModel>(product);
return View(viewModel);
}
你甚至可以通过引入一个自定义动作过滤器使你的控制器更加苗条,该过滤器将自动拦截OnActionExecuted
事件中的模型并调用映射层以用相应的视图模型替换它,以便你的控制器动作现在变成:
[AutoMapTo(typeof(ProductViewModel))]
public ActionResult Index(int id)
{
ProductInfo product = repository.GetProductInfo(id);
return View(product);
}
当然现在视图强烈输入到ProductViewModel:
@model ProductViewModel
...
由您决定实施Mapper.Map<TSource, TDest>
方法。如果你不想自己实现它,你可以下载已经有这种方法的AutoMapper。
映射层是MVC应用程序的一部分。它必须知道来自服务层的域模型和MVC应用程序中定义的视图模型,以便能够执行映射。
不要在视图模型中使用构造函数(默认的无参数构造函数除外)。如果视图模型在POST操作中没有无参数构造函数,则默认模型绑定器将会阻塞,并且您必须实现自定义模型绑定器。
答案 1 :(得分:1)
由于需要使用视图模型来填充UI,因此最好通过控制器填充它们。您仍然可以使用Automapper使它们保持苗条。