ASP.NET MVC中的复选框已禁用属性

时间:2014-01-05 23:46:06

标签: c# asp.net-mvc razor

我的ViewModel具有selected和selectable属性。两者都是布尔值。我希望我的视图有一个复选框,当selectable为true时启用,当selectable为false时禁用。什么是正确的剃刀语法来实现这一目标?

我在表格中的项目列表上尝试了以下代码。无论可选值如何,每行都会返回一个禁用的复选框。

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

4 个答案:

答案 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)