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

[解決済み] Html.TextBoxForに条件に応じてdisable属性を設定する

2023-06-14 06:01:06

質問

asp.net MVCのHtml.TextBoxForで、以下のように条件に基づいてdisable属性を設定したいのですが、どうすればよいでしょうか?

@Html.TextBoxFor(model => model.ExpireDate, new { style = "width: 70px;", maxlength = "10", id = "expire-date" disabled = (Model.ExpireDate == null ? "disable" : "") })

このヘルパーは disabled="disabled " と disabled="" の2つの出力を持っています。

Model.ExpireDate == nullの場合、テキストボックスを無効にしたい。

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

有効な方法は

disabled="disabled"

また、ブラウザは を受け入れる disabled="" といった具合ですが、私は最初の方法をお勧めします。

ということで、カスタムヘルパーを作成して 無効化 の機能を再利用可能なコードの断片にカプセル化するために、カスタム HTML ヘルパーを書くことをお勧めします。

using System;
using System.Linq.Expressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;

public static class HtmlExtensions
{
    public static IHtmlString MyTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expression, 
        object htmlAttributes, 
        bool disabled
    )
    {
        var attributes = new RouteValueDictionary(htmlAttributes);
        if (disabled)
        {
            attributes["disabled"] = "disabled";
        }
        return htmlHelper.TextBoxFor(expression, attributes);
    }
}

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

@Html.MyTextBoxFor(
    model => model.ExpireDate, 
    new { 
        style = "width: 70px;", 
        maxlength = "10", 
        id = "expire-date" 
    }, 
    Model.ExpireDate == null
)


そして、さらに インテリジェンス をこのヘルパーに導入することができます。

public static class HtmlExtensions
{
    public static IHtmlString MyTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        object htmlAttributes
    )
    {
        var attributes = new RouteValueDictionary(htmlAttributes);
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        if (metaData.Model == null)
        {
            attributes["disabled"] = "disabled";
        }
        return htmlHelper.TextBoxFor(expression, attributes);
    }
}

というように、これで無効化条件を指定する必要がなくなりました。

@Html.MyTextBoxFor(
    model => model.ExpireDate, 
    new { 
        style = "width: 70px;", 
        maxlength = "10", 
        id = "expire-date" 
    }
)