флажок всегда привязывается к false, даже если он установлен asp.net mvc 5

#asp.net-mvc-4 #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; }

}
 

клиентский код

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

мой метод

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

Комментарии:

1. Покажите свою модель и метод, к которому вы проводите публикацию. Это не способ создания флажка (и действительно ли ваше id свойство a boolean ?)

Ответ №1:

@Html.CheckBox() И предпочтительные @Html.CheckBoxFor() методы предназначены для привязки к bool свойствам. Они генерируют ввод флажка со значением true и скрытый ввод со значением false. Вы пытаетесь привязать его к свойству id , а значение true or false не может быть привязано к an int . В любом случае у вас уже есть скрытый ввод для свойства id , поэтому значение флажка игнорируется ( DefaultModelBinder считывается только первое значение формы, соответствующее имени свойства).

Значение 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>
 

Обратите внимание, что name свойство не будет отправлено, если вы также не включите @Html.HiddenFor(m => m.Roles[i].name)

Затем в методе POST вы можете получить идентификаторы выбранных ролей, используя

 IEnumerable<int> selected = model.Roles.Where(x => x.ischecked).Select(x => x.id);
 

Ответ №2:

У меня была та же проблема. Что сработало для меня, так это удаление тега value=»xxx». Затем он функционировал нормально. (Странно, я знаю.)