11

TextBoxFor()を拡張してCSSスタイルを追加するHTMLヘルパーを作成する方法は?

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

3 に答える 3

24

で拡張メソッドを作成する必要があります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

于 2012-06-27T17:52:46.580 に答える
11
    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));
    }
于 2014-09-02T09:06:32.567 に答える
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);
}
于 2018-02-06T04:00:18.197 に答える