asp mvc @Html.CheckBox("sel",true) 往后台传值问题
@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 = "老年人" })老年人
存在就选上
2018-1-16
新增页面变成这样子
验证不通过 复选框也选上
@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;" })老年人