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

Bil*_*eer 43 c# asp.net-mvc razor

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

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

 @Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = !item.Selectable })
Run Code Online (Sandbox Code Playgroud)

Shy*_*yju 77

这是不容易有达到这个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">
Run Code Online (Sandbox Code Playgroud)

这应该在剃须刀中起作用.简单如果条件和渲染你想要的.

@if(item.Selected)
{ 
  @Html.CheckBoxFor(modelItem => item.Selected)
}
else
{
    @Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = "disabled"})
}
Run Code Online (Sandbox Code Playgroud)

您可以考虑编写一个自定义的html帮助程序,为此呈现正确的标记.

  • 对于HTML5,我将`new {@disabled =""}写为`<input type ="复选框"disabled />`有效并由W3C在其样本中使用. (2认同)

Dan*_*tle 26

这将无效,因为<input disabled="anything" />将导致禁用控件.应该禁用时,只需要一个@disabled属性.

尝试这样的事情:

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

请注意,您可能需要转换为 (object)


Fel*_*ges 7

问题是当您必须添加超过 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"})
}
Run Code Online (Sandbox Code Playgroud)

我解决这个问题的方法是使用IDictionary<string, object>之前加载的:

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

然后我只创建一次复选框组件:

@Html.CheckBoxFor(modelItem => item.Selected, htmlAttributes)
Run Code Online (Sandbox Code Playgroud)