My ViewModelには、選択および選択可能なプロパティがあります。両方ともブール値です。私のビューには、selectableがtrueのときに有効になり、selectableがfalseのときに無効になるチェックボックスが必要です。これを達成するための適切なカミソリ構文は何ですか?
表の項目のリストで次のコードを試しました。選択可能な値に関係なく、すべての行に無効なチェックボックスが表示されます。
@Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = !item.Selectable })
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ヘルパーを作成することを検討できます。
<input disabled="anything" />
はコントロールを無効にするため、これは機能しません。無効にする必要がある場合にのみ、@ disabledプロパティが必要です。
次のようなものを試してください:
@Html.CheckBoxFor(modelItem => item.Selected, item.Selectable ? (object)new {} : (object)new { @disabled = "disabled" })
(object)
にキャストする必要がある場合があることに注意してください
申し訳ありませんが、以前の回答は間違っていました。
Input-elementは、属性が無効になるとすぐに無効になります。値がtrueかfalseかは関係ありません。 HTMLでは、disabledをfalseに設定できません。
そのため、条件が有効な場合にのみ、disabled属性を設定する必要があります。
何かのようなもの:
object attributes = null;
if (!item.Selectable)
{
attributes = new { disabled = "disabled"};
}
@Html.CheckBoxFor(modelItem => item.Selected, attributes)
問題は、複数の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)