这是我的代码:
@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。
有没有理由,复选框在每种情况下至少发送错误?
答案 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());