创建ViewModel会导致冗余吗?在某种意义上,我有我的域模型,我需要在视图上显示它的数据。因此,我们创建ViewModel,向其添加DataAnnotations并在View上显示它。此时我有2个具有几乎相同数据的对象。
答案 0 :(得分:2)
正如其他人已经说过的那样,只有最简单的应用程序才能将其域模型直接传递给视图。即便如此,由于很多原因,它仍然不是一个好主意。
您的视图要求与数据模型的要求不同。例如,您可能在视图中有一个所需的字段,但在您的视图模型中可以为空。如果添加“[必需]”属性,那么您的模型现在将认为该字段不可为空。
但是,我从未在视图中使用域模型的唯一原因是安全性。 MVC允许您向其发布任何值,默认模型绑定器将很乐意插入您发布到模型中的值,这意味着如果您有一个IsAdmin标志,并且有人为IsAdmin发布了一个真值,那么当您将更改保存到模特,有人现在是管理员。
网络安全的第一条规则绝不是来自用户的信任输入,将视图模型直接传递给视图基本上会放弃对数据进行清理。
答案 1 :(得分:1)
是的,这是一种冗余形式。但实现其他目标通常需要冗余。对于模型,将视图模型和域模型分开有助于实现视图和数据存储之间的分离设置。并且ViewModels通常不是Domain的精确副本。
这意味着,要么可以改变而不会对其他人产生影响。我可以看到这有用的情况 - 表中的数据类型更改不需要调用Web应用程序的部署。
因此,总而言之,虽然存在冗余,但系统是否足够复杂以便从这种冗余中受益是一种设计选择。
答案 2 :(得分:0)
不,使用ViewModel有其自己的目的。让我们考虑一下当您的视图中有两个或更多来自域模型的实体而没有ViewModel的情况时,您将如何组织数据?某个时候视图所需的数据与域模型不完全相同,它可以具有 我们必须在渲染视图之前预先处理来自域的数据(例如,格式日期时间取决于客户的文化)。
此外,ViewModel有助于将Web UI与域层分离。域模型中的实体不仅仅是数据表示(这是视图模型的唯一目的),它们还具有模仿业务规则的操作,您不希望向不需要的UI层暴露太多的域知识知道。
答案 3 :(得分:0)
在99%的情况下,ViewModel不会导致redundency。
我想到的只有1%是简单的应用程序,贫血的域模型和页面,只显示页面上的单个模型。这是内容管理页面所特有的。
在任何其他情况下:
1)您的ViewModels将加入来自多个域模型的信息
2)您将在域模型中具有特定于您的域的逻辑
3)将特定于视图的元信息(如DataAnnotations)混合到您的域中并不是一个好主意