首頁>Program>source

是否可以自定義Html.ValidationMessageFor方法,以使其生成不同的HTML?

我想做類似的事情:

<div class="field-error-box">
    <div class="top"></div>
    <div class="mid"><p>This field is required.</p></div>
</div>
最新回復
  • 9天前
    1 #

    我不確定是否可以使用 p aragraph代替預設 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));
        }
    }
    

    如您所见,它使用預設的 ValidationMessageFor 方法,以不干扰驗證插件錯誤訊息的處理。

    您可以簡單地將其用作預設驗證訊息帮助程式

    @Html.MyValidationMessageFor(model => model.SomeRequiredField)
    

  • 9天前
    2 #

    我使用了另一種方式:

       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代替範圍。

    如果需要该函式的任何其他過載,則仅在必要時进行重複。

  • 9天前
    3 #

    您可以實現自己的ValidationMessageFor助手以發出所需的輸出或使用一些javascript添加/修改呈現的HTML代碼 但是自定義的ValidationMessageFor實現是更簡潔的方法恕我直言。

    要實現自己的ValidationMessageFor帮助器,請查看ASP.NET MVC源代碼中的ValidationExtensions.ValidationMessageFor和ValidationMessageHelper方法。

    Implementation Hints

    由於GetFormContextForClientValidation是內部的,因此您必须通過在代碼中複製內部功能来解決该實現:

    FormContext formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null;
    

    其他一些方法在ValidationExtensions中是私有的,例如GetUserErrorMessageOrDefault,您也需要複製该代碼.為避免代碼重複,您可以做的是让ValidationExtentensions.ValidationMessageFor呈現包裹在範圍中的驗證訊息字元串,然後根据需要更改呈現的字元串.請記住,如果未發現錯誤,則返迴" null";如果啟用了不干扰JavaScript,則需要data-HTML屬性。

    您可以从此處下載ASP.NET MVC 3源代碼

  • 9天前
    4 #

    更改預設標記生成的唯一需求是我的情况,它跨越了行為而使邊距設置煩人了。

    >

    我通過使用" display:block"解決了此問题

    也许這對某些人有帮助。

  • 9天前
    5 #

    也许您可以放置​​该代碼

    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不会出現在表單載入中。

  • 如何在Nodejs指令碼中分离生成的子程序?
  • java:垃圾迴收和執行緒