如何在ASP.NET MVC3中填充ViewModel

时间:2012-02-20 16:26:05

标签: c# asp.net-mvc-3 viewmodel fill

在我的控制器中,我的域模型中有ProductInfo个类,我需要一些信息来填充查看模型 ProductStatsVM

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

  1. 直接从控制器填充视图模型(不好,我想让控制器保持苗条)
  2. 使用视图模型构造函数并将域模型作为参数传递。 (我必须为我想要使用的每个域模型类创建一个构造函数)
  3. 使用 Fill()方法。 (我在网上看到它,不知道它是如何工作的我猜这种方式ViewModel应该知道服务层并创建耦合)。
  4. 我知道有些像AutoMapper这样的工具,我确实会使用它,但之前我想了解如何在不使用任何其他工具的情况下从Controller中填充视图模型的逻辑。

2 个答案:

答案 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使它们保持苗条。