【问题标题】:Html.CheckBox returns false if disabled, even if selecedHtml.CheckBox 如果禁用则返回 false,即使已选中
【发布时间】:2011-06-10 17:47:03
【问题描述】:

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

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

<%=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


【解决方案1】:

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

【讨论】:

  • +1:不久前我发现了这一点,因为我也是 MVC 的初学者。但是,如果它是一个输入字段并且我想让它禁用/只读,你有什么好的建议吗?当前设置“只读”不会像“禁用”那样将输入字段变灰。
  • @VoodooChild,是的,FireFox 和复选框会发生这种情况。常见的解决方法涉及带有支持隐藏字段的 disabled
  • 谢谢,我不知道。我使用了一个自定义 HtmlHelper,它使用“禁用”属性并呈现一个隐藏字段。
  • @elwyn:如果有机会,能否请您发布您的工作样本?我想保留它以供有关此问题的参考。谢谢!
  • 我已经尝试使用复选框“只读”。如果我将其设为只读,则没有效果。
【解决方案2】:

1) 在我看来,没有办法改变 Html.CheckBox 方法的行为。我之前不得不面对这个问题,最终我按照您的建议手动构建了输入复选框。构造输入复选框并不总是地狱,因为使用辅助方法并不总是天堂。当然,构建自己的辅助方法可能是正确的选择。

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

当复选框未被选中时,我们可以争论选择中继输入隐藏字段以将复选框推送到请求中这种选择的副作用是,即使复选框被禁用,我们也会在发布的数据中找到复选框名称,这与上面所说的不一致:当表单被禁用时,不会发布禁用的输入字段提交

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的,不知道什么是禁用控制点,它应该是标签,或者只是不显示。在不使用控件的地方显示控件是没有意义的,或者除了显示信息之外不能用于任何事情。
    【解决方案4】:

    我不知道它是否能解决您的问题,但这是适合我的解决方案:

    我的模型有一个 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>
        }
    

    【讨论】:

      【解决方案5】:

      在复选框之前添加隐藏字段对我有用。 请注意,我仅在该字段被禁用时才添加隐藏字段。

      归功于this post

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

      【讨论】:

      • 大声笑,这是最好的解决方案。
      【解决方案6】:

      在我下面的例子中,它与 asp-tag 助手有关。因此,为了发送值,我使用了输入隐藏字段并且它起作用了。

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

      HTH 给别人 :)

      【讨论】:

        【解决方案7】:
        @(Model.IsClosed ? "Yes" : "No")
        @Html.HiddenFor(m => m.IsClosed)
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-22
          • 2017-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          • 2011-08-21
          • 2015-11-11
          相关资源
          最近更新 更多