如何在ASP.NET MVC3中填充ViewModel

Cic*_*ami 20 c# fill viewmodel asp.net-mvc-3

在我的控制器中,我有一个ProductInfo来自我的域模型的类,我需要它的一些信息来填充我的视图模型 ProductStatsVM.

如何填充视图模型?我听说过三种可能的方法:

  1. 直接从控制器填充视图模型(不好,我想让控制器保持苗条)
  2. 通过使用View Model构造函数并将域模型作为参数传递.(我必须为我想要使用的每个域模型类创建一个构造函数)
  3. 通过使用Fill()方法.(我在网上看到它,不知道它是如何工作的我猜这种方式ViewModel应该知道服务层并创建耦合).

我知道有些像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操作中没有无参数构造函数,则默认模型绑定器将会阻塞,您必须实现自定义模型绑定器.