【问题标题】:CheckBox helper keeps sending false value no matter what's the selection无论选择什么,CheckBox 助手都会不断发送错误值
【发布时间】:2013-05-12 04:29:07
【问题描述】:

这是我的代码:

@using (Html.BeginForm("AddMCondition", "Admin"))
{
  <td class="admin-textbox">
      @Html.TextBox("txtMCondition")
  </td>
  <td>
     @foreach (var exerType in Model.AllExerciseTypes)
     {
      <label>
         @Html.CheckBox("RestrictedType")
         @exerType.Name
      </label>
     }
       <input type="submit" value="Add Medical Condition" />
     </td>
 }

这就是我在控制器中检索值的方式

public ActionResult AddMCondition(string txtMCondition, string[] RestrictedType)
{
   //Code here...
}

AllExerciseTypes 集合中只有 3 个项目。我注意到每个复选框都向控制器发送至少一个 false 值,无论它是否被选中。如果我不选中任何复选框,我会在集合中得到 3 false。如果我选中 1 个复选框,我会得到 4 个值,即 1 个真值和 3 个假值,依此类推。当我检查所有这些时,我得到 3 个值,即 True、False、True、False、True 和 False。

有什么原因,复选框在每种情况下都至少发送 false 吗?

【问题讨论】:

    标签: asp.net-mvc html-helper


    【解决方案1】:

    这是因为复选框的 Html Helper 添加了一个额外的值为 false 的隐藏字段,以确保即使未选中复选框,也会将某些内容发送回服务器。如果您将&lt;input type="checkbox" name="cbSomething" value="true"/&gt; 添加到您的表单并在未选中复选框的情况下将其发回,那么您将不会将值发送回服务器。如果您使用强类型辅助扩展(例如Html.CheckBoxFor(m =&gt; m.RestrictedType))并将复选框绑定到模型上的属性,则模型绑定器会将值正确绑定到模型属性。这是 MVC 中输入扩展的代码 sn-p:

      if (inputType != InputType.CheckBox)
        return TagBuilderExtensions.ToMvcHtmlString(tagBuilder1, TagRenderMode.SelfClosing);
      StringBuilder stringBuilder = new StringBuilder();
      stringBuilder.Append(tagBuilder1.ToString(TagRenderMode.SelfClosing));
      TagBuilder tagBuilder2 = new TagBuilder("input");
      tagBuilder2.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden));
      tagBuilder2.MergeAttribute("name", fullHtmlFieldName);
      tagBuilder2.MergeAttribute("value", "false");
      stringBuilder.Append(tagBuilder2.ToString(TagRenderMode.SelfClosing));
      return MvcHtmlString.Create(((object) stringBuilder).ToString());
    

    【讨论】:

    • 对不起,我没听懂。我需要添加 value="true"?如果我不选中复选框怎么办?它的值在控制器级别仍然是 true 吗?
    • 不,这只是一个任意值。如果您不选中复选框,则会使用该复选框的名称将 false 值发送回服务器(由于隐藏字段)。如果您选中复选框,您为该复选框明确设置的值也将被发回(通常为 true,因为我们倾向于将复选框用作布尔值)。如果您使用模型绑定,即使有 2 个值返回,绑定程序也会根据复选框是否被选中来知道将模型属性设置为 true 还是 false。
    • 我不能使用模型,因为它很大,整个页面的表格比较多。也许我只需要自己实现逻辑,即找出 false 和 true 的模式。
    • 最坏的情况是最坏的情况,您可以将FormCollection 作为额外参数传递,并从那里获取与名称匹配的值。如果您有 2 个特定名称,则该复选框已被选中(测试值是否确定)。如果您只有一个,则它只是默认的隐藏字段值。不是很干净,但比通过布尔列表更好
    • 谢谢。使用 FormCollection 是一个不错的捷径。
    猜你喜欢
    • 2012-10-22
    • 2013-12-25
    • 2016-10-27
    • 2021-03-08
    • 2019-09-06
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多