DataAnnotations或在服务中手动验证?

时间:2010-09-19 21:39:09

标签: asp.net-mvc validation three-tier

每次我开始处理新的ASP.NET MVC Web应用程序时,我都不确定是否使用DataAnnotations验证。关于它的一些事情感觉不对。

例如,假设我有UserServiceCreateUserModel来自Create的{​​{1}}行为。为确保用户始终提供名称,我将模型的AccountController属性设置为具有Name属性。我现在安全地知道模型绑定器不会给我[Required],除非它有一个名字。

我的问题是,我的CreateUserModel是我系统的可重用组件,它不能依赖上面的层提供有效数据这一事实,当然也必须验证这些数据。当您考虑编写完全重用UserService的Web服务(并且没有模型绑定器为其执行所有数据注释验证)时,对此的需求会进一步突出显示。

所以我的问题是:这种情况的最佳做法是什么?使用数据注释进行验证并在服务中重复该验证?仅在服务中验证并抛出异常?两者兼而有之?

我希望我的问题不是太主观,我主要是试图就是否最终将验证转移到数据注释上来达成共识。

3 个答案:

答案 0 :(得分:7)

我在服务层执行所有验证,使用手动验证(如果x == y)和使用数据注释的组合。

要在服务层中使用数据注释,您必须使用TryValidateObject()方法手动使用Validator类。可以看到一个很好的例子here

然后,您必须将验证错误从服务层传递到控制器,并让控制器将每个错误添加到模型状态错误列表中。

答案 1 :(得分:1)

你是对的,你应该在控制器上禁用验证并在服务层验证。如果需要,您仍然可以使用DataAnnotations。服务层可以使用验证消息抛出异常,控制器可以捕获该异常并将验证消息添加到ModelState。您可以通过在控制器的OnException方法上处理验证异常来避免为每个操作执行此操作。

答案 2 :(得分:1)

我个人并不介意事情经过两次验证,只要逻辑在一个地方定义,情况就是如此。我没有足够的经验来谈论MVC,但我可以想象从服务层抛出异常只是不会给用户体验(UX),这与MVC在验证时可以提供的一样好(它可以用于实例在文本框旁边显示一条无效的错误消息。当从服务层抛出异常时,这样做要困难得多。当UX相同时,仅在服务中进行验证,否则在两个层中进行验证。