2009-08-07 71 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