【问题标题】:How to implement business and view validation without repeating code?如何在不重复代码的情况下实现业务和视图验证?
【发布时间】:2011-08-10 21:22:21
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我认为您的业务/域对象的验证是完整的验证,不仅仅是验证值,而是执行业务规则(即 - 将商品添加到购物车 -->商品是否有库存?)

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

    我认为底线是您可能希望您的业务/域对象强制执行所有验证,而您的客户端和后端验证只是强制执行最基本的验证。

    希望对您有所帮助。

    【讨论】:

    • 很好的解释。我遵循的规则是在每个逻辑边界或层上重新验证。这意味着在 UI 层、业务层、数据库层、服务层等进行验证。
    【解决方案2】:

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

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

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

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

      • 它不是空的。
      • 这是一个有效的电子邮件地址
      • 电子邮件地址尚未使用
      • 输入的值与“确认电子邮件”框的值匹配。
    • 检查您的业务模型,检查数据是否正确。例如

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 2020-05-21
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多