无论选择什么,CheckBox助手都会继续发送错误值

时间:2013-05-11 20:17:03

标签: asp.net-mvc html-helper

这是我的代码:

@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个假。如果我勾选1复选框,我会得到4个值,即1个真值和3个谬误,依此类推。当我检查所有这些时,我得到3个值,即True,False,True,False,True和False。

有没有理由,复选框在每种情况下至少发送错误?

1 个答案:

答案 0 :(得分:0)

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

  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());