是否可以自定义Html.ValidationMessageFor方法,以便生成不同的HTML?如何在ASP中自定义Html.ValidationMessageFor MVC
我想要做类似的东西:
<div class="field-error-box">
<div class="top"></div>
<div class="mid"><p>This field is required.</p></div>
</div>
是否可以自定义Html.ValidationMessageFor方法,以便生成不同的HTML?如何在ASP中自定义Html.ValidationMessageFor MVC
我想要做类似的东西:
<div class="field-error-box">
<div class="top"></div>
<div class="mid"><p>This field is required.</p></div>
</div>
我不确定是否有可能使用p
aragraph而不是默认span
,因为它可能使val idation插件来放置错误消息。但对于divs,这很容易 - 你可以编写自定义的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));
}
}
正如你看到的,这个使用默认ValidationMessageFor
方法,不使用验证,插件错误消息处理干扰。
而且你使用这个简单的,因为默认的验证消息帮手
@Html.MyValidationMessageFor(model => model.SomeRequiredField)
是,只使用一个元模型领域:
[MetadataType(typeof(YourMetaData))]
public partial class YOURCLASS
{
[Bind(Exclude = "objID")]
public class YourMetaData
{
[Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a name")]
public object Name { get; set; }
}
}
在外地的ErrorMessage :) 希望这有助于改变你的留言: )
您可以实现自己的ValidationMessageFor助手发出所需输出或使用一些JavaScript来添加/修改所提供的HTML代码,但自ValidationMessageFor实施是更清洁的方法恕我直言。
要实现您自己的ValidationMessageFor帮助器,请查看ASP.NET MVC源代码中的ValidationExtensions.ValidationMessageFor和ValidationMessageHelper方法。
实施提示
由于GetFormContextForClientValidation是内部的,你必须在你的代码复制内部功能来解决,落实:
FormContext formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null;
一些其他的方法都是私有像GetUserErrorMessageOrDefault你会ValidationExtensions还需要复制该代码。你可以做什么来避免重复代码是让ValidationExtentensions.ValidationMessageFor呈现包含在一个范围内的验证消息字符串,然后根据你的需求改变呈现的字符串。请记住,如果没有发现错误,则返回“null”,并且如果启用了不显眼的JavaScript,则需要data-HTML属性。
您可以从here
下载ASP.NET MVC 3的源代码默认标签生成的变化唯一需要的是在我的情况下,横跨在是烦人保证金设置的行为结果。
我使用解决了这个“显示:块”
也许这可以帮助一些人..
我用另一种方式:
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"));
}
这样,您就可以使用内置的方式,而是用一个div取代跨度。
如果您需要该函数的任何其他重载,则根据需要进行重复。
我喜欢这种方法。比复制所有的ValidationMessageHelper代码更容易,这样一个小小的改变。 –
希望你不要验证两个timepans之间的日期.. – user2864740
也许你可以把这些代码
string propertyName = ExpressionHelper.GetExpressionText(expression);
string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName));
if (helper.ViewData.ModelState[name] == null ||
helper.ViewData.ModelState[name].Errors == null ||
helper.ViewData.ModelState[name].Errors.Count == 0)
{
return MvcHtmlString.Empty;
}
在回答功能的顶部,使DIV不会对负载形式出现。
这就是我正在寻找的。我还没有理解验证插件的问题,但我会研究这个问题。谢谢! – parleer
这对我来说很好,但一定要在System.Web.Mvc.Html命名空间中声明您的静态助手类,它将会非常好地工作。 –
你如何改变'ValidationMessageFor'消息生成的html。我不是在说把它换成另一个div。可能吗? –