如何在不重复代码的情况下实现业务和查看验证?

时间:2011-08-10 21:22:22

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

如何避免在我的ViewModel和业务/域对象上重复验证规则?

例如,我可以在我的ViewModel上使用DataAnnotation属性,这将在我的MVC Web应用程序中为我提供客户端和服务器端验证。但是这个ViewModel通常会被映射到一个业务/域对象并被赋予服务预先形成一些业务逻辑,这意味着验证必须再次发生,通常使用相同或类似的规则。无论如何围绕这个吗?

2 个答案:

答案 0 :(得分:6)

我认为你所描述的是正常的和可接受的。将您的UI和数据注释视为友好的UI验证,能够立即向用户显示输入数据的任何验证问题。

我会认为您的Business / Domain对象的验证是完整的验证,不仅仅是验证值,而是强制执行业务规则(例如 - 将项目添加到购物车 - >库存中的物品是什么?)

然后总是有后端验证,通常由数据库强制执行(即允许列中的空值)。除非您的数据库允许在所有字段中使用空值,否则您实际执行的验证不仅仅是您提到的两个地方,而且我认为这是一件好事。

我认为最重要的是,您可能希望您的Business / Domain对象强制执行所有验证,并且您的客户端和后端验证只需执行最基本的验证。

希望有所帮助。

答案 1 :(得分:0)

如果你想验证两个独立的对象并避免重复代码,那么我想你可能会找到一个你不想听的答案。

我能想到的唯一例外是获取返回的视图模型(未经验证)并填充模型,就像执行数据库操作一样,然后在那里进行验证检查。如果有错误,请将它们带回ModelState字典并将视图返回给浏览器并显示错误。这种方法有很大的副作用,你会失去客户端集成,或者充其量 - 它涉及到服务器端的大量AJAX调用。

就个人而言,我接受失败并接受你将会重复工作,并确保尽可能多的代码可重复使用(例如,可以放在你的两个视图模型上的数据注释属性)和商业模式。

  • 检查您的视图模型应确保提供的信息是正确的,例如:

    • 它不是空的。
    • 有效的电子邮件地址
    • 电子邮件地址尚未使用
    • 输入的值与“确认电子邮件”框的值相匹配。
  • 检查您的商家模式,检查数据是否正确。 e.g。

    • 它不是空的。
    • 长度小于最大长度。

但是,对于业务逻辑,如果您担心数据可能会被替代接口的不一致检查(或您的遗忘)污染,那么将一些方法复制到业务逻辑或模型元数据中。