是否可以自定義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。可能嗎? –