1

创建 ViewModel 不会导致冗余吗?从某种意义上说,我有我的域模型,我需要在视图上显示来自它的数据。所以我们创建 ViewModels,添加 DataAnnotations 并将其显示在 View 上。此时我有 2 个具有几乎相同数据的对象。

4

4 回答 4

2

正如其他人已经说过的那样,只有最简单的应用程序才能将其域模型直接传递给视图。即使那样,由于很多原因,它仍然不是一个好主意。

视图的要求与数据模型的要求不同。例如,您可能有一个字段在您的视图中是必需的,但在您的 vie 模型中可以为空。如果您添加一个“[必需]”属性,那么您的模型现在将认为该字段不可为空。

然而,我从不在视图中使用域模型的最大原因是为了安全。MVC 允许您向其发布任何值,并且默认模型绑定器会愉快地将您发布的值插入模型中,这意味着如果您有一个 IsAdmin 标志,并且有人为 IsAdmin 发布了一个真实值,那么当您将更改保存到模型,有人现在是管理员。

Web 安全的第一条规则是永远不要信任来自用户的输入,并且将视图模型直接传递给视图基本上放弃了对数据的清理。

于 2013-03-09T18:12:16.497 回答
1

是的,这是一种冗余形式。但通常需要冗余来实现其他目标。在模型的情况下,视图模型和域模型的这种分离有助于实现视图和数据存储之间的解耦设置。ViewModel 并不经常是 Domain 的精确副本。

这意味着,任何一个都可以改变而不会影响其他。我可以看到这很有价值的情况 - 表中的数据类型更改不需要部署 Web 应用程序。

因此,总而言之,虽然存在冗余,但系统是否足够复杂以从这种冗余中受益是一个设计选择。

于 2013-03-09T16:04:44.677 回答
0

在 99% 的情况下,ViewModel 不会导致冗余。

我想到的唯一 1% 是带有贫乏领域模型和页面的简单应用程序,它在页面上只显示一个模型。这是内容管理页面特有的。

在任何其他情况下:
1)您的 ViewModel 将加入来自多个域模型的信息
2)您将在域模型中具有特定于您的域的逻辑
3)将特定于视图的元信息(如 DataAnnotations)混合到您的域中不是一个好主意

于 2013-03-09T16:10:12.750 回答
0

不,使用 ViewModel 有它自己的目的。让我们考虑一下当您的视图有两个或更多来自域模型的实体时,如果没有 ViewModel,您将如何组织数据?有时视图所需的数据与域模型并不完全一样,它可以包含更少或更多的信息,有时我们必须在渲染视图之前对域中的数据进行预处理(例如,格式化日期时间取决于客户的文化)。

此外,ViewModel 有助于将 Web UI 与域层分离。领域模型中的实体不仅仅是数据表示(这是视图模型的唯一目的),它们还具有模仿业务规则的操作,您不希望将太多领域知识暴露给不需要的 UI 层要知道。

于 2013-03-09T16:05:31.023 回答