9

每次我开始开发新的 ASP.NET MVC Web 应用程序时,我都不确定是否要使用DataAnnotations验证。感觉有些不对劲。

例如,假设我有UserService一个CreateUserModel从. 为了确保用户始终提供名称,我将模型的属性设置为具有该属性。我现在知道模型活页夹永远不会给我 a除非它有一个名字。CreateAccountControllerName[Required]CreateUserModel

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

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

我希望我的问题不是太主观,我主要是想就将验证转移到数据注释是否最终会咬我一口达成共识。

4

3 回答 3

7

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

要在您的服务层中使用数据注解,您必须使用该方法手动使用ValidatorTryValidateObject()。一个很好的例子可以在这里看到。

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

于 2010-09-22T20:25:13.060 回答
1

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

于 2010-09-20T03:29:46.550 回答
1

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

于 2010-09-20T18:43:00.923 回答