自定义@ Html.ValidationSummary excludePropertyErrors

时间:2016-05-19 20:59:52

标签: c# asp.net-mvc

我有业务要求只显示@ Html.ValidationSummary中的前5个错误。我创建了一个ValidationSummaryLimited htmlhelper,但我无法弄清楚如何实现excludePropertyErrors块。

public static string ValidationSummaryLimited(this HtmlHelper helper, bool excludePropertyErrors = false, string message = "")
{
    const int maximumValidations = 5;

    if (helper.ViewData.ModelState.IsValid)
        return string.Empty;

    StringBuilder sb = new StringBuilder();

    if (!string.IsNullOrEmpty(message))
    {
        sb.AppendFormat("<span>{0}</span>{1}", helper.Encode(message), System.Environment.NewLine);
    }

    sb.AppendLine("<div class=\"validation-summary-errors\" data-valmsg-summary=\"true\">");
    sb.AppendLine("\t<ul>");

    int count = 0;
    foreach (var key in helper.ViewData.ModelState.Keys) 
    {
        foreach (var err in helper.ViewData.ModelState[key].Errors)
        {
            count++;
            sb.AppendFormat("\t\t<li>{0}</li>{1}", helper.Encode(err.ErrorMessage),System.Environment.NewLine);

            if (count >= RVConstants.MaximumValidationErrors)
            {
                sb.AppendFormat("\t\t<li>Maximum of {0} errors shown</li>{1}",
                    maximumValidations, 
                    System.Environment.NewLine);
                break;
            }
        }

        if (count >= maximumValidations)
            break;
    }

    return sb.ToString();
}

1 个答案:

答案 0 :(得分:0)

我最终利用现有的验证摘要。以下是我提出的建议:

public static MvcHtmlString ValidationSummaryLimited(this HtmlHelper helper,
    bool excludePropertyErrors)
{
    MvcHtmlString result = helper.ValidationSummary(excludePropertyErrors);
    return LimitSummaryResults(result);
}

private static MvcHtmlString LimitSummaryResults(MvcHtmlString summary)
{
    if (summary == null || summary.ToString() == string.Empty)
        return summary;

    int maximumValidations = RVConstants.MaximumValidationErrors;

    Regex exp = new Regex(@"<li[^>]*>[^<]*</li>",RegexOptions.IgnoreCase);

    string htmlString = summary.ToHtmlString();
    MatchCollection matches = exp.Matches(htmlString);

    if (matches.Count > maximumValidations)
    {
        string header = htmlString.Substring(0, htmlString.IndexOf("<ul>",StringComparison.Ordinal) + "<ul>".Length);
        string footer = htmlString.Substring(htmlString.IndexOf("</ul>", StringComparison.Ordinal));

        StringBuilder sb = new StringBuilder(htmlString.Length);
        sb.Append(header);

        for (int i = 0; i < maximumValidations; i++)
        {
            sb.Append(matches[i].Value);
        }

        sb.AppendFormat("<li>Maximum of {0} errors shown</li>", maximumValidations);

        sb.Append(footer);

        string limited = sb.ToString();
        return new MvcHtmlString(limited);
    }

    return summary;
}