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

时间:2016-10-15 08:41:34

标签: asp.net-mvc-4 model-view-controller

我创建了一个带有复选框的模型活页夹列表,该复选框应该处理我的表单但是当我发布到控制器时,它总是将复选框设置为false,即使在客户端检查了任何帮助吗?

我的模特

library(dplyr)
df1 %>% 
    group_by(Date, DayOfWeek) %>%
    summarise(N = n_distinct(Url)) %>% 
    group_by(DayOfWeek) %>% 
    summarise(N = mean(N))
# DayOfWeek        N
#      <chr>    <dbl>
#1    Friday 3.000000
#2  Saturday 3.000000
#3    Sunday 1.000000
#4  Thursday 3.333333
#5 Wednesday 1.000000

客户端代码

   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; }

}

我的方法

  <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>

2 个答案:

答案 0 :(得分:2)

@Html.CheckBox()和首选@Html.CheckBoxFor()方法用于绑定bool属性。它们生成一个值为true的复选框输入和一个值为false的隐藏输入。您尝试将其绑定到属性id,而truefalse的值无法绑定到int。在任何情况下,您已经拥有属性id的隐藏输入,因此忽略该复选框的值(DefaultModelBinder仅读取与属性名称匹配的第一个表单值。)

ischecked的值始终为false,因为您永远不会为其提交任何值,因此它只是默认值

始终使用stronlgly类型***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>

请注意,除非您还包含name

,否则不会提交@Html.HiddenFor(m => m.Roles[i].name)媒体资源

在POST方法中,您可以使用

获取所选角色的ID
IEnumerable<int> selected = model.Roles.Where(x => x.ischecked).Select(x => x.id);

答案 1 :(得分:-1)

我有同样的问题。对我有用的是摘下value =“ xxx”标签。然后它正常运行。 (很奇怪,我知道。)