C# 如何在ASP.NET MVC3中填充ViewModel

C# 如何在ASP.NET MVC3中填充ViewModel,c#,asp.net-mvc-3,viewmodel,fill,C#,Asp.net Mvc 3,Viewmodel,Fill,在我的控制器中,我有一个来自我的域模型的ProductInfo类,我需要它的一些信息来填充我的视图模型 如何填充视图模型?我听到了三种可能的方法: 从控制器直接填充视图模型(不太好,我想保持控制器苗条) 使用查看模型构造函数并将域模型作为参数传递。(我必须为我要使用的每个域模型类创建一个构造函数) 通过使用Fill()方法。(我在web上看到它,不知道它是如何工作的,我想这样ViewModel应该知道服务层并创建耦合) 我知道有像AutoMapper这样的工具,我确实要使用它,但在我想了解如何在

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

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

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

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

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

    public ActionResult Index(int id)
    {
        ProductInfo product = repository.GetProductInfo(id);
        ProductViewModel viewModel = Mapper.Map<ProductInfo, ProductViewModel>(product);
        return View(viewModel);
    }
    
    当然,现在视图被强类型化为ProductViewModel:

    @model ProductViewModel
    ...
    
    由您来实现
    Mapper.Map
    方法。如果你不想自己实现它,你可以下载已经有这种方法的软件

    映射层是MVC应用程序的一部分。为了能够执行映射,它必须知道来自服务层的域模型和MVC应用程序中定义的视图模型


    不要在视图模型中使用构造函数(默认的无参数构造函数除外)。如果视图模型在POST操作中没有无参数构造函数,并且您必须实现自定义模型绑定,则默认模型绑定器将阻塞。

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

    看起来你已经回答了自己的问题。很高兴你问了这个问题,我很惊讶没有人能像以前那样回答+1这个问题。我一直在玩弄各种建议和提议的实践,但Darins的答案就在我这条街上,好问题,好答案。顺便问一下,你在哪里配置映射(即Mapper.CreateMap()…)?@Abe,在AppDomain的生命周期中,这应该只做一次,最好是使用从应用程序开始调用的方法。谢谢!我在OnApplicationStarted()方法(Ninject)中配置了映射global.asax.cs文件,它成功了!
    @model ProductViewModel
    ...