web-dev-qa-db-ja.com

ASP.NET MVCのチェックボックス無効属性

My ViewModelには、選択および選択可能なプロパティがあります。両方ともブール値です。私のビューには、selectableがtrueのときに有効になり、selectableがfalseのときに無効になるチェックボックスが必要です。これを達成するための適切なカミソリ構文は何ですか?

表の項目のリストで次のコードを試しました。選択可能な値に関係なく、すべての行に無効なチェックボックスが表示されます。

 @Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = !item.Selectable })
41
Bill Greer

if condition insideヘルパーメソッドを使用してこれを達成するのは簡単ではありません。以下のすべてのマークアップが無効なchechboxをレンダリングするためです。

<input type="checkbox" disabled>
<input type="checkbox" disabled="disabled">
<input type="checkbox" disabled="false">
<input type="checkbox" disabled="no">
<input type="checkbox" disabled="enabled">

これはカミソリで動作するはずです。シンプルなIf条件と必要なレンダリング。

@if(item.Selected)
{ 
  @Html.CheckBoxFor(modelItem => item.Selected)
}
else
{
    @Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = "disabled"})
}

このための適切なマークアップをレンダリングするカスタムhtmlヘルパーを作成することを検討できます。

75
Shyju

<input disabled="anything" />はコントロールを無効にするため、これは機能しません。無効にする必要がある場合にのみ、@ disabledプロパティが必要です。

次のようなものを試してください:

@Html.CheckBoxFor(modelItem => item.Selected, item.Selectable ?  (object)new {} :  (object)new { @disabled = "disabled" })

(object)にキャストする必要がある場合があることに注意してください

25
Daniel Little

申し訳ありませんが、以前の回答は間違っていました。

Input-elementは、属性が無効になるとすぐに無効になります。値がtrueかfalseかは関係ありません。 HTMLでは、disabledをfalseに設定できません。

そのため、条件が有効な場合にのみ、disabled属性を設定する必要があります。

何かのようなもの:

object attributes = null;
if (!item.Selectable)
{
    attributes = new { disabled = "disabled"};
}
@Html.CheckBoxFor(modelItem => item.Selected, attributes)
1
Pbirkoff

問題は、複数のHTML属性を追加する必要がある場合です。それは混乱です:

@if(item.Selected)
{ 
  @Html.CheckBoxFor(modelItem => item.Selected, new { @data_foo = "bar"})
}
else
{
    @Html.CheckBoxFor(modelItem => item.Selected, new { @data_foo = "bar", @disabled = "disabled"})
}

これを解決するために行うことは、IDictionary<string, object>以前にロードされたもの:

var htmlAttributes = new Dictionary<string, object>{
    {"data-foo", "bar"}
};
if(!item.Selected)
{
    htmlAttributes.Add("@disabled", "disabled");
}

そして、チェックボックスコンポーネントを一度だけ作成します:

@Html.CheckBoxFor(modelItem => item.Selected, htmlAttributes)
0
Fellipe Borges