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

时间:2011-01-17 21:58:34

标签: asp.net-mvc checkbox html-helper

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

我有一个复选框,创建如下:

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

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

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

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

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

首先,有没有办法让HtmlHelper按照我的预期行事?或者是手动构建输入/创建自己的帮助方法的唯一方法? (这不是一个大问题......)

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

7 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:2)

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

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

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

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

答案 3 :(得分:0)

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

我还确保Html.HiddenFor在那里,因此保留了该值。

答案 4 :(得分:0)

在复选框之前添加“隐藏”字段对我有用。 请注意,只有在禁用该字段的情况下,我才添加隐藏字段。

贷方转到this post

  @{
     if (Model.MyFieldDisabled)
      {
         @Html.HiddenFor(x => x.MyField)
      }
   }    

    @Html.CheckBoxFor(x => x.MyField,  new {disabled = "disabled"})

答案 5 :(得分:0)

在我下面的情况下,它与 asp-tag 助手有关。所以为了发送值,我使用了输入隐藏字段并且它起作用了。

<input type="checkbox" asp-for="@Model.SomeList[i].Selected" disabled />
<input type="hidden" asp-for="@Model.SomeList[i].Selected" />

HTH 给别人 :)

答案 6 :(得分:0)

@(Model.IsClosed ? "Yes" : "No")
@Html.HiddenFor(m => m.IsClosed)

这在所有情况下都对我有用。无需禁用和只读