如何在ASP MVC中自定义Html.ValidationMessageFor

par*_*eer 21 asp.net-mvc asp.net-mvc-3

是否可以自定义Html.ValidationMessageFor方法,以便生成不同的HTML?

我想做类似的事情:

<div class="field-error-box">
    <div class="top"></div>
    <div class="mid"><p>This field is required.</p></div>
</div>
Run Code Online (Sandbox Code Playgroud)

arc*_*hil 28

我不确定是否可以使用paragraph而不是默认值span,因为它可能使验证插件无法发出错误消息.但对于div -s来说,这很容易 - 你可以编写自定义的html助手.

沿着这些方向的东西(可能需要进一步测试/编码).您需要在视图中包含此静态扩展方法的命名空间,或System.Web.Mvc.Html直接将其放入.

public static class Validator
{
    public static MvcHtmlString MyValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
    {
        TagBuilder containerDivBuilder = new TagBuilder("div");
        containerDivBuilder.AddCssClass("field-error-box");

        TagBuilder topDivBuilder = new TagBuilder("div");
        topDivBuilder.AddCssClass("top");

        TagBuilder midDivBuilder = new TagBuilder("div");
        midDivBuilder.AddCssClass("mid");
        midDivBuilder.InnerHtml = helper.ValidationMessageFor(expression).ToString();

        containerDivBuilder.InnerHtml += topDivBuilder.ToString(TagRenderMode.Normal);
        containerDivBuilder.InnerHtml += midDivBuilder.ToString(TagRenderMode.Normal);

        return MvcHtmlString.Create(containerDivBuilder.ToString(TagRenderMode.Normal));
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,这使用默认ValidationMessageFor方法,不会干扰验证 - 插件错误消息处理.

您可以简单地使用它作为默认验证消息帮助程序

@Html.MyValidationMessageFor(model => model.SomeRequiredField)
Run Code Online (Sandbox Code Playgroud)

  • 这对我很有用,但请确保在System.Web.Mvc.Html命名空间中声明您的静态助手类,它将非常有效. (3认同)

小智 7

我用另一种方式:

    public static MvcHtmlString DivValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        return MvcHtmlString.Create(htmlHelper.ValidationMessageFor(expression).ToString().Replace("span", "div"));
    }
Run Code Online (Sandbox Code Playgroud)

这样您就可以使用内置方式,但用div替换span.

如果您需要该函数的任何其他重载,只需根据需要复制.