2013-04-16 16 views
5

Chcę utworzyć DropDownLists dynamicznie z listy, która dostarcza SelectList i pole do zapisania wyboru.utworzyć wiele DropDownListFor w pętli 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; } 
} 

W widoku chcę przechodzić przez listę materiałów i tworzyć dynamicznie DropDownLists.

coś takiego:

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

Na HttpPost ActionResult Muszę dostać wybrane wartości. Czy ktoś ma pomysł, jak to rozwiązać?

+0

Nie można użyć pętli foreach do wygenerowania formantów formularzy dla kolekcji - zobacz [ta odpowiedź] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943 # 30094943) za wyjaśnienie) –

Odpowiedz

6

Należy prawdopodobnie używając EditorTemplates. Dzięki nim możesz zrobić to, co opisujesz. Jeśli utworzysz silnie wpisany częściowy widok w ~/Views/Shared/EditorTemplates/Material_Select.cshtml (widok musi być nazwany tak samo jak model), który wygląda następująco:

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

potem w ogólnej postaci możesz po prostu zadzwonić:

@Html.EditorFor(m => m.materialSelect) 

Która automatycznie wyliczy Twoją kolekcję i wyrenderuje szablon edytora dla każdej pozycji w kolekcji.

+1

To jak magia :) – float

5

Zakładając rozpoczęcia zliczania w 0, a metody działania po otrzymać parametr typu ViewModel, można spróbować to dla wiążą się MaterialId dla każdej listy rozwijanej:

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

Dzięki! Wprowadziłem zmiany w Twojej odpowiedzi. Odpowiedź od @Ian Routledge jest lepsza, ponieważ wykorzystuje podstawowe techniki mvc. – float