复选框和模型绑定的动态列表

时间:2010-07-13 07:25:23

标签: c# asp.net-mvc-2 dynamic checkbox model-binding

我正在尝试创建一个视图,其中包含从数据库动态创建的复选框列表,然后在回发表单时检索所选复选框的列表。

我的EF模型包含一个类:

public class ItemIWouldLikeACheckboxFor {
    public int Id { get; set; }
    public string Description { get; set; }
}

我有一个包含以下列表的视图模型:

public class PageViewModel {
    // various other properties
    public List<ItemIWouldLikeACheckboxFor> checkboxList { get; set; }
}

我的控制器获取方法:

public ActionResult Create() {
    var viewModel = new PageViewModel();
    viewModel.checkboxList = db.ItemIWouldLikeACheckboxFors.ToList();
    return View(viewModel);
}

我的观点:

<% using (Html.BeginForm()) { %>
    <%-- other stuff here... %>

    <% foreach (var item in checkboxList) { %>
        <%: Html.CheckBox( <!-- what exactly ?????? -->) %>
    <% } %>

    <%-- other stuff here...%>
    <input type="submit" />
<% } %>

我的控制器发布方法:

[HttpPost]
public ActionResult Create(PageViewModel viewModel) {
    // do stuff with other fields

    // I would like to do something like:
    foreach (var item in selectedCheckBoxes) {
        // do stuff
    }
}

我似乎无法让它发挥作用。我的基本问题在代码片段中作为注释混合在一起,但回顾一下:

  • 我的视图模型好吗? (我是否需要添加任何内容来捕获选定的内容,而不是仅显示要显示的列表?)
  • 我应该在视图中放置什么来呈现每个复选框?
  • 如何在帖子后访问控制器中的选定复选框?

2 个答案:

答案 0 :(得分:15)

你见过:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

我们基本上编写了自己的控件来呈现HTML,如

<label for="Products"> Select Products </label>
<ul class="checkBoxList">
<li>
    <input type="hidden" value="0" name="Products.Index">
    <input type="checkbox" value="3424" name="Products[0].Id" id="Products0">
    <label for="Products0">iPod touch 3rd Generation</label>
</li>
<li>
    <input type="hidden" value="1" name="Products.Index">
    <input type="checkbox" value="3123" name="Products[1].Id" id="Products1">
    <label for="Products1">Creative Zen</label>
</li>
</ul>
</div>

模型看起来不错,我们编写了一个自定义助手,因此我们的aspx页面如下所示:

<%= Html.DropDownFor(m=>m.products) %>

如果您关注phil haacks post,您的模型应自动绑定到您的控制器中。

答案 1 :(得分:2)

这个问题也是一个很好的答案:CheckBoxList multiple selections: difficulty in model bind back

它有一个使用自定义编辑器模板的解决方案。