asp.net mvc中复杂类型的复选框列表

时间:2012-09-25 12:42:50

标签: c# asp.net-mvc checkbox

我有以下课程:

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 个答案:

答案 0 :(得分:4)

像这样:

<% 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"/>
<% } %>

要了解我的解决方案为什么起作用而你的解决方案无效,请阅读默认模型绑定器用于集合的预期wire format。然后通过浏览生成的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即可获得很多结果。