如何在ASP.NET MVC3中填充ViewModel

本文关键字:填充 ViewModel MVC3 NET ASP | 更新日期: 2023-09-27 18:25:08

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

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

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

我知道有像AutoMapper这样的工具,我确实会使用它,但在我想了解如何在不使用任何其他工具的情况下从控制器填充视图模型的逻辑之前。

如何在ASP.NET MVC3中填充ViewModel

其想法是您的控制器操作查询某个存储库以获取域模型。然后它将这个域模型传递给映射层,映射层负责将其转换为视图模型,最后它将视图模型传递给视图:

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

您甚至可以通过引入一个自定义操作过滤器来使您的控制器更纤薄,该过滤器将自动拦截OnActionExecuted事件中的Model,并调用映射层以用相应的视图模型替换它,这样您的控制器操作现在变成:

[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操作中没有无参数构造函数,那么默认的模型绑定器将阻塞,并且您将不得不实现自定义模型绑定器。

由于需要视图模型来填充UI,因此最好通过控制器来填充它们。您仍然可以通过使用Automapper来保持它们的纤薄。