Asp.net mvc 2 自定义验证摘要

Asp.net mvc 2 自定义验证摘要,asp.net-mvc-2,validation,Asp.net Mvc 2,Validation,我使用了html.ValidationSummary来获取页面顶部显示的所有错误。 这将在页面顶部呈现带有错误的列表 例如: <ul> <li>UserName is invalid</li> </ul> 用户名无效 我曾经需要渲染每个项目,而不是将列表作为自定义div,并在其中添加html标记 我需要将每一行渲染为下面的简短示例(这只是一行): 闭合误差 更新字段 错误:页面上的名称无效。 您对如何实现这种渲染有何看法? 我已经考虑过

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

例如:

<ul>
<li>UserName is invalid</li>
</ul>
  • 用户名无效
我曾经需要渲染每个项目,而不是将列表作为自定义div,并在其中添加html标记

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


闭合误差
更新字段
错误:页面上的名称无效。
您对如何实现这种渲染有何看法? 我已经考虑过创建html帮助程序,在那里我将获取ModelState并获取所有错误,但不确定这是否有效

我已经考虑过创建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;
    }
}
公共静态类ValidationExtensions
{
公共静态IHtmlString MyValidationSummary(此HtmlHelper HtmlHelper)
{
var formContext=htmlHelper.ViewContext.ClientValidationEnabled
?htmlHelper.ViewContext.FormContext
:null;
if(formContext==null&&htmlHelper.ViewData.ModelState.IsValid)
{
返回null;
}
var sb=新的StringBuilder();
var htmlSummary=新标记生成器(“div”);
var modelStates=htmlHelper.ViewData.ModelState.Values;
sb.附加线(“闭合错误”);
sb.附录行(“更新字段”);
if(modelStates!=null)
{
foreach(ModelState中的ModelState)
{
foreach(modelState.Errors中的ModelError ModelError)
{
var userErrorMessageOrDefault=GetUserErrorMessageOrDefault(modelError);
如果(!string.IsNullOrEmpty(userErrorMessageOrDefault))
{
AppendFormat(“Error:{0}{1}”、htmlHelper.Encode(userErrorMessageOrDefault)、Environment.NewLine);
}
}
}
}
htmlSummary.InnerHtml=sb.ToString();
if(formContext!=null)
{
formContext.ReplaceValidationSummary=true;
}
返回MvcHtmlString.Create(htmlSummary.ToString(TagRenderMode.Normal));
}
私有静态字符串GetUserErrorMessageOrDefault(ModelError错误)
{
如果(!string.IsNullOrEmpty(error.ErrorMessage))
{
返回error.error消息;
}
返回null;
}
}
然后:

<%= Html.MyValidationSummary() %>


也许这正是你想要的,但我需要每个项目都呈现为这一行,我认为你应该使用一些CSS来定制它。查看助手是如何在代码中烘焙的,没有简单的方法可以做到这一点。例如,您可以将validationsummary更改为span,并使用css进行更多的自定义(.validation summary errors>span{margin:0px;})我无法添加额外的渲染,我知道我可以使用javascript(jquery),但我只需要简单的HTMLY,因为我不知道如何做:)老实说,在我的情况下,它不起作用,我将代码复制并粘贴到extension,并在view中调用它。它只显示关闭错误和更新定位。我希望看到div中的所有验证错误,但没有看到。我遗漏了什么吗?@AnarchistGeek,你是如何将验证错误添加到modelstate的?Darin,让我问一个愚蠢的问题。。我在模型中定义了验证规则,我假设的模型状态已经存在验证错误。我可能完全错了。这是一个错误的假设吗?Cheers@AnarchistGeek,您在模型上定义了验证规则这一事实并不意味着您将在模型状态中出现验证错误。您首先需要有一个控制器操作,该操作将用于处理表单提交,并将视图模型用作操作参数。然后,当它尝试绑定请求中的操作参数时,它将成为默认的模型绑定器,该请求将使用您用于将错误添加到modelstate中的数据注释。
<%= Html.MyValidationSummary() %>