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

C# ASP.NET MVC中的复选框禁用属性,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我的ViewModel具有selected和selectable属性。两者都是布尔值。我希望我的视图有一个复选框,该复选框在selectable为true时启用,在selectable为false时禁用。要实现这一点,正确的razor语法是什么 我在表中的项目列表上尝试了下面的代码。无论可选值如何,每一行都会返回一个禁用的复选框 @Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = !item.Selectable

我的ViewModel具有selected和selectable属性。两者都是布尔值。我希望我的视图有一个复选框,该复选框在selectable为true时启用,在selectable为false时禁用。要实现这一点,正确的razor语法是什么

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

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

对不起,我以前的回答错了

一旦输入元素的属性被禁用,它就会被禁用。不管值是真是假。在HTML中,不能将“禁用”设置为false

因此,只有当条件有效时,才必须设置禁用属性

比如:

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

在助手方法中使用
if
condition来实现这一点并不容易,因为下面的所有标记都将呈现一个禁用的复选框

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

您可以考虑编写一个自定义HTML帮助器,它为这个提供适当的标记。

这不起作用,因为<代码> <代码>将导致禁用的控件。只有当@disabled属性应该被禁用时,才需要它

试着这样做:

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

请注意,您可能需要强制转换到
(对象)

问题在于您必须添加多个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

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

我试过你的推荐。一切都被禁用。您可能需要@prefixesQuestion:What is
item
?我在lambda上看到您有
modelItem=>item.Selected
,但是
item
独立于模型本身吗?或者您的意思是说
modelItem=>modelItem.Selected
?这是一个比所选答案更简洁的选项。您确实需要将其转换为对象;在我的例子中,我有这样的工作:@Html.EditorFor(p=>item.Selected,new{htmlAttributes=item.Selectable?(object)new{}:(object)new{@disabled=“disabled”})你可能只需要在HTML5的左边找到new object(),我写下
new{@disabled=“”
,因为
是有效的,W3C在它们的示例中使用。
var htmlAttributes = new Dictionary<string, object>{
    {"data-foo", "bar"}
};
if(!item.Selected)
{
    htmlAttributes.Add("disabled", "disabled");
}
@Html.CheckBoxFor(modelItem => item.Selected, htmlAttributes)