2015-01-16 6 views
0

10 개의 필드 중 1 개를 완료해야하는 시나리오가 있습니다. 10 개의 속성 각각에 오류를 추가하면 유효성 검사 요약에 동일한 오류 메시지가 10 번 나타납니다.연장 유효성 검사 요약 HTML 도우미 중복 오류 메시지 제거

나는이 ValidationSummary displays duplicate messages

public static MvcHtmlString UniqueValidationSummary(this HtmlHelper html, bool excludePropertyErrors) 
    { 
     // do some filtering on html.ViewData.ModelState 
     return System.Web.Mvc.Html.ValidationExtensions.ValidationSummary(html, excludePropertyErrors); 
    } 

살펴 보았다하지만 실제로 작동하는 방법을 모르겠습니다. 확장 기능이 페이지로드에서 실행되면 html.ViewData.ModelState가 유효하며 메시지가 없습니다.

이 확장 프로그램을 통해 중복 된 오류 메시지를 제거하려면 어떻게해야합니까?

+0

왜 사용하지'@ Html.ValidationMessageFor()'각각의 오류는 속성과 연관 될 수있다? –

답변

0

일반적으로 권장하지 않지만 경우에 따라 필요할 수 있습니다. 나는 최근에 비슷한 문제에 직면하여 같은 조치를 취해야했습니다.

ModelState보기에서 razor보기를 구문 분석하는 대신보기를 반환하기 전에 컨트롤러에서했습니다. 여기 내가 사용하는 확장 :

-

using System.Collections.Generic; 
using System.Linq; 
using System.Web.Mvc; 

namespace WebApplication.Common 
{ 
    public static class ModelStateExtension 
    { 
     public static void RemoveDuplicateErrorMessages(this ModelStateDictionary modelStateDictionary) 
     { 
      //Stores the error messages we have seen 
      var knownValues = new HashSet<string>(); 

      //Create a copy of the modelstatedictionary so we can modify the original. 
      var modelStateDictionaryCopy = modelStateDictionary.ToDictionary(
       element => element.Key, 
       element => element.Value); 

      foreach (var modelState in modelStateDictionaryCopy) 
      { 
       var modelErrorCollection = modelState.Value.Errors; 
       for(var i = 0 ; i < modelErrorCollection.Count ; i++) 
       { 
        //Check if we have seen the error message before by trying to add it to the HashSet 
        if (!knownValues.Add(modelErrorCollection[i].ErrorMessage)) 
        { 
         modelStateDictionary[modelState.Key].Errors.RemoveAt(i); 
        }  
       } 
      } 
     } 
    } 
} 

(이 었소 광범위하게 테스트 한 것을, 를 참고는하지만을 작동하는 것 같군 난 그냥 쓴) 당신 확장을 호출하는 간단한 필요

using WebApplication.Common;  


if (!ModelState.IsValid) 
{ 
    //viewModel code omitted 

    ModelState.AddModelError("0", "Server Side Validation failed"); 
    ModelState.RemoveDuplicateErrorMessages(); 

    return View(viewModel); 
} 
0
  1. 당신은 WR해야한다 : 당신의 ModelState보기를 반환하기 전에에 ite 도우미 메서드는 다음과 같은 코드입니다.

    public static IHtmlString UniqueValidationSummary(ModelStateDictionary ms) 
    { 
        var resultHtml = new StringBuilder(); 
        resultHtml.Append("<div class=\"validation-summary-errors text-danger\" data-valmsg-summary=\"true\">"); 
        resultHtml.Append("<ul>"); 
    
        var isError = false; 
        var knownValues = new HashSet<string>(); 
        foreach (var key in ms.Keys) 
        { 
         foreach (var e in ms[key].Errors) 
         { 
          isError = true; 
          if (!knownValues.Contains(e.ErrorMessage)) 
          { 
           resultHtml.Append("<li>" + e.ErrorMessage + "</li>"); 
           knownValues.Add(e.ErrorMessage); 
          } 
         } 
        } 
    
        if (!isError) return null; 
    
        resultHtml.Append("</ul>"); 
        resultHtml.Append("</div>"); 
    
        return new HtmlString(resultHtml.ToString()); 
    } 
    
  2. 그런 다음보기 (.cshtml)에서 도우미 메서드를 사용할 수 있습니다.

    @MyHelper.UniqueValidationSummary(ViewData.ModelState); 
    
관련 문제