我有以下课程:
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);
}
但是当我提交表单时,模型为空? 如何提交复选框并保存?
答案 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
即可获得很多结果。