即使选中了 asp.net mvc 5,复选框也始终绑定到 false

Von*_*a21 0 model-view-controller asp.net-mvc-4

我创建了一个带有复选框的模型绑定器列表,该复选框应该处理我的表单,但是当我发布到控制器时,它总是将复选框设置为 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; }

}
Run Code Online (Sandbox Code Playgroud)

客户代码

  <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>
Run Code Online (Sandbox Code Playgroud)

我的方法

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");
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

@Html.CheckBox()和 首选@Html.CheckBoxFor()方法用于绑定到bool属性。它们生成值为 true 的复选框输入和值为 false 的隐藏输入。您尝试将其绑定到属性,但或 的id值无法绑定到. 无论如何,您已经有了 property 的隐藏输入,因此该复选框的值将被忽略(仅读取与属性名称匹配的第一个表单值)。truefalseintidDefaultModelBinder

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

始终使用强类型***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>
Run Code Online (Sandbox Code Playgroud)

请注意,name除非您还包括,否则不会提交该属性@Html.HiddenFor(m => m.Roles[i].name)

在 POST 方法中,您可以使用以下命令获取所选角色的 ID

IEnumerable<int> selected = model.Roles.Where(x => x.ischecked).Select(x => x.id);
Run Code Online (Sandbox Code Playgroud)