Asp.net mvc 4 复选框始终绑定为false,即使选中了asp.net mvc 5

Asp.net mvc 4 复选框始终绑定为false,即使选中了asp.net mvc 5,asp.net-mvc-4,model-view-controller,Asp.net Mvc 4,Model View Controller,我已经创建了一个带有复选框的模型绑定器列表,该复选框应该用于处理我的表单,但是当我发布到控制器时,它总是将复选框设置为false,即使在客户端选中了复选框,有什么帮助吗 我的模型 public class RoleCheckbox { public int id { get; set; } public bool ischecked { get; set; } public string name { get; set; } } public class User

我已经创建了一个带有复选框的模型绑定器列表,该复选框应该用于处理我的表单,但是当我发布到控制器时,它总是将复选框设置为false,即使在客户端选中了复选框,有什么帮助吗

我的模型

   public class RoleCheckbox
{
    public int id { get; set; }
    public bool ischecked { get; set; }
    public string name { get; set; }
}

public class UsersNew
{
    public IList<RoleCheckbox> Roles { get; set; }
    [Required,MaxLength(128)]
    public string username { get; set; }
    [Required,DataType(DataType.Password)]
    public string password { get; set; }
    [Required,MaxLength(256),DataType(DataType.EmailAddress)]
    public string email { get; set; }

}
public类RoleCheckbox
{
公共int id{get;set;}
已检查公共布尔值{get;set;}
公共字符串名称{get;set;}
}
公共类用户新建
{
公共IList角色{get;set;}
[必需,最大长度(128)]
公共字符串用户名{get;set;}
[必需,数据类型(数据类型.密码)]
公共字符串密码{get;set;}
[必需,最大长度(256),数据类型(DataType.EmailAddress)]
公共字符串电子邮件{get;set;}
}
客户端代码

  <div class="panel panel-default">
    <div class="panel-heading">Roles</div>
    <div class="panel-body">
        <ul class="list-group">
            @for (var i = 0; i < Model.Roles.Count; i++)
            {
                <li class="list-group-item">
                    @Html.Hidden("Roles[" +i +"].id",Model.Roles[i].id)
                    <label for="Roles_@(i)_ischecked">
                        @Html.CheckBox("Roles[" +i+ "].id",Model.Roles[i].ischecked)
                        @Model.Roles[i].name
                    </label>
                </li>

            }
        </ul>
    </div>
</div>

角色
    @对于(var i=0;i @Html.Hidden(“角色[“+i+”].id”,Model.Roles[i].id) @复选框(“角色[“+i+”].id”,Model.Roles[i].ischecked) @Model.Roles[i].name }
我的方法

HttpPost,ValidateAntiForgeryToken]
    public ActionResult New(UsersNew form)
    {

        var user = new User();
        syncRole(form.Roles, user.Roles);

        if (Database.Session.Query<User>().Any(u => u.username == form.username))
            ModelState.AddModelError("username", "username must be unique");
        if (!ModelState.IsValid)
            return View(form);

        user.email = form.email;
        user.username = form.username;
        user.SetPassword(form.password);
        Database.Session.Save(user);
        return RedirectToAction("index");
    }
HttpPost,ValidateAntiForgeryToken]
公共行动结果新(用户新表单)
{
var user=新用户();
syncRole(form.Roles、user.Roles);
if(Database.Session.Query().Any(u=>u.username==form.username))
AddModelError(“用户名”,“用户名必须唯一”);
如果(!ModelState.IsValid)
返回视图(表格);
user.email=form.email;
user.username=form.username;
user.SetPassword(form.password);
数据库.Session.Save(用户);
返回操作(“索引”);
}
@Html.CheckBox()
和首选的
@Html.CheckBoxFor()
方法用于绑定到
bool
属性。它们生成值为true的复选框输入和值为false的隐藏输入。您试图将其绑定到属性
id
,而
true
false
的值不能绑定到
int
。在任何情况下,属性
id
都有一个隐藏的输入,因此复选框的值将被忽略(
DefaultModelBinder
仅读取与属性名称匹配的第一个表单值)

您的
ischecked
的值始终为
false
,因为您从未为它提交任何值,所以它只是它的默认值

始终使用strongly-typed
***For()
方法,并将复选框绑定到
bool
属性。你的观点应该是正确的

<ul class="list-group">
    @for (var i = 0; i < Model.Roles.Count; i++)
    {
        <li class="list-group-item">
            @Html.HiddenFor(m => m.Roles[i].id)
            @Html.CheckBoxFor(m => m.Roles[i].ischecked)
            @Html.LabelFor(m => m.Roles[i].ischecked, Model[i].name)
        </li>
    }
</ul>
@Html.CheckBox()
和首选的
@Html.CheckBoxFor()
方法用于绑定到
bool
属性。它们生成值为true的复选框输入和值为false的隐藏输入。您试图将其绑定到属性
id
,而
true
false
的值不能绑定到
int
。在任何情况下,属性
id
都有一个隐藏的输入,因此复选框的值将被忽略(
DefaultModelBinder
仅读取与属性名称匹配的第一个表单值)

您的
ischecked
的值始终为
false
,因为您从未为它提交任何值,所以它只是它的默认值

始终使用strongly-typed
***For()
方法,并将复选框绑定到
bool
属性。你的观点应该是正确的

<ul class="list-group">
    @for (var i = 0; i < Model.Roles.Count; i++)
    {
        <li class="list-group-item">
            @Html.HiddenFor(m => m.Roles[i].id)
            @Html.CheckBoxFor(m => m.Roles[i].ischecked)
            @Html.LabelFor(m => m.Roles[i].ischecked, Model[i].name)
        </li>
    }
</ul>

我也有同样的问题。对我有效的方法是去掉value=“xxx”标签。然后它就正常工作了。(奇怪,我知道。)

我也有同样的问题。对我有效的方法是去掉value=“xxx”标签。然后它就正常工作了。(奇怪,我知道。)

展示你的模型和发帖方式。这不是生成复选框的方法(而且您的
id
属性真的是
布尔值吗?)显示您的模型和发布到的方法。这不是生成复选框的方法(您的
id
属性真的是
布尔值吗?)