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;" })老年人

 

 

 

 

 

 

 

 

posted @ 2017-12-19 14:29  ~雨落忧伤~  阅读(3751)  评论(0编辑  收藏  举报