【问题标题】:Extend Validation Summary HTML Helper to remove duplicate error messages扩展验证摘要 HTML 帮助程序以删除重复的错误消息
【发布时间】:2015-01-16 12:53:02
【问题描述】:

我有一个场景需要完成 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 有效且没有消息。

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

【问题讨论】:

  • 为什么不使用@Html.ValidationMessageFor() 这样每个错误都可以与属性相关联?

标签: asp.net-mvc validation


【解决方案1】:
  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. 然后,您可以使用 view(.cshtml) 中的辅助方法。

        @MyHelper.UniqueValidationSummary(ViewData.ModelState);
    

【讨论】:

    【解决方案2】:

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

    我没有尝试在razor 视图中解析ModelState,而是在返回视图之前在控制器中进行了解析。这是我使用的扩展:

    请注意这还没有经过广泛的测试,但似乎可以工作 - 我只是写了它)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多