使用数据注释进行MVC验证 - 模型类或视图模型类?

时间:2010-07-26 20:53:34

标签: asp.net-mvc validation asp.net-mvc-2 data-annotations

最佳做法是在模型或视图模型中放置数据验证注释吗?一种方法优于另一种方法的优点/缺点是什么?

很想知道每个人都在进行验证,我目前正在模型项目中进行。但是我看到有些人说这不是最好的做法。

4 个答案:

答案 0 :(得分:10)

就最佳实践而言,我会说:两者都没有。验证应该是分开的。 FluentValidation等框架允许您将验证逻辑与模型完全分开。但是为了回答你的问题,我会将验证放入View Models中,因为那些是你绑定控制器操作的类。您还可以拥有多个与同一模型绑定但具有不同验证规则的View模型。

答案 1 :(得分:4)

将您的注释放在Viewmodel中。

每个DataModel都可以有多个ViewModel,例如DisplayModel,EditModel,ListModel ..所有这些都可能需要不同的注释。

通常认为最佳做法是不要将DataModel直接暴露给视图,特别是在“POST”/编辑方案中。

我建议阅读Brad Wilson的优秀概述:http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

这些文章主要介绍了在MVC2中使用Dislpay和Edit模板,但清楚地说明了使用ViewModel模式的优势

答案 2 :(得分:1)

如果你遵循单一责任,那么它应该进入它自己的组件。话虽这么说,如果你想做一个捷径,它可以在ViewModel中进行。但绝对不应该进入模型。您的模型应该是“纯”数据。没有业务规则和验证是业务规则。

答案 3 :(得分:0)

我的意见是:这取决于。 我通常在控制器和模型中控制输入,因此输入在控制器和模型中都是有效的。这是为了防止我想将模型与另一种应用程序联系起来。说,WPF。

然而,很多人也采用“防御性编程”。这意味着检查函数(参数)的每个输入。在这种情况下,可以多次检查一个输入,但是即使您更改了某些内容,也可以确保验证逻辑成立。

所以对我来说,有几个问题出现了:

1)是否有可能存在绕过验证逻辑的情况。就像将模型绑定到wpf应用程序一样。

2)我是否希望通过检查每个函数中的输入来降低性能而不是确保安全性?

对于我this关于跨领域问题的文章也有帮助。

这是我对此事的看法。希望它有所帮助