2011-04-08 75 views
2

如果不寫一些我不打算做的瘋狂擴展方法,這可能是不可能的。我知道ValidationSummary()是爲了安全而編碼的。 我只是好奇,如果我失去了一些東西顯而易見...?如何通過C#在Html.ValidationSummary()中獲取HTML或新行/ Carraige Return?

我的表單中有一個簡單的<%= Html.ValidationSummary() %>。在某些情況下,會拋出錯誤,如果我可以更好地控制錯誤的出現,那將會很好。

例如 - 當我導入CSV文件,我把下面的錯誤給ValidationSummary()如果標頭不以可接受的格式或包含特殊字符:

constraintValidatorContext.AddInvalid(invalidHeaders.Count() == 1 
         ? string.Format("The following column header is invalid: {0}.", badHeaders) 
         : string.Format("There were multiple invalid column headers including: {0}.", badHeaders), "General"); 

這將是,如果我能膨脹在列表中顯示所述多個標頭如下

string.Format("There were multiple invalid column headers including: <li>{0}</li>", badHeaders) 

這將顯示HTML。 即使我可以在這裏或那裏拋出一個NewLine,這將是有益的(\ n \ r) ...我只是無知的東西?

+2

那麼,我最終寫了自己的擴展。 – driushkin 2011-04-08 12:51:01

回答

1

換行符在HTML中沒有效果,你想要一個<br />標籤。

您可以隨時滾動以獲得對輸出的更多控制。這是該幫手的MVC2源代碼。它基本上看起來通過

public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message, IDictionary<string, object> htmlAttributes) { 
     if (htmlHelper == null) { 
      throw new ArgumentNullException("htmlHelper"); 
     } 

     FormContext formContext = htmlHelper.ViewContext.GetFormContextForClientValidation(); 
     if (formContext == null && htmlHelper.ViewData.ModelState.IsValid) { 
      return null; 
     } 

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

     StringBuilder htmlSummary = new StringBuilder(); 
     TagBuilder unorderedList = new TagBuilder("ul"); 

     IEnumerable<ModelState> modelStates = null; 
     if (excludePropertyErrors) { 
      ModelState ms; 
      htmlHelper.ViewData.ModelState.TryGetValue(htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, out ms); 
      if (ms != null) { 
       modelStates = new ModelState[] { ms }; 
      } 
     } 
     else { 
      modelStates = htmlHelper.ViewData.ModelState.Values; 
     } 

     if (modelStates != null) { 
      foreach (ModelState modelState in modelStates) { 
       foreach (ModelError modelError in modelState.Errors) { 
        string errorText = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, null /* modelState */); 
        if (!String.IsNullOrEmpty(errorText)) { 
         TagBuilder listItem = new TagBuilder("li"); 
         listItem.SetInnerText(errorText); 
         htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal)); 
        } 
       } 
      } 
     } 

     if (htmlSummary.Length == 0) { 
      htmlSummary.AppendLine(_hiddenListItem); 
     } 

     unorderedList.InnerHtml = htmlSummary.ToString(); 

     TagBuilder divBuilder = new TagBuilder("div"); 
     divBuilder.MergeAttributes(htmlAttributes); 
     divBuilder.AddCssClass((htmlHelper.ViewData.ModelState.IsValid) ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName); 
     divBuilder.InnerHtml = messageSpan + unorderedList.ToString(TagRenderMode.Normal); 

     if (formContext != null) { 
      // client val summaries need an ID 
      divBuilder.GenerateId("validationSummary"); 
      formContext.ValidationSummaryId = divBuilder.Attributes["id"]; 
      formContext.ReplaceValidationSummary = !excludePropertyErrors; 
     } 
     return divBuilder.ToMvcHtmlString(TagRenderMode.Normal); 
    } 

ValidationSummaryValidCssClassName是「驗證,彙總錯誤」和ValidationSummaryValidCssClassName是「驗證,彙總有效」。

相關問題