1

我最近完成了一个使用 MVC 框架(ASP.NET MVC)的项目。该项目使用了一个单独的 DTO 类,由控制器传递给 View。该模型几乎远离视图。这在 MVVM 中的 VM 和我的 DTO 之间绘制了一个内涵。对该项目的回顾表明,如果没有 DTO,我就无法完成(因为,我的模型非常位于应用程序层,由于安全原因不能传递到 Web 层)。

所以这是我的问题——VM(视图模型)在 MVC 中是必需的吗?是否存在控制器将模型直接传递给视图的生产应用程序?

4

2 回答 2

3

视图模型的目的非常简单——它是专门为在视图中使用而设计的模型。它在域模型之上提供了一个简化的界面,将视图中的决策保持在最低限度

——《ASP.NET MVC 4 实战》

当您有数十个不同的值要传递给视图时,允许您快速添加新条目或重命名现有条目的相同灵活性将成为您最大的敌人。您只能自己跟踪项目名称和值;您无法从 Microsoft IntelliSense 和编译器获得帮助。 处理软件复杂性的唯一行之有效的方法是通过适当的设计。因此,为每个视图定义一个对象模型有助于您跟踪该视图真正需要什么。我建议您为添加到应用程序的每个视图定义一个视图模型类

-- Dino Esposito 的“编程 Microsoft ASP.NET MVC”

在每一本 ASP.NET MVC 教程和书籍中,作者都​​认为 ViewModel 是必要的。根据我的经验,如果没有 ViewModel,我的项目会变得僵硬而脆弱。因此,我强烈建议您在项目中使用 ViewModel。

于 2013-08-17T09:35:06.173 回答
1

考虑如果你有一个员工表

EmpID
Fname
Lname
DeptID
DesigID
Email
Phone

因此,如果您将有一个类来表示此表。您可以将其视为要查看的模型。EF 将为您提供列表,您可以在视图中显示。

  1. ViewModel 有助于实现一些业务需求。假设您需要将 name 显示为 First + Last ,因此每次需要进行连接时,您都可以拥有一个返回值的属性。
  2. 我们也可以使用数据注释来做一个基本的验证。
  3. 我们可以在不同的地方重用它,不需要创建匿名类,这在开始时很容易,但在 4-5 个月后很难维护。
  4. 此外,在转换为 JSON 等时,我们可以避免传递实体信息。考虑到您需要显示(使用 json),仅具有电子邮件 ID 并且没有任何视图模型的员工,因此我们需要序列化整个列表,其中包括个人联系电话,这不需要共享。
  5. 你也可以有包装类。您需要在出勤情况下显示员工详细信息,您需要合并两张表并创建一个维护成本非常高的匿名类。

所以我相信使用视图模型而不是将 EF 对象直接传递给视图总是一个好习惯

于 2013-08-17T09:11:38.803 回答