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