8

HtmlHelperのdisabled属性を動的に設定しようとしていますTextBoxFor

@Html.TextBoxFor(model => model.Street, 
                 new
                 {
                    @class = "", 
                    disabled = (Model.StageID==(int)MyEnum.Sth) ? "disabled" : "" 
                 })

でもありますがdisabled=""と同じdisabled="disabled"です。これを回避する方法は?

4

4 に答える 4

20

私は約1か月前に同じ問題を抱えており、この拡張方法を使用して終了しました

public static class AttributesExtensions
{
    public static RouteValueDictionary DisabledIf(
        this object htmlAttributes, 
        bool disabled
    )
    {
        var attributes = new RouteValueDictionary(htmlAttributes);
        if (disabled)
        {
            attributes["disabled"] = "disabled";
        }
        return attributes;
    }
}

その後、このように使用できます

@Html.TextBoxFor(
    model => model.Street, 
    new { @class = "" }.DisabledIf(Model.StageID==(int)MyEnum.Sth)
)

編集ポールコメントの後):

アンダースコアは自動的にマイナス記号に変換されないため、 data-xxxhtml属性の使用は、 System.Web.Routing.RouteValueDictionaryクラスのコンストラクターを使用してマイニングできます。

代わりに、 System.Web.Mvc.HtmlHelper.AnonymousObjectToHtmlAttributesメソッドを使用してください。この問題は解決されます。

更新されたコード(拡張メソッド本体のみ)

var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
if (disabled)
{
    attributes["disabled"] = "disabled";
}
return attributes;
于 2012-04-18T10:34:04.580 に答える
0

以下の拡張方法を使用すると、同様の結果が得られますが、これはおそらくより脆弱です。

@Html.TextBoxFor(
     model => model.Street, 
     new { @class = "form-control" }
).DisabledIf(Model.IsReadOnly)

拡大:

using System.Text.RegularExpressions;
using System.Web.Mvc;

namespace xxx.HtmlHelpers
{
    public static class MvcHtmlStringExtensions
    {

        private static readonly Regex OpeningTagPattern;

        static MvcHtmlStringExtensions()
        {
            OpeningTagPattern = new Regex("<[a-zA-Z]*");
        }

        public static MvcHtmlString DisabledIf(this MvcHtmlString controlHtml, bool isDisabled)
        {
            if (!isDisabled) return controlHtml;
            return
                new MvcHtmlString(OpeningTagPattern.Replace(controlHtml.ToString(),
                    x => string.Format("{0} disabled=\"disabled\"", x.Groups[0])));
        }

    }
}
于 2013-12-11T10:49:29.117 に答える
0

おそらくステージIDが設定されていません

@{ 
    if(Model.StageID != null &&   Model.StageID > 0)
    {
        @Html.TextBoxFor(model => model.Street, 
             new
             {
                @class = "", 
                disabled = (Model.StageID==(int)MyEnum.Sth) ? "disabled" : "" 
             })
    }else{

        @Html.TextBoxFor(model => model.Street, 
             new
             {
                @class = ""
             })
    }
}
于 2015-02-09T04:57:49.757 に答える
0

私たちは実際に同じ問題に遭遇しました。最終的に、オーバーロードされたパラメーターを使用して拡張メソッドを実装しました。これは、コントロールを無効にするかどうかを示すブール値を受け取ります。必要に応じて「disabled」属性を追加し、組み込みのHtmlHelperに手間のかかる作業を処理させます。

拡張クラスとメソッド:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;
public static class OurHtmlHelpers
{
    public const string DisabledAttribute = "disabled";

    public static MvcHtmlString TextBoxFor<TModel, TProp>(this HtmlHelper<TModel> htmlHelper, 
                                                            Expression<Func<TModel, TProp>> expression, 
                                                            object htmlAttributes, 
                                                            bool canEdit)
    {
        var htmlAttributeDictionary = SetDisabledAttribute(htmlAttributes, canEdit);

        return htmlHelper.TextBoxFor(expression, htmlAttributeDictionary);
    }        

    private static RouteValueDictionary SetDisabledAttribute(object htmlAttributes, bool canEdit)
    {
        var htmlAttributeDictionary = new RouteValueDictionary(htmlAttributes);

        if (!canEdit)
        {
            htmlAttributeDictionary.Add(DisabledAttribute, DisabledAttribute);
        }

        return htmlAttributeDictionary;
    }
}

次に、新しいクラスを参照して呼び出す必要があります@Html.TextBoxFor(m => m.SomeValue, new { @class = "someClass" }, <Your bool value>)

使用したいTextBoxForオーバーロードのいずれかに対してこれらの拡張機能を定義する必要があることに注意してください。ただし、これは妥当なトレードオフのようです。機能を追加したい他のHtmlHelperにも同じコードのほとんどを利用できます。

于 2015-08-27T18:46:37.510 に答える