2011-03-07 21 views
3

是否有一種方法可以自定義validationSummary,以便它可以輸出定位標籤,其HREF是摘要中驗證消息顯示的字段的名稱對於?這樣,使用jquery,我可以添加onclick事件,當點擊驗證摘要上的錨點標籤時,將重點關注字段。如何在驗證消息前的驗證摘要中獲取錯誤字段的ID

這主要針對有視覺障礙的人,這樣當出現錯誤時,驗證摘要將重點關注,它們將選項卡顯示到錯誤條目中,具有字段標籤的錨定標記將重點關注,屏幕閱讀器將讀取錨點,那麼他們可以點擊錨點專注於錯誤的領域。

< a href =「#First_Name」>名字</a> - 請輸入您的名字。

謝謝。

回答

4

我不認爲框架中有任何功能,因此您需要使用自定義擴展方法。例如:

public static string AccessibleValidationSummary(this HtmlHelper htmlHelper, string message, IDictionary<string, object> htmlAttributes) 
    { 
     // Nothing to do if there aren't any errors 
     if (htmlHelper.ViewData.ModelState.IsValid) 
     { 
      return null; 
     } 

     string messageSpan; 
     if (!String.IsNullOrEmpty(message)) 
     { 
      TagBuilder spanTag = new TagBuilder("span"); 
      spanTag.MergeAttributes(htmlAttributes); 
      spanTag.MergeAttribute("class", HtmlHelper.ValidationSummaryCssClassName); 
      spanTag.SetInnerText(message); 
      messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine; 
     } 
     else 
     { 
      messageSpan = null; 
     } 

     StringBuilder htmlSummary = new StringBuilder(); 
     TagBuilder unorderedList = new TagBuilder("ul"); 
     unorderedList.MergeAttributes(htmlAttributes); 
     unorderedList.MergeAttribute("class", HtmlHelper.ValidationSummaryCssClassName); 

     foreach (string key in htmlHelper.ViewData.ModelState.Keys) 
     { 
      ModelState modelState = htmlHelper.ViewData.ModelState[key]; 
      foreach (ModelError modelError in modelState.Errors) 
      { 
       string errorText = htmlHelper.ValidationMessage(key); 
       if (!String.IsNullOrEmpty(errorText)) 
       { 
        TagBuilder listItem = new TagBuilder("li"); 

        TagBuilder aTag = new TagBuilder("a"); 
        aTag.Attributes.Add("href", "#" + key); 
        aTag.InnerHtml = errorText; 
        listItem.InnerHtml = aTag.ToString(TagRenderMode.Normal); 
        htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal)); 
       } 
      } 
     } 

     unorderedList.InnerHtml = htmlSummary.ToString(); 

     return messageSpan + unorderedList.ToString(TagRenderMode.Normal); 
    } 

這是使用框架內現有的擴展方法並更改插入到列表中的標記。這是一個快速的樣品,有一些事情使用本品前要考慮:

  • 這不編碼錯誤消息,因爲我已經使用了現有html.ValidationMessage。如果您需要對消息進行編碼,那麼您需要包含代碼以提供默認消息和任何本地化要求。
  • 由於使用了現有的ValidationMessage方法,在錨點中有一個span標記。如果你想整理你的HTML,那麼這應該被替換。
  • 這是通常過載中最複雜的。如果你想使用一些簡單的例如html.ValidationSummary()那麼你需要創建相關的簽名並調用所提供的方法。
+0

輝煌的解決方案! – user648490