2013-03-09 115 views
1

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

回答

1

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

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

但是,我从未在视图中使用域模型的唯一最大原因是为了安全。 MVC允许你发布任何值,默认模型联编程序会很好地插入你发布到模型中的值,这意味着如果你有一个IsAdmin标志,并且有人发布了IsAdmin的真实值,那么当你保存更改到模型中,有人现在是管理员。

网络安全的第一条规则永远不会来自用户的信任输入,并将视图模型直接传递给视图基本上会放弃对数据进行消毒。

+0

谢谢你的回应。填充ViewModel的最佳实践是什么(我知道我们可以使用Automapper)。我想知道是否有装载视图模型比弄乱控制器代码要做到这一点 – itsbpk 2013-03-10 13:03:58

+0

@itsbpk其他更好的方式 - 我倾向于使用AutoMapper,但它真的很容易创建简单的映射方法为好。你可以实现这些作为扩展方法,只是说model.Map(otherModel)。无论哪种方式,它不必混乱你的控制器。 – 2013-03-10 22:12:29

1

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

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

因此,总而言之,尽管存在冗余,但它是系统是否足够复杂以从冗余中受益的设计选择。

0

不,使用ViewModel有它自己的目的。让我们来思考一下当你的视图有两个或更多来自域模型的实体时,如果没有ViewModel,你将如何组织数据?有时候某个视图所需的数据与域模型不完全相同,它可能会有更少或更多的信息,有时我们必须在呈现视图之前预先处理来自域的数据(例如,格式日期时间取决于客户端的文化)。

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

0

在99%的情况下,ViewModel不会导致重定向。

我想到的只有1%是贫血域模型和页面的简单应用,它只显示页面上的单个模型。这是内容管理页面特有的。

在任何其他情况下:
1)你的ViewModels将加入从多个域模型的信息
2)你必须特定于域模型的域逻辑
3)它不是混个好主意像您的域中的DataAnnotations这样的特定于视图的元信息