13

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

我的 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
    }
}

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

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

2 回答 2

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 的帖子,您的模型应该会自动绑定到您的控制器中。

于 2010-07-13T09:51:21.113 回答
2

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

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

于 2013-03-06T19:38:37.890 回答