为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要使用视图模型?

/ 猿问

为什么要使用视图模型?

白衣染霜花 2019-11-15 12:41:29

我是使用ASP.NET MVC开发Web应用程序的新手。实际上,无论技术如何,我对开发Web应用程序还是比较陌生的。

目前,我正在从事一个项目,目的是更好地了解ASP.NET MVC框架。在阅读SO和Internet上的其他内容时,似乎已经达成共识,即视图永远不应直接处理业务对象(即,实现业务逻辑并包含关联属性的对象)。相反,应使用视图模型。但是,这带来了两个问题:

  • 验证代码放在哪里?

  • 我需要添加代码以在业务对象和视图模型之间进行映射。

实际上,这看起来很麻烦,而且我还没有真正看到任何人正确地解释为什么将业务对象传递给视图是个坏主意。有人可以尝试解释一下(或指出一个好的解释)吗?

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


查看完整描述

3 回答

?
侃侃尔雅

验证代码放在哪里?


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


我需要添加代码以在业务对象和视图模型之间进行映射。


这就是为什么有诸如AutoMapper之类的工具的原因。


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


视图对显示数据有特定的要求(本地化/全球化),因此您要么在视图中添加意大利面条代码,要么将此代码放在模型中,以使它们在其他应用程序中的可重用性降低,因为您已经污染了特定的表示形式东西


根据视图,您具有不同的验证要求。让我们以添加和更新视图为例。在“添加”视图中,不需要ID属性,也不需要它,因为您将插入一个新项。在“更新”视图中,将需要Id属性,因为您将更新现有项。如果没有视图模型,将很难处理那些特定的验证规则。


这些模型可能包含的属性IsAdmin,然后让您想像一下具有以下签名的控制器动作的含义:


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

假设您通过不包含此属性而将其从基础表单中隐藏了。


业务模型不经常更改,而UI可以更频繁地更改。如果客户要求您将屏幕一分为二怎么办?您呈现信息的方式和格式也随之改变。如果直接在视图中使用模型,那么每次更改时,视图的混乱性都会变得越来越差。


如果OP使用了视图模型,则不会询问我在asp.net-mvc标记中关于StackOverflow回答的大约60%的问题。


查看完整回答
反对 回复 2019-11-15
?
料青山看我应如是

为什么要使用视图模型的三个原因:


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


原因二:安全性


原因三:耦合松动


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


查看完整回答
反对 回复 2019-11-15
?
慕姐829404

首先,允许视图直接访问ASP.NET MVC中的业务对象会带来一些额外的安全问题。当用户将值发布回控制器时,ASP.NET MVC会为您执行很多模型绑定。这会使您容易遭受各种攻击。通过在两者之间引入视图模型,可以确保仅绑定您感兴趣的字段(因为ViewModel仅包含您关心的字段)。


至于其他问题:


验证代码放在哪里?


我直接在ViewModels上使用DataAnnotations。这使我可以使用ASP.NET MVC内置的模型验证体系结构。如果还有其他验证,请在控制器中进行处理。


我需要添加代码以在业务对象和视图模型之间进行映射。


真正。但是,使用诸如AutoMapper之类的工具可以大大减少您必须手工编写的样板代码量。


查看完整回答
反对 回复 2019-11-15
  • 3 回答
  • 0 关注
  • 60 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信