【问题标题】:With an MVC application should my business rule validation be replicated in the view model and/or controller?对于 MVC 应用程序,我的业务规则验证是否应该在视图模型和/或控制器中复制?
【发布时间】:2011-05-21 12:23:46
【问题描述】:

我的 MVC 应用程序有一个定义良好的领域模型,每个模型都执行自己的业务规则检查。

我的问题是业务规则是否也应该在视图模型或控制器中复制,还是应该只允许模型生成验证错误?

让我们假设我们所说的验证不能在客户端完成,并且比可以通过向视图模型属性添加验证属性来完成的简单字段验证更复杂。

允许模型处理所有验证的问题在于,它生成的错误消息可能不适合与其耦合的特定视图,例如,字段名称可能不正确。此外,我需要使用视图模型属性名称而不是域模型中的属性名称将错误添加到 ModelState。

向视图模型/控制器添加相同的业务规则验证的问题是明显的重复维护问题,这意味着我的域模型中的验证真的不应该产生任何错误,这使得它有点毫无意义。

人们通常如何处理这个问题?

【问题讨论】:

    标签: asp.net-mvc model-view-controller business-rules


    【解决方案1】:

    我通常在这种情况下使用的解决方案是在模型中进行验证(或者在我的情况下通常是验证库),但在控制器中添加错误,这样您就可以捕获标准验证错误,如下所示:

    public ActionResult Submit(String email)
    {
          string errorMessage = "";
    
          if(Validation.IsValidEmail(email, out errorMessage))
          {
             ViewData.AddModelError("EmailAddress", "My Custom Error Message");
    
             //or
    
             ViewData.AddModelError("EmailAddress", errorMessage);
          }
    }
    

    这可能不是您正在寻找的,但它可能会帮助您想出一种在最大限度地提高可重用代码的同时仍然能够对其进行自定义的方法。

    我曾经这样做过 - 但我咬紧牙关,我最近的应用程序到处都使用标准错误消息 - 我这样做的动机是用户越来越习惯于简短的验证消息,并且不需要字段名称如果消息与表单字段内联而不是作为摘要显示,则消息。这也允许我将所有规则/消息放入数据注释中,我发现它很有效。

    【讨论】:

    • 谢谢 Rob,所以您的 Validation.IsValidEmail 代码是您的域模型的一部分,允许从域模型和控制器调用它?
    • 是的 - 但它甚至不必仅限于您当前的项目域 - 许多这些类型的库可以跨多个域工作,这只是想出聪明的方法来使您的生活简单,无需将代码紧密耦合到给定项目(在可能的情况下)。通常初始设置时间较长,但投资回报率通常很高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2011-01-22
    • 2011-03-01
    • 2011-11-15
    相关资源
    最近更新 更多