Asp.net mvc 为什么要使用视图模型?

Asp.net mvc 为什么要使用视图模型?,asp.net-mvc,viewmodel,Asp.net Mvc,Viewmodel,我不熟悉使用ASP.NETMVC开发web应用程序。事实上,无论技术如何,我对开发web应用程序还是相当陌生的 目前,我正在做一个项目,只是为了更好地了解ASP.NETMVC框架。在SO和internet上的其他地方阅读时,一致认为视图不应直接处理业务对象(即实现业务逻辑并包含相关属性的对象)。相反,应该使用视图模型。然而,这带来了几个问题: 我应该将验证代码放在哪里 我需要添加代码来映射业务对象和视图模型 事实上,它看起来相当麻烦,我还没有看到任何人正确解释为什么将业务对象传递给视图是个坏

我不熟悉使用ASP.NETMVC开发web应用程序。事实上,无论技术如何,我对开发web应用程序还是相当陌生的

目前,我正在做一个项目,只是为了更好地了解ASP.NETMVC框架。在SO和internet上的其他地方阅读时,一致认为视图不应直接处理业务对象(即实现业务逻辑并包含相关属性的对象)。相反,应该使用视图模型。然而,这带来了几个问题:

  • 我应该将验证代码放在哪里
  • 我需要添加代码来映射业务对象和视图模型
事实上,它看起来相当麻烦,我还没有看到任何人正确解释为什么将业务对象传递给视图是个坏主意。有人能解释一下吗(或者指出一个好的解释)

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

我应该将验证代码放在哪里

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

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

这就是为什么有这样的工具

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

  • 视图对显示数据有特定的要求(本地化/全球化),因此您要么在视图中使用意大利面代码,要么将此代码放在模型中,这样它们在其他应用程序中就不那么可重用了,因为您用特定的表示材料污染了它们
  • 根据视图,您有不同的验证要求。让我们以添加和更新视图为例。在Add视图中,不需要Id属性,也不需要它,因为您将插入一个新项。在更新视图中,Id属性是必需的,因为您将更新现有项。如果没有视图模型,很难处理这些特定的验证规则
  • 模型可能包含诸如
    IsAdmin
    之类的属性,然后我将控制器动作的含义留给您想象,并带有以下签名:

    [HttpPost]
    public ActionResult CreateUser(BusinessObjectUser user) { ... } 
    
    假设您已通过不包含此属性对基础窗体隐藏了此属性

  • 业务模型不会经常更改,而UI可以更频繁地更改。如果您的客户要求您将屏幕一分为二怎么办?您呈现信息的方式和格式也会发生变化。如果您直接在视图中使用模型,则视图的稀疏性会随着每次更改而变得越来越差
  • 如果OP使用了视图模型,我在asp.net-mvc标记中回答的关于StackOverflow的问题中大约60%不会被问到

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

至于其他问题:

我应该将验证代码放在哪里

我直接在ViewModels上使用数据注释。这允许我使用ASP.NET MVC中内置的模型验证体系结构。如果有任何超出此范围的验证,我将在控制器中处理

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


对。但是使用类似的工具可以大大减少手工编写的样板代码量。

使用视图模型的三个原因:

理由1:从视图中删除逻辑

理由二:安全

原因三:松耦合

以下链接可能有用:
MVC易于理解,开销非常小。但是那些已经使用模型-视图-控制器模式一段时间的人知道它并不完美。甚至不接近。模型-视图-模型模式提供了一个有趣的替代方案

了解模型-视图-模型模式扩展了模型-视图-控制器模式非常重要。如果你习惯了MVC,这并不是一个戏剧性的范式转变。尽管MVVM的优势是微妙的,但它们是深刻的

与MVC相比,MVVM有哪些优势

  • 更好地分离关注点
  • 改进的可测试性
  • 透明通信

  • 感谢您的回复,但我并不是在寻找如何处理这些问题的答案,而是在寻找一个解释,说明为什么我应该从视图模型开始。像AutoMapper这样的工具有助于传输TGH