Asp.net

如何創建 HTML Helper 來擴展 TextBoxFor() 以添加 CSS 樣式?

  • May 13, 2020

如何創建 HTML Helper 來擴展 TextBoxFor() 以添加 CSS 樣式?

@Html.TextBoxFor(model => model.FirstName, new { @class = "txt" }) 
   public static System.Web.Mvc.MvcHtmlString DtxTextBoxFor<TModel, TValue>
       (this System.Web.Mvc.HtmlHelper<TModel> html,
       System.Linq.Expressions.Expression<System.Func<TModel, TValue>> expression,
       System.Collections.Generic.IDictionary<string, object> htmlAttributes = null, bool readOnly = false)
   {
       if (htmlAttributes == null)
       {
           htmlAttributes =
               new System.Collections.Generic.Dictionary<string, object>();
       }

       System.Web.Mvc.ModelMetadata oModelMetadata =
           System.Web.Mvc.ModelMetadata.FromLambdaExpression(expression, html.ViewData);

       if (oModelMetadata == null)
       {
           if (readOnly)
           {
               if (htmlAttributes.ContainsKey("readonly") == false)
               {
                   htmlAttributes.Add("readonly", "read-only");
               }
           }
       }
       else
       {
           if (htmlAttributes.ContainsKey("placeholder") == false)
           {
               string strHtmlFieldName =
                   System.Web.Mvc.ExpressionHelper.GetExpressionText(expression);

               string strLabelText =
                   oModelMetadata.DisplayName ??
                   oModelMetadata.PropertyName ??
                   strHtmlFieldName.Split('.').Last();

               if (string.IsNullOrEmpty(strLabelText) == false)
               {
                   htmlAttributes.Add("placeholder", strLabelText);
               }
           }

           if ((readOnly) || (oModelMetadata.IsReadOnly))
           {
               if (htmlAttributes.ContainsKey("readonly") == false)
               {
                   htmlAttributes.Add("readonly", "read-only");
               }
           }
       }

       htmlAttributes.Add("class", "form-control");

       System.Linq.Expressions.MemberExpression oMemberExpression =
           expression.Body as System.Linq.Expressions.MemberExpression;

       if (oMemberExpression != null)
       {
           System.ComponentModel.DataAnnotations.StringLengthAttribute oStringLengthAttribute =
               oMemberExpression.Member.GetCustomAttributes
               (typeof(System.ComponentModel.DataAnnotations.StringLengthAttribute), false)
               .FirstOrDefault() as System.ComponentModel.DataAnnotations.StringLengthAttribute;

           if (oStringLengthAttribute != null)
           {
               if (htmlAttributes.ContainsKey("maxlength") == false)
               {
                   htmlAttributes.Add("maxlength", oStringLengthAttribute.MaximumLength);
               }
           }
       }

       return (html.TextBoxFor(expression, htmlAttributes));
   }

您只需要在以下位置創建一個擴展方法HtmlHelper

public static class MyHtmlHelpers
{
   public static MvcHtmlString MyTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> helper, 
        Expression<Func<TModel, TProperty>> expression)
   {
       return helper.TextBoxFor(expression, new { @class = "txt" });
   }
}

然後在您看來,您可以將其用作:

@Html.MyTextBoxFor(model => model.FirstName) 

注意:不要忘記您的視圖@using的名稱空間。MyHtmlHelpers

引用自:https://stackoverflow.com/questions/11232041