2012-01-31 16 views
26

私はC#.Net Webアプリケーションを持っています。そのアプリでは、システムにログインした人に基づいて、条件付きでHtml.TextBoxForコントロール(Html.DropDownListForコントロール)を無効にする必要があります。私は@ViewBag.IsDisabledがコントローラでString.Emptyを "無効" のいずれかに設定されているMVC3条件付きでHtml.TextBoxFor()を無効にする

@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.IsDisabled }) 

を使用してみました。ただし、これはIsDisabled='disabled'またはIsDisabled=""と表示されるため、コントロールは無効になりません。試したとき

ViewBag.Disabledにテキストが含まれていなくても、コントロールは常に無効になっていました。条件付きでHtml.TextBoxFor()コントロールを無効にするにはどうすればよいですか?

答えて

51

作品@epignosisxにより投稿

@Html.TextBoxFor(model => model.ProposalName, ViewBag.Disabled ? (object)new { disabled="disabled" } : new {}) 
+0

@epig ....おかしい。 ViewBag.Disabledの価値はどうあるべきですか? – MikeTWebb

+1

@MikeTWebb ViewBag.Disabledはブール値でなければなりません。 – epignosisx

+0

@epig .... trueまたはfalseが値です。よく働く!おかげで – MikeTWebb

19

ソリューションを試してみてください、それはあなたが持つことになりますので、両方のオブジェクト(disabledと1それを追加するためにいくつかの他の属性を追加したい場合は、問題であってもよく、今は空です)。

他のブールプロパティがある場合はさらに悪くなります。これは、4つのオブジェクトがそれぞれの組み合わせに対して1つずつ存在するためです。

ここでのコードのほんの一番良い解決策は、HtmlHelperの拡張メソッドをビルドして、ブール値のプロパティをパラメータとして受け取ることです。

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, object htmlAttributes = null) 
{ 
    return TextBoxDisabledFor(htmlHelper, expression, disabled, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
} 

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, IDictionary<string, object> htmlAttributes) 
{ 
    if (htmlAttributes == null) 
     htmlAttributes = new Dictionary<string, object>(); 
    if (disabled) 
     htmlAttributes["disabled"] = "disabled"; 
    return htmlHelper.TextBoxFor(expression, htmlAttributes); 
} 

Here there is another example

8

私はこの同じ問題を抱えていたし、私自身のHtmlHelper拡張メソッドを書くことにしました。

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) 
    { 
     if (helper == null) 
      throw new ArgumentNullException(); 

     if (disabled) 
     { 
      string html = helper.ToString(); 
      int startIndex = html.IndexOf('>'); 

      html = html.Insert(startIndex, " disabled=\"disabled\""); 
      return MvcHtmlString.Create(html); 
     } 

     return helper; 
    } 

これは、コントロールを無効にするかどうかを示すブール値を受け入れます。それはちょうど最初に>の中にdisabled="disabled"を追加します。

以下のように使用できます。ここで

@Html.TextBoxFor(model => model.ProposalName).Disable(true)

+0

非常に涼しい...... – Bohn

5

拡張を必要とせず、唯一のHTML属性にあなたを制限するものではありません、私が使用する方法、です。それはあなたのモデルで「無効」という名前のブール型プロパティがあると想定しているが、それは三項演算子のブールと評価かぎり、そこにあなたが望んでいたものは何でも入れることができます:

@Html.TextBoxFor(model => model.Whatever, 
    new Dictionary<string, object>() { 
    { "size", "5" }, 
    { "class", "someclasshere" }, 
    { model.Disabled ? "disabled" : "data-notdisabled", "disabled" } 
    }) 

標準のショートカットの制限表記法は、属性の名前を動的にすることはできません。正しいタイプの辞書を作成することで、属性名を動的にすることができます。次に、辞書を属性の辞書としてテキストボックスに渡します。フィールドを無効にしない場合は、 "disabled - "という名前の属性の代わりに "data-notdisabled"という属性が渡されます。この属性はブラウザが無視します。以下のような(

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) { 
    string html = helper.ToString(); 
    var regex = new Regex("(disabled(?:=\".*\")?)"); 
    if (regex.IsMatch(html)) { 
     html = regex.Replace(html, disabled ? "disabled=\"disabled\"" : "", 1); 
    } else { 
     regex = new Regex(@"(\/?>)"); 
     html = regex.Replace(html, disabled ? "disabled=\"disabled\"$1" : "$1", 1); 
    } 
    return MvcHtmlString.Create(html); 
} 

また、自己終了タグとうまく果たしている:ジェームズの答え@拡張

2

は、私はそれが既に存在しているのですか、ない場合は、それを追加した場合、更新/ disabled属性を削除することを、このHtmlHelperの拡張を書きました<input />)。

使い方は同じです。

@Html.DropDownListFor()@Html.TextBoxFor()の両方でテスト
@Html.TextBoxFor(model => model.PropertyName).Disable(true) 

関連する問題