我的ViewModel具有selected和selectable属性。两者都是布尔值。我希望我的视图有一个复选框,当selectable为true时启用,当selectable为false时禁用。什么是正确的剃刀语法来实现这一目标?
我在表格中的项目列表上尝试了以下代码。无论可选值如何,每行都会返回一个禁用的复选框。
@Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = !item.Selectable })
答案 0 :(得分:73)
使用辅助方法中的if
条件 来实现这一点并不容易,因为以下所有标记都会呈现禁用的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(item.Selected)
{
@Html.CheckBoxFor(modelItem => item.Selected)
}
else
{
@Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = "disabled"})
}
您可以考虑编写一个自定义html帮助程序,为此呈现正确的标记。
答案 1 :(得分:24)
这不起作用,因为<input disabled="anything" />
将导致禁用控件。在需要禁用时,您只需要一个@disabled属性。
尝试这样的事情:
@Html.CheckBoxFor(modelItem => item.Selected, item.Selectable ? (object)new {} : (object)new { @disabled = "disabled" })
请注意,您可能需要转换为(object)
答案 2 :(得分:2)
问题是当您必须添加多个1 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)
答案 3 :(得分:1)
抱歉,我之前的回答是错误的。
输入元素一旦禁用属性就会被禁用。如果值为true,则无关紧要。在HTML中,您不能将disabled设置为false。
因此,只有在条件有效时才需要设置disabled属性。
类似的东西:
object attributes = null;
if (!item.Selectable)
{
attributes = new { disabled = "disabled"};
}
@Html.CheckBoxFor(modelItem => item.Selected, attributes)