2013-04-16 13 views
5

Voglio creare DropDownLists dinamicamente da un elenco, che fornisce la SelectList e un campo in cui salvare la selezione.crea molti DropDownListFor nel ciclo foreach

public class ViewModel 
{ 
    public List<Material_Select> materialSelect { get; set; } 
} 

public class Material_Select 
{ 
    public SelectList selectList { get; set; } 
    public int MaterialId { get; set; } 
} 

Nella vista, voglio scorrere l'elenco materialSelect e creare il DropDownList dinamicamente.

Qualcosa di simile a questo:

int count = 0; 
foreach (var item in Model.materialSelect) 
{ 
    count++; 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.materialSelect) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(item.MaterialId, item.selectList) 
    </div>  
} 

Al HttpPost ActionResult ho bisogno di ottenere i valori selezionati. Qualcuno ha un'idea di come risolvere questo?

+0

Non è possibile utilizzare un ciclo 'foreach' per generare controlli modulo per una raccolta - fare riferimento [questa risposta] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943 # 30094943) per una spiegazione) –

risposta

6

Si dovrebbe probabilmente utilizzando EditorTemplates. Questi ti permettono di fare esattamente quello che stai descrivendo. Se si crea una vista parziale fortemente tipizzato in ~/Vista/comune/EditorTemplates/Material_Select.cshtml (la vista è di essere nominato lo stesso del modello) che assomiglia a:

@model Material_Select 

<div class="editor-label"> 
    @Html.LabelFor(m => m.MaterialId) 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(m => m.MaterialId, Model.selectList) 
</div> 

Poi, nel tuo forma complessiva puoi semplicemente chiamare:

Che automaticamente enumera la tua raccolta e renderizza il modello di editor per ogni oggetto della collezione.

+1

Questo è magico :) – float

5

Supponendo inizio conteggio 0, e il metodo di azione da applicare dopo riceve un parametro di tipo ViewModel, si può provare questo per legano la MaterialId per ogni discesa:

foreach (var item in Model.materialSelect) 
{ 
    count++; 
    <div class="editor-label"> 
     Name for de dropdown 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("materialSelect[" + count + "].MaterialId ", item.selectList) 
     @Html.ValidationMessageFor(model => model.gradationId) 
    </div>  
} 
+0

Grazie! Ho apportato delle modifiche alla tua risposta. Risposta di @Ian Routledge si adatta meglio poiché utilizza tecniche di base in mvc. – float