xVal错误消息出现两次

时间:2009-08-07 01:42:05

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

我正在尝试使用ASP.NET MVC 2 Preview 1项目设置xVal。我基本上遵循http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/处的示例(仅限服务器端,到目前为止)。

我注释了一个BlogPost实体,这里是Post动作:

[HttpPost]
public ActionResult Index(BlogPost b)
{
    try
    {
        _blogService.Insert(b);
    }
    catch (RulesException ex)
    {
        ex.AddModelStateErrors(ModelState, "");
    }

    return (View(b));
}

这是服务方法:

public void Insert(BlogPost post)
{
    var errors = DataAnnotationsValidationRunner.GetErrors(post);
    if(errors.Any())
    {
        throw new RulesException(errors);
    }

    _blogRepo.Insert(post);
}

(请注意,DataAnnotationsValidationRunner是示例博客文章中的逐字记录)。当我提交完全无效的BlogPost表单时,我会收到验证错误列表:

  • 需要一个值。
  • 请输入标题
  • 请输入发布日期
  • 请输入一些内容
  • 请输入标题
  • 请输入发布日期
  • 请输入一些内容

我甚至不知道第一条消息是什么,但正如您所看到的,其他错误出现了两次。我究竟做错了什么?或者这是MVC V2的问题吗?

1 个答案:

答案 0 :(得分:1)

从ASP.Net MVC 2 Preview 1开始,我们现在开始使用DataAnnotation验证支持,所以我猜你的问题是当ModelBinder逻辑运行时它正在应用DataAnnotation规则:

public ActionResult Index(BlogPost b) //Create BlogPost object and apply rules

然后使用您的XVal逻辑再次请求检查:

var errors = DataAnnotationsValidationRunner.GetErrors(post);

这可以通过它们以相同的顺序重复来支持。

您的代码在MVC版本1中运行良好,因为 公共ActionResult索引(BlogPost b) 不会运行DataAnnotation规则。如果可以关闭新的DataAnnotation逻辑并且只使用XVal,我没有在任何地方阅读。

Scott's post able preview 1

上有关于此的更多信息

要找出第一项运行调试的内容并检查ModelState上的错误,因为这将告诉您错误与对象相关的属性。

[HttpPost]
public ActionResult Index(BlogPost b)
{
    try
    {
        _blogService.Insert(b); //Add breakpoint here and check ModelState
    }
    catch (RulesException ex)
    {
        ex.AddModelStateErrors(ModelState, "");
    }

    return (View(b));
}