2010-07-13 9 views
12

Sto provando a creare una vista che contiene un elenco di caselle di controllo create dinamicamente da un database e quindi recuperare l'elenco di quelle selezionate quando il modulo viene postposto.Elenco dinamico di caselle di controllo e associazione modello

Il mio modello EF contiene una classe:

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

Ho un modello vista che contiene un elenco di questi:

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

Il mio metodo di controllo get:

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

mio view:

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

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

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

Il mio metodo di controllo del messaggio:

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

io non riesco a farlo funzionare. Le mie domande di base sono mescolate come commenti nei frammenti di codice, ma per riassumere:

  • Il modello di visualizzazione è OK? (devo aggiungere qualcosa per catturare quelli selezionati anziché semplicemente la lista da visualizzare?)
  • Cosa devo mettere nella vista per rendere ogni casella di controllo?
  • Come accedere alle caselle di controllo selezionate nel controller dopo il post?

risposta

14

Hai visto: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx?

Fondamentalmente, abbiamo scritto il nostro controllo per rendere il codice HTML come

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

modello sembra ok, abbiamo scritto un aiuto personalizzato, così i nostri pagine aspx assomigliano:

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

Se si seguono phil haacks post, il tuo modello dovrebbe automaticamente legarsi al tuo controller.

+0

Grazie mille, questa combinazione di informazioni mi ha fatto superare la linea. Il prossimo passo (quando avrò più tempo) è quello di legarlo in un aiutante come te ... – Jon

+0

Ci sono molte risorse su assistenti personalizzati quindi starai bene! Godere! –