2010-07-13 72 views
12

我試圖創建一個視圖,其中包含從數據庫動態創建的複選框列表,然後在表單回發時檢索選定列表。動態列表的複選框和模型綁定

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

我控制器get方法:

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

我控制器POST方法:

[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 
    } 
} 

我似乎無法得到它的工作。我的基本問題是混合在代碼片斷意見,但回顧:

  • 是我的視圖模型OK? (我是否需要添加任何內容來捕獲所選內容,而不僅僅是要顯示的列表?)
  • 究竟應該在視圖中放置什麼來呈現每個複選框?
  • 如何在帖子後訪問控制器中選定的複選框?

回答

14

你見過: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) %> 

如果按照菲爾駭客發帖,你的模型應該自動綁定在你的控制器中。

+0

非常感謝你,信息的組合讓我滿意。下一步(當我有更多的時間)是把它綁在一個幫手,就像你有... – Jon 2010-07-13 14:24:06

+0

有很多的資源定製助手,所以你會沒事的!請享用! – 2010-07-13 15:00:05