#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
свойство aboolean
?)
Ответ №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». Затем он функционировал нормально. (Странно, я знаю.)