1. ホーム
  2. asp.net-mvc

[解決済み] Asp.Net MVCのDataAnnotations StringLengthからテキストボックスのmaxlength属性を取得する。

2023-07-10 13:52:03

質問

MVC2アプリケーションで、テキスト入力のmaxlength属性を設定したいと思っています。

既にデータアノテーションを使用してモデルオブジェクトにstringlength属性を定義しており、入力された文字列の長さを正しく検証しています。

モデルがすでに情報を持っているときに、最大長属性を手動で設定することによって、ビューで同じ設定を繰り返したくありません。 これを行う方法はありますか?

以下にコードスニペットを示します。

モデルから

[Required, StringLength(50)]
public string Address1 { get; set; }

ビューから

<%= Html.LabelFor(model => model.Address1) %>
<%= Html.TextBoxFor(model => model.Address1, new { @class = "text long" })%>
<%= Html.ValidationMessageFor(model => model.Address1) %>

避けたいのは

<%= Html.TextBoxFor(model => model.Address1, new { @class = "text long", maxlength="50" })%>

このような出力を得たい。

<input type="text" name="Address1" maxlength="50" class="text long"/>

何か方法はないでしょうか?

どのように解決するのですか?

リフレクションに頼らずにこれを実現する方法を私は知りません。ヘルパーメソッドを書けばよいでしょう。

public static MvcHtmlString CustomTextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression, 
    object htmlAttributes
)
{
    var member = expression.Body as MemberExpression;
    var stringLength = member.Member
        .GetCustomAttributes(typeof(StringLengthAttribute), false)
        .FirstOrDefault() as StringLengthAttribute;

    var attributes = (IDictionary<string, object>)new RouteValueDictionary(htmlAttributes);
    if (stringLength != null)
    {
        attributes.Add("maxlength", stringLength.MaximumLength);
    }
    return htmlHelper.TextBoxFor(expression, attributes);
}

というように使うことができます。

<%= Html.CustomTextBoxFor(model => model.Address1, new { @class = "text long" })%>