2009-08-07 73 views
1

我正在尝试使用ASP.NET MVC 2 Preview 1项目设置xVal。我基本上是按照http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/的例子(仅服务器端,到目前为止)。xVal错误消息出现两次

我已经注释一个博客帖子的实体,这里是邮政动作:

[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是逐字从例如博客文章)。当我提交一个完全无效的博文形式,我得到验证错误此列表:

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

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

回答

1

在ASP.Net MVC 2预览开始1我们现在得到DataAnnotation验证支持开箱即用,所以我想你的问题是,ModelBinder的逻辑运行时,它被应用DataAnnotation规则:

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

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

var errors = DataAnnotationsValidationRunner.GetErrors(post); 

这是由它们以相同顺序重复的事实来备份的。

您的代码会工作在MVC 1版罚款公众的ActionResult指数(博客帖子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)); 
} 
+0

是的,就是这样。哇,我其实并不认为注释的东西会很容易工作。无论如何,另一个错误是因为我没有设置Id值来使用私有集合(NHibernate POCO)。非常感谢! – 2009-08-10 01:19:22