Список флажков для сложного типа в asp.net mvc
У меня ниже класса:
public class ControllerSecurityModel
{
public string ControlleName { get; set; }
public string DisplayName { get; set; }
public List<ActionSecurityModel> actions { get; set; }
}
public class ActionSecurityModel
{
public string ActionName { get; set; }
public string DisplayName { get; set; }
public bool IsChecked { get; set; }
}
и модель:
public class PageRoleModel
{
public List<ControllerSecurityModel> AllPages { get; set; }
public List<ControllerSecurityModel> SelectedPage { get; set; }
}
Я хочу иметь флажок для каждой "ActionSecurityModel", я пишу ниже представление:
<% using (Html.BeginForm())
{%>
<% foreach (var cont in Model.AllPages)
{%>
<fieldset>
<legend>
<%= cont.DisplayName %></legend>
<% foreach (var act in cont.actions)
{%>
<%: Html.CheckBoxFor(x => act.IsChecked) %>
<%: Html.Label(act.DisplayName) %>
<% } %>
</fieldset>
<% } %>
<input type="submit" value="save"/>
<% } %>
и это мой контроллер действия:
public ActionResult SetRole()
{
PageRoleModel model = new PageRoleModel();
return View(model);
}
[HttpPost]
public ActionResult SetRole(PageRoleModel model)
{
return View(model);
}
но когда я отправляю форму модель становится нулевой? Как я могу отправить флажки и сохранить их?
1 ответ
Как это:
<% using (Html.BeginForm()) { %>
<% for (var i = 0; i < Model.AllPages.Count; i++) { %>
<fieldset>
<legend>
<%= Model.AllPages[i].DisplayName %>
</legend>
<% for (var j = 0; j < Model.AllPages[i].actions.Count; j++ ) { %>
<%= Html.CheckBoxFor(x => x.AllPages[i].actions[j].IsChecked) %>
<%= Html.Label(Model.AllPages[i].actions[j].DisplayName) %>
}
</fieldset>
<% } %>
<input type="submit" value="save"/>
<% } %>
Чтобы понять, почему мое решение работает, а что нет, ознакомьтесь с ожидаемым форматом проводов, который связыватель модели по умолчанию использует для коллекций. Затем посмотрите на сгенерированные имена полей ввода формы, просмотрев сгенерированный исходный код HTML - вы быстро увидите принципиальную разницу в name
атрибут флажка.
Также не ожидайте связать всю вашу модель в действии POST. У вас есть только одно поле ввода внутри формы - флажок. Так что это единственное значение, которое будет отправлено на сервер и привязано к модели. Если вам нужны и другие значения, вы можете включить их в качестве скрытых полей:
<!-- in the outer loop: -->
<% =Html.HiddenFor(x => x.AllPages[i].DisplayName) %>
...
<!-- and then in the inner loop -->
<%= Html.HiddenFor(x => x.AllPages[i].actions[j].ActionName) %>
<%= Html.HiddenFor(x => x.AllPages[i].actions[j].DisplayName) %>
... and so on ...
Также я очень рекомендую вам использовать шаблоны редактора вместо того, чтобы писать эти циклы в ваших представлениях. Они автоматически позаботятся о создании собственных имен для ваших полей ввода, чтобы вам не приходилось беспокоиться. У меня есть тысячи ответов на эту тему. Просто Google мое имя и добавить editor templates asp.net mvc
к вашему поиску, и вы должны получить много результатов.