在哪里以及如何验证和映射ViewModel?

时间:2010-05-07 05:54:40

标签: asp.net-mvc validation domain-driven-design viewmodel

我正在尝试学习领域驱动设计,并且最近读到许多人主张为您的视图创建一个ViewModel,它存储您想要在给定视图中显示的所有值。

我的问题是如何进行表单验证?我应该为每个视图创建单独的验证类,还是将它们组合在一起?我也对代码中的内容感到困惑。

这就是我目前认为验证和视图模型符合事物方案的方式:

查看(某些用户输入) - >控制器 - > FormValidation(ViewModel) - > (如果有效映射到ViewModel到域模型) - >域层服务 - >基础设施

谢谢!

P.S。我使用Asp.net MVC和C#

4 个答案:

答案 0 :(得分:0)

我建议您将验证规则放在域模型中。这是最简单和最重复的方式(例如,使用System.ComponentModel.DataAnnotations - MVC 2默认模型绑定器支持它开箱即用)。
如果你有复杂的大型域模型,并且你不会遇到具有相同名称的映射属性 - 请尝试使用AutoMapper,这是执行此类工作的绝佳工具。

答案 1 :(得分:0)

验证表示层上的视图模型。请记住,您应该仅验证与演示文稿相关的验证(日期格式正确,名称!=“”等)。

Asp.net Mvc有一些in-built validation support通常足以进行基本验证。

应用域驱动设计时的棘手部分是域验证。可能存在复杂的规则,对存储库的依赖性以及类似的东西,可以使“验证运行”而不会使domain model dumb变得非常困难。

因此 - 永远不要让域对象滑入invalid状态并在发生这种情况时抛出异常似乎是一个好主意。


最好不要尝试将视图模型机械地映射到域模型 - 这种方法会增加耦合,可能会破坏您的域模型的封装并使其变暗。

答案 2 :(得分:0)

我一直在尝试将表单验证放在ViewModel中,对于复杂的业务验证,我使用服务层。

这实际上已经很好了,而且代码更容易阅读和维护

答案 3 :(得分:0)

这是一个常见的问题,而且它并不总是有一个正确的答案。查看Derick Bailey的this post。这是对这个问题的一个很好的讨论,并且在这个问题上有一些与其他一些伟大帖子的链接。