如果禁用,Html.CheckBox返回false,即使已选中

elw*_*wyn 27 checkbox asp.net-mvc html-helper

希望对你来说一个简单的问题asp.net mvc gurus:

我有一个复选框,像这样创建:

<%=Html.CheckBox("MyCheckBox", true, new { disabled = "disabled"})%>
Run Code Online (Sandbox Code Playgroud)

在我的行动中,我正在检查这样的值:

bool isChecked = form["MyCheckBox"].Contains("true");
Run Code Online (Sandbox Code Playgroud)

我希望这会返回true,因为它已被检查.但是,创建的隐藏元素具有false值:

<input checked="checked" disabled="disabled" id="MyCheckBox" name="MyCheckBox" type="checkbox" value="true" />
<input name="MyCheckBox" type="hidden" value="false" />
Run Code Online (Sandbox Code Playgroud)

首先,有没有办法让HtmlHelper表现得像我预期的那样?或者是手动构建输入/创建自己的帮助方法的唯一方法?(不是说这是一个大问题......)

其次,任何人都可以解释为什么复选框的行为方式如此?假设一个勾选的禁用复选框应该== true,我是不正确的?禁用状态在语义上是否意味着错误?

Dar*_*rov 33

标记有disabled="disabled"属性NEVER的输入字段将其值发送到服务器.如果要实现此目的,可以使用readonly="readonly"仍然阻止用户修改值的属性,但在提交表单时发送现有值.

  • 我用checbox试过'readonly'.如果我只读它就没有效果. (9认同)
  • @VoodooChild,是的,这与FireFox和复选框一起发生.常见的解决方法涉及具有后备隐藏字段的"已禁用". (4认同)
  • +1:我很久以前就发现了这个问题,因为我也是MVC的初学者.但是,如果它是一个输入字段并且我想禁用/只读它,你有一个很好的建议吗?目前设置"readonly"不会像输入字段那样为"禁用"设置灰色. (2认同)

Leo*_*tta 5

我不知道它是否解决了您的问题,但这对我来说是解决方案:

我的模型有一个 UserMigerated 布尔属性,一旦用户设置为迁移,他就无法返回,因此视图变为:

@if (Model.UserMigrated)
    {
    <td>@Html.CheckBox("chkBoxReadOnly", true, new {disabled = "disabled"})</td>
        @Html.HiddenFor(m => m.UserMigrated)
    }
else
    {
    <td>@Html.CheckBoxFor(m => m.UserMigrated)</td>
    }
Run Code Online (Sandbox Code Playgroud)