扩展验证摘要HTML帮助程序以删除重复的错误消息

时间:2015-01-16 12:53:02

标签: asp.net-mvc validation

我有一个场景,需要完成10个字段中的1个。当我向10个属性中的每个属性添加错误时,这会导致验证摘要中出现相同的错误消息10次。

我看过这个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有效且没有消息。

如何通过此扩展程序删除任何重复的错误消息?

2 个答案:

答案 0 :(得分:1)

我通常不建议这样做但在某些情况下可能需要它。 我最近遇到了类似的问题,需要做同样的事情。

我没有尝试解析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); 
                    }    
                }
            }
        }
    }
}

您只需在返回视图之前调用ModelState上的扩展程序:

using WebApplication.Common;    


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

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

    return View(viewModel);
}

答案 1 :(得分:0)

  1. 你必须编写以下代码的辅助方法。

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