如何创建一个HTML Helper来扩展TextBoxFor()以添加CSS样式?

时间:2012-06-27 17:43:03

标签: asp.net asp.net-mvc asp.net-mvc-3

如何创建HTML Helper来扩展TextBoxFor()以添加CSS样式?

@Html.TextBoxFor(model => model.FirstName, new { @class = "txt" }) 

3 个答案:

答案 0 :(得分:20)

您只需在HtmlHelper上创建extension method

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的名称空间。

答案 1 :(得分:8)

    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));
    }

答案 2 :(得分:1)

在@nemesv上构建这里的答案是一个扩展,它支持带有其他自定义属性的htmlAttributes。

vb.net:

<Extension()>
Function MyTextBoxFor(Of TModel, TProperty)(ByVal helper As HtmlHelper(Of TModel), ByVal expression As Expression(Of Func(Of TModel, TProperty)), htmlAttributes As Object) As MvcHtmlString           
    'copy htmlAttributes object to Dictionary
    Dim dicHtmlAttributes As New Dictionary(Of String, Object)
    For Each prop in htmlAttributes.GetType().GetProperties()
        dicHtmlAttributes.Add(prop.Name,prop.GetValue(htmlAttributes))
    Next
    'add custom attribute
    dicHtmlAttributes.Add("foo","bar")

    Return helper.TextBoxFor(expression, dicHtmlAttributes)
End Function

C#:

public static MvcHtmlString MyTextBoxFor<TModel, TProperty>(
     this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
{
    //copy htmlAttributes object to Dictionary
    Dictionary<string, object> dicHtmlAttributes = new Dictionary<string, object>;
    foreach (var prop in htmlAttributes.GetType().GetProperties())
    {
        dicHtmlAttributes.Add(prop.Name, prop.GetValue(htmlAttributes));
    }
    //add custom attribute
    dicHtmlAttributes.Add("foo", "bar");
    return helper.TextBoxFor(expression, dicHtmlAttributes);
}