自定义验证摘要

时间:2011-06-20 09:10:45

标签: asp.net-mvc-2 validation

我使用了html.ValidationSummary来显示页面顶部的所有错误。 这将在页面顶部呈现包含错误的列表。

示例:

<ul>
<li>UserName is invalid</li>
</ul>

我有时需要将每个项目而不是列表呈现为自定义div,其中包含其他html标记。

我需要将每一行渲染为下面的简短示例(这只是一行):

<div>
<div class="right"><a href="#closeError">Close error</div>
<div class="right"><a href="#Update">Update Field</div>
<label>Error:</label> Name on the page is invalid.
</div>

您对如何实现此渲染有何看法? 我已经考虑创建html帮助程序,我将采用ModelState并获取所有错误,但不确定这将有效...

1 个答案:

答案 0 :(得分:2)

  

我已经考虑创建html帮助器,我将使用ModelState并获取所有错误,但不确定这是否有效......

为什么不起作用?

public static class ValidationExtensions
{
    public static IHtmlString MyValidationSummary(this HtmlHelper htmlHelper)
    {
        var formContext = htmlHelper.ViewContext.ClientValidationEnabled 
            ? htmlHelper.ViewContext.FormContext 
            : null;
        if (formContext == null && htmlHelper.ViewData.ModelState.IsValid)
        {
            return null;
        }

        var sb = new StringBuilder();
        var htmlSummary = new TagBuilder("div");
        var modelStates = htmlHelper.ViewData.ModelState.Values;
        sb.AppendLine("<div class=\"right\"><a href=\"#closeError\">Close error</div>");
        sb.AppendLine("<div class=\"right\"><a href=\"#Update\">Update Field</div>");

        if (modelStates != null)
        {
            foreach (ModelState modelState in modelStates)
            {
                foreach (ModelError modelError in modelState.Errors)
                {
                    var userErrorMessageOrDefault = GetUserErrorMessageOrDefault(modelError);
                    if (!string.IsNullOrEmpty(userErrorMessageOrDefault))
                    {
                        sb.AppendFormat("<label>Error:</label> {0}{1}", htmlHelper.Encode(userErrorMessageOrDefault), Environment.NewLine);
                    }
                }
            }
        }

        htmlSummary.InnerHtml = sb.ToString();
        if (formContext != null)
        {
            formContext.ReplaceValidationSummary = true;
        }
        return MvcHtmlString.Create(htmlSummary.ToString(TagRenderMode.Normal));
    }

    private static string GetUserErrorMessageOrDefault(ModelError error)
    {
        if (!string.IsNullOrEmpty(error.ErrorMessage))
        {
            return error.ErrorMessage;
        }
        return null;
    }
}

然后:

<%= Html.MyValidationSummary() %>