2011-04-08 2 views
2

내가 할 계획이없는 미친 확장 방법을 쓰지 않으면 이것이 불가능할 수도 있습니다. ValidationSummary()은 보안을 위해 인코딩되어 있습니다. 내가 뭔가 궁금하다면 명백한 ...?Html.ValidationSummary()에서 C#을 통해 HTML 또는 새 라인/카라 기 리턴을 얻는 방법은 무엇입니까?

나는 간단한 형태로 <%= 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

답변

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는 "검증 - 요약 - 유효"입니다 통해 그것은 기본적으로 보인다.

관련 문제