2011-04-08 71 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是“验证,汇总有效”。

相关问题