使用MVC应用程序应该在视图模型和/或控制器中复制我的业务规则验证吗?

时间:2010-12-07 10:39:04

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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);
      }
}

这可能不是您正在寻找的,但它可能会帮助您想出一种最大化可重复使用代码的方法,同时仍然可以自定义它。

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