Список флажков для сложного типа в 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 к вашему поиску, и вы должны получить много результатов.

Другие вопросы по тегам