与Model和ViewModel混淆

use*_*969 24 .net c# asp.net asp.net-mvc asp.net-mvc-3

我正在学习ASP.NET MVC并下载了几个示例应用程序.MusicStore等......

我来自wpf背景,我们有MVVM模式.我注意到他们使用了模型和ViewModel的概念.

在MVVM中很清楚,您将视图绑定到ViewModel,将模型注入viewModel.在MVC中你有一个控制器,但我不确定和混淆所有联系在一起,因为我看不到模型注入ViewModel

我有以下结构

  1. MyCompany.Entities.dll(所有型号都在这里)EG产品
  2. MyCompany.Dal.dll(所有存储库都在这里)
  3. MyCompany.Services.dll(由MyCompany.WebUI.Controller调用,调用MyCompany.Dal)
  4. MyCompany.WebUI.MyApp
  5. MyCompany.Tests

从我看到的一些示例中,您的模型充当ViewModel.Am我是否正确?

让我们拿一个控制器,我有类似的东西

public class ProductController
{
    public ProductController(IProductRepository productRepository)
    {
        //omitted as not relevant
    }
}
public class ProductVM
{
    public ProductVM()
    {  
        // Shouldn't we inject the model here RG Product
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以参考一些N层示例吗?ViewModel的概念在MVC中是否有效?标准是什么?

谢谢你的任何建议.

RPM*_*984 35

使用的ViewModels简化视图.

例如,您可能拥有包含Products,Order,Customers等的深层对象图 - 并且特定View上需要来自每个对象的一些信息.

ViewModel提供了一种将View所需的信息聚合到单个对象中的方法.

ViewModel还允许数据注释和验证之类的东西 - 它们不属于您的模型,因为您的模型应该保持"特定于域".

但实际上,ViewModel只不过是域对象的简单包装器.

使用AutoMapper等工具轻松地在ViewModel和域模型之间来回映射.

我个人总是在我的View中绑定到ViewModel,从不绑定到域模型,即使它是单个对象.为什么?我喜欢使用UIHints,验证,数据注释来装饰我的ViewModel.就像使用特定于域的规则和业务逻辑丰富您的域模型一样,您的ViewModel也应该使用特定于UI的逻辑进行丰富.

如果您只是拥有一个1-1表示域模型的对象,那么您就错过了ViewModel的观点.

仅添加到ViewModel,仅此而已,特定视图所需的内容.

控制器动作示例

public ActionResult CustomerInfo(int customerId)
{
   // Fetch the customer from the Repository.
   var customer = _repository.FindById(customerId);

   // Map domain to ViewModel.
   var model = Mapper.Map<Customer,CustomerViewModel>(customer);

   // Return strongly-typed view.
   return View(model);
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨,感谢您的回复,您是说:我们的webApp中没有模型.我们有控制器引用的ViewModel,然后我们将域"模型"注入到viewModel中,以便我们可以为我们添加注释和验证ViewModels.Do你有一个快速的例子或链接我们这是结构化的吗?我将非常感激.谢谢你 (2认同)