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

问题描述 投票:27回答:4

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

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

<%=Html.CheckBox("MyCheckBox", true, new { disabled = "disabled"})%>

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

bool isChecked = form["MyCheckBox"].Contains("true");

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

<input checked="checked" disabled="disabled" id="MyCheckBox" name="MyCheckBox" type="checkbox" value="true" />
<input name="MyCheckBox" type="hidden" value="false" />

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

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

asp.net-mvc checkbox html-helper
4个回答
33
投票

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


2
投票

1)从我的角度来看,没有办法改变Html.CheckBox方法的行为。我不得不面对这个问题,我最后按照你的建议手动构建输入复选框。构造输入复选框并不总是很糟糕,因为使用辅助方法并不总是eaven。当然,你自己的帮助方法可能是正确的选择。

2)提交表单时未发布已禁用的输入字段;我希望相同,提交已禁用的输入复选框文件,是否已选中。

当没有选中复选框时,我们可以争论选择是否在输入隐藏字段上进行中继以推入请求复选框。这种选择的副作用是我们会在发布的数据中找到复选框名称,即使复选框是禁用的,与上述内容不一致:提交表单时不会发布禁用的输入字段


2
投票

我不知道它是否解决了你的问题,但这是我的解决方案:

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

@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>
    }

0
投票

尝试使用禁用复选框时,我遇到了类似的问题。我的解决方案是不显示复选框,因为用户无权修改字段。

我还确保Html.HiddenFor在那里,所以保留了价值。

© www.soinside.com 2019 - 2024. All rights reserved.