添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

@Html.CheckBox( "sel" , true )

生成2个输入,而不是一个,这是为什么呢?

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

如果未选中复选框,则不会提交表单字段。 这就是为什么隐藏领域总是存在虚假价值的原因。 如果您不选中复选框,窗体将仍然具有来自隐藏字段的值。 这就是ASP.NET MVC如何处理复选框值。

如果你想确认一下,把一个复选框放在不是Html.Hidden的表单上,而是用 <input type="checkbox" name="MyTestCheckboxValue"></input> 离开复选框,提交表单,并在服务器端查看张贴的请求值。 你会看到没有复选框的值。 如果你有隐藏的领域,它将包含 有价值的 MyTestCheckboxValue 条目 false

checkbox如果不选中的话,提交表单时它是不会被提交的,这样会导致服务器端controller中Model Binder失败或出错,所以加了隐藏文本框,它的值永远是false,也就是checkbox不选中的话提交的就是这个隐藏文本框的值

选中的时候,false也提交过了,这样不就提交了两个值吗

对,同时提交两个值:true和false,如果是用Model Binder自动绑定对象的话,它会检查提交的值中有没有true,如果有true,它就用true值优先绑定,如果是你自己用Request.Form这样来获取checkbox的值的话,那就小心了,因为你获取的是两个值:true和false

你可以写一个帮手来防止添加隐藏的输入:

using System.Web.Mvc;
using System.Web.Mvc.Html;
public static class HelperUI
    public static MvcHtmlString CheckBoxSimple(this HtmlHelper htmlHelper, string name, object htmlAttributes)
        string checkBoxWithHidden = htmlHelper.CheckBox(name, htmlAttributes).ToHtmlString().Trim();
        string pureCheckBox = checkBoxWithHidden.Substring(0, checkBoxWithHidden.IndexOf("<input", 1));
        return new MvcHtmlString(pureCheckBox);
@Html.CheckBoxSimple("foo", new {value = bar.Id})

2新增页面 里的复选 

@Html.CheckBox("ShiYiObjects", new { value = "幼儿" })幼儿
@Html.CheckBox("ShiYiObjects", new { value = "青少年" })青少年
@Html.CheckBox("ShiYiObjects", new { value = "成人" })成人
@Html.CheckBox("ShiYiObjects", new { value = "老年人" })老年人 

每个生成2个<input type=“checkbox” />

Request["ShiYiObjects"]  这样获取 得到一个 字符串 中间用逗号隔着

Create(List<string> ShiYiObjects)  参数获取(对象参数获取)  数组   有 8 个 元素 因为有 隐藏域

<input name="ShiYiObjects" type="checkbox" value="幼儿"  />幼儿
<input name="ShiYiObjects" type="checkbox" value="青少年" />青少年
<input name="ShiYiObjects" type="checkbox" value="成人"  />成人
<input name="ShiYiObjects" type="checkbox" value="老年人"  />老年人

Request["ShiYiObjects"]  这样获取 得到一个 字符串 中间用逗号隔着

Create(List<string> ShiYiObjects) 参数获取(对象参数获取)  获取的是一个数组     4 个 元素 

3编辑页面 里的复选 

<input name="ShiYiObjects" type="checkbox" value="幼儿" @if (Model.ShiYiObject.Contains("幼儿")) { @Html.Raw("checked='checked' ") } />幼儿
<input name="ShiYiObjects" type="checkbox" value="青少年" @if (Model.ShiYiObject.Contains("青少年")) { @Html.Raw("checked='checked' ") } />青少年
<input name="ShiYiObjects" type="checkbox" value="成人" @if (Model.ShiYiObject.Contains("成人")) { @Html.Raw("checked='checked' ") } />成人
<input name="ShiYiObjects" type="checkbox" value="老年人" @if (Model.ShiYiObject.Contains("老年人")) { @Html.Raw("checked='checked' ") } />老年人

@Html.CheckBox("ShiYiObjects", Model.ServiceGroups.Contains("幼儿"), new { value = "幼儿" })幼儿
@Html.CheckBox("ShiYiObjects", Model.ServiceGroups.Contains("青少年"), new { value = "青少年" })青少年
@Html.CheckBox("ShiYiObjects", Model.ServiceGroups.Contains("成人"), new { value = "成人" })成人
@Html.CheckBox("ShiYiObjects", Model.ServiceGroups.Contains("老年人"), new { value = "老年人" })老年人

存在就选上

新增页面变成这样子

验证不通过 复选框也选上

@Html.CheckBox("ShiYiObjects", Model.ShiYiObject.Contains("幼儿"), new { value = "幼儿", style = "position: unset;" })幼儿
@Html.CheckBox("ShiYiObjects", Model.ShiYiObject.Contains("青少年"), new { value = "青少年", style = "position: unset;" })青少年
@Html.CheckBox("ShiYiObjects", Model.ShiYiObject.Contains("成人"), new { value = "成人", style = "position: unset;" })成人
@Html.CheckBox("ShiYiObjects", Model.ShiYiObject.Contains("老年人"), new { value = "老年人", style = "position: unset;" })老年人