为什么我应该使用视图模型?

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

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

  • 我在哪里放我的validation码?
  • 我需要添加代码来映射业务对象和视图模型。

事实上,这似乎相当麻烦,我还没有真正看到有人正确地解释为什么传递业务对象到视图是一个坏主意。 有人可以尝试解释这个(或指出一个很好的解释)?

只是一个澄清 ; 我没有find关于如何处理上述视图模型的两个问题的例子,而只是解释为什么我应该使用视图模型。

我在哪里放我的validation码?

在视图模型上,您应该validation应用程序特定的所有内容,例如date应该是en-US格式的文化,….

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

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

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

  • 视图对显示数据(本地化/全球化)有特定的要求,所以你最终可能会在视图中产生意大利面条代码,或者将这些代码放在模型上,这样在其他应用程序中可重复使用的次数就会减less,因为你已经用特定的表示来污染它们东东
  • 您根据视图有不同的validation要求。 以“添加”和“更新”视图为例。 在“添加”视图中,不需要Id属性,因为您将插入新项目,所以不需要。 在更新视图中,Id属性将是必需的,因为您将更新现有的项目。 在没有视图模型的情况下处理这些具体的validation规则将是困难的。
  • 这些模型可能包含IsAdmin属性,然后我将这个控制器操作的含义留给您的想象,具有以下签名:

     [HttpPost] public ActionResult CreateUser(BusinessObjectUser user) { ... } 

    假设你已经隐藏了这个属性从底层的forms不包括它。

  • 商业模式不会经常变化,而UI可能更经常变化。 如果你的客户要求你把屏幕分成两部分呢? 您呈现信息的方式变化以及格式化的方式也会改变。 如果直接将模型用于观点,那么随着每一个变化,你的观点的细腻程度越来越差。
  • 在asp.net-mvc标签中,我回答StackOverflow的问题中,大约60%不会被询问OP是否使用了视图模型。

为什么你应该使用视图模型的三个原因:

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

原因二:安全

原因三:松耦合

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

首先,允许视图直接访问ASP.NET MVC中的Business Objects,这引入了一些额外的安全问题。 当用户向你的控制器发送一个值时,ASP.NET MVC为你做了很多的Model绑定。 这可以打开你的各种攻击。 通过引入视图模型,你可以确定只有你感兴趣的领域是有约束力的(因为ViewModel将只包含你关心的领域)。

至于其他问题:

我在哪里放我的validation码?

我直接在ViewModel上使用DataAnnotations。 这使我可以使用内置于ASP.NET MVC的模型validation体系结构。 如果有任何validation超出我在我的控制器处理它。

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

真正。 但是使用像AutoMapper这样的东西可以大大减less你手工编写的样板代码的数量。