2015-01-16 4 views
0

У меня есть сценарий, в котором должно быть заполнено 1 из 10 полей. Когда я добавляю ошибку к каждому из 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); 
    } 

Но я не знаю, как на самом деле заставить его работать. Когда функция расширения запускается на странице load html.ViewData.ModelState действительна и не имеет сообщений.

Как я могу удалить любые повторяющиеся сообщения об ошибках через это расширение?

+0

Почему бы не использовать '@ Html.ValidationMessageFor()' так что каждая ошибка может быть связана с собственностью? –

ответ

0

Обычно я не рекомендую это делать, но в некоторых случаях это может потребоваться. Недавно я столкнулся с подобной проблемой и должен был сделать то же самое.

Вместо того, чтобы пытаться разобрать ModelState в razor, я сделал это в контроллере, прежде чем возвращать представление. Вот расширение я использовал:

(Обратите внимание, что это hasnt были тщательно протестированы, , но, кажется, работает - я просто написал)

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); 
        }  
       } 
      } 
     } 
    } 
} 

Вам просто нужно вызвать расширение на свой контекстуальный ModelState перед возвращением вид:

using WebApplication.Common;  


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

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

    return View(viewModel); 
} 
0
  1. Вы должны Wr ite helper method, что следующий код.

    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); 
    
Смежные вопросы