1

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

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

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

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

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

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

4

1 回答 1

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);
      }
}

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

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

于 2010-12-07T13:12:18.067 回答