2009-12-21 72 views
0

好吧,假設您的視圖有四個部分(每個都有獨立的視圖模型),它們都與主視圖模型相關聯。你點擊提交和你的所有數據文章。您運行一些服務器端驗證,您注意到驗證錯誤發生在4個部分中的3個字段中。所以,我想回發驗證錯誤,但高於他們所屬的部分。ASP.NET MVC用戶消息傳遞實現

你有什麼實現想法?

回答

2

有趣的場景。如果我理解正確:您想要驗證複雜的表單帖子,並且無效,請將其返回到視圖並在各自表單區域上方顯示錯誤消息。您無法使用<%= Html.ValidationSummary()%>的原因是,您需要對錶單的不同區域使用不同的摘要,具體取決於什麼是有效的,哪些不是?

帶上一粒鹽,但我會做的是寫一個自定義的HtmlHelper爲每個表單區域或部分。您可以將您的自定義代碼基於Html.ValidationSummary的當前實現並找到代碼here。在每個自定義驗證摘要中,您都可以在ModelState中查找特定錯誤並顯示這些錯誤。我沒有太多的時間,還沒有測試,但是這可能讓你開始:

public static class CustomValidationExtensions 
{ 
    public static string CustomValidationSummary(this HtmlHelper htmlHelper) 
    { 
     if (!htmlHelper.ViewData.ModelState.ContainsKey("YourFormName")) 
      return null; 

     ModelState modelState = htmlHelper.ViewData.ModelState["YourFormName"]; 
     ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors; 
     ModelError modelError = ((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors[0]; 

     if (modelError == null) 
      return null; 

     TagBuilder builder = new TagBuilder("span"); 
     builder.MergeAttribute("class", HtmlHelper.ValidationMessageCssClassName); 
     builder.SetInnerText(modelError.ErrorMessage); 

     return builder.ToString(TagRenderMode.Normal); 
    } 
} 

這隻能檢查一個ModelState中元素和顯示一些HTML。您需要手動添加所有的ModelState元素,或者循環播放集合,並僅顯示適用於該部分視圖的錯誤消息。無論哪種方式,我覺得你最好的選擇是向ModelState添加錯誤的典型方法,並直接使用ModelState來顯示適用於該部分的錯誤。當然,您可以操作html並根據您的輸出做任何事情。