不会创建ViewModels导致冗余?从某种意义上说,我有我的领域模型,我需要在视图上显示它的数据。所以我们创建ViewModels,添加DataAnnotations并将其显示在View上。在这一点上,我有2个对象几乎相同的数据。MVC视图模型冗余
回答
正如其他人已经说过的,只有最平凡的应用程序才能将其域模型直接传递给视图。即使如此,由于很多原因,这仍然不是一个好主意。
视图的需求与数据模型的需求不同。例如,您可能在视图中需要一个字段,但在您的vie模型中可以为空。如果您添加了[[必需的]]属性,那么您的模型现在将认为此字段不可为空。
但是,我从未在视图中使用域模型的唯一最大原因是为了安全。 MVC允许你发布任何值,默认模型联编程序会很好地插入你发布到模型中的值,这意味着如果你有一个IsAdmin标志,并且有人发布了IsAdmin的真实值,那么当你保存更改到模型中,有人现在是管理员。
网络安全的第一条规则永远不会来自用户的信任输入,并将视图模型直接传递给视图基本上会放弃对数据进行消毒。
是的,这是一种冗余。但通常需要冗余来实现其他目标。在模型的情况下,视图模型和领域模型的这种分离有助于实现视图和数据存储之间的分离设置。 ViewModel并不经常是Domain的精确副本。
这意味着,可以改变而不会对其他产生影响。我可以看到这种情况很有价值 - 表中的数据类型更改不需要调用Web应用程序的部署。
因此,总而言之,尽管存在冗余,但它是系统是否足够复杂以从冗余中受益的设计选择。
不,使用ViewModel有它自己的目的。让我们来思考一下当你的视图有两个或更多来自域模型的实体时,如果没有ViewModel,你将如何组织数据?有时候某个视图所需的数据与域模型不完全相同,它可能会有更少或更多的信息,有时我们必须在呈现视图之前预先处理来自域的数据(例如,格式日期时间取决于客户端的文化)。
此外,ViewModel有助于将Web UI从域图层中分离出来。领域模型中的实体不仅仅涉及数据表示(这是视图模型的唯一目的),它们还具有模仿业务规则的操作,您不希望向不需要向过去不需要太多领域知识的UI层知道。
在99%的情况下,ViewModel不会导致重定向。
我想到的只有1%是贫血域模型和页面的简单应用,它只显示页面上的单个模型。这是内容管理页面特有的。
在任何其他情况下:
1)你的ViewModels将加入从多个域模型的信息
2)你必须特定于域模型的域逻辑
3)它不是混个好主意像您的域中的DataAnnotations这样的特定于视图的元信息
- 1. 重复使用冗余视图模型代码mvc
- 2. 冗余泛型参数?
- 3. 冗余类型参数
- 4. 冗余泛型参数
- 5. 模型和部分模型,如何避免冗余代码?
- 6. Haskell:模式匹配冗余
- 7. 冗余模式匹配
- 8. 验证模型和视图模型mvc
- 9. MVC视图模型范围
- 10. 模型视图在MVC
- 11. MVC视图模型解耦
- 12. Cassandra中的地图冗余
- 13. 单张地图冗余
- 14. SQL:ERD图 - 数据冗余。
- 15. CGContextDrawImage冗余图像绘制
- 16. ASP.NET MVC视图模型传递到不同的视图模型
- 17. MVC - 另一个模型视图中的模型视图
- 18. 连接MVC模型视图和关联的Knockout.js视图模型
- 19. ASP.NET MVC:冗余的CRUD区(强类型)的意见
- 20. 强类型的MVC视图模型
- 21. MVC PHP:如何在嵌套视图时最小化冗余数据?
- 22. CLR类冗余
- 23. Sendrecv_replace冗余?
- 24. 冗余实例
- 25. 冗余验证?
- 26. 删除冗余
- 27. 冗余铸造
- 28. Python的冗余
- 29. HDFS和冗余
- 30. 找出冗余
谢谢你的回应。填充ViewModel的最佳实践是什么(我知道我们可以使用Automapper)。我想知道是否有装载视图模型比弄乱控制器代码要做到这一点 – itsbpk 2013-03-10 13:03:58
@itsbpk其他更好的方式 - 我倾向于使用AutoMapper,但它真的很容易创建简单的映射方法为好。你可以实现这些作为扩展方法,只是说model.Map(otherModel)。无论哪种方式,它不必混乱你的控制器。 – 2013-03-10 22:12:29