我为什么要使用视图模型?

Dav*_*all 27 asp.net-mvc viewmodel

我是使用ASP.NET MVC开发Web应用程序的新手.事实上,无论技术如何,我都很擅长开发网络应用程序.

目前,我正在开展一个项目,以便更好地了解ASP.NET MVC框架.当阅读SO和互联网上的其他地方时,共识似乎是视图永远不应直接处理业务对象(即实现业务逻辑和包含相关属性的对象).相反,应该使用视图模型.但是,这引入了一些问题:

  • 我在哪里放置验证码?
  • 我需要添加代码来映射业务对象和视图模型.

事实上,它似乎相当麻烦,我没有真正看到任何人正确解释为什么将业务对象传递给视图是一个坏主意.有人可以尝试解释一下(或指向一个很好的解释)?

只是一个澄清 ; 我不是在寻找如何处理上述视图模型的两个问题的示例,而只是解释为什么我应该使用视图模型.

Dar*_*rov 45

我在哪里放置验证码?

在视图模型上,您应该验证特定于应用程序的所有内容,例如日期应该是en-US格式文化,....

我需要添加代码来映射业务对象和视图模型.

这就是为什么有像AutoMapper这样的工具.

在视图中直接使用域模型时会出现不同的问题:

  • 视图具有显示数据(本地化/全球化)的特定要求,因此您最终会在视图中使用意大利面条代码,或者将此代码放在模型上,以便它们在其他应用程序中变得不那么重复,因为您已经使用特定的演示文稿污染它们东西
  • 根据视图,您有不同的验证要求.我们以"添加"和"更新"视图为例.在"添加"视图中,将不需要Id属性,因为您将插入新项目,所以不需要它.在"更新"视图中,将需要Id属性,因为您将更新现有项目.没有视图模型,很难处理那些特定的验证规则.
  • 模型可能包含诸如此类的属性IsAdmin,然后我将您的想象力留给具有以下签名的控制器操作:

    [HttpPost]
    public ActionResult CreateUser(BusinessObjectUser user) { ... } 
    
    Run Code Online (Sandbox Code Playgroud)

    假设您通过不包含它来从基础表单隐藏此属性.

  • 业务模型不会经常更改,而UI可能会更频繁地更改.如果您的客户要求您将屏幕拆分为两个怎么办?您呈现信息更改的方式及其格式化方式也会发生变化.如果您将模型直接用于视图中,那么每次更改都会使您的观点变得越来越糟糕.
  • 我在asp.net-mvc标签中在StackOverflow上回答的问题的大约60%不会被问到OP是否使用了视图模型.


Kum*_*PMP 5

您应该使用View Models的三个原因:

原因1:从视图中删除逻辑

原因二:安全

原因三:耦合松动

以下链接可能很有用:http: //www.codeproject.com/Articles/223547/Three-reasons-to-why-you-should-use-view-models