2013-04-16 6 views
5

Ich möchte DropDownLists dynamisch aus einer Liste erstellen, die die SelectList und ein Feld, in dem die Auswahl gespeichert wird, zur Verfügung stellt.viele DropDownListFor in foreach-Schleife erstellen

In der Ansicht möchte ich die materialSelect List durchlaufen und die DropDownLists dynamisch erstellen.

Etwas wie folgt aus:

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

Am Httppost Action Ich brauche die ausgewählten Werte zu erhalten. Hat jemand eine Idee, wie man das löst?

+0

Sie können eine 'foreach'-Schleife nicht verwenden, um Formularsteuerelemente für eine Sammlung zu generieren - lesen Sie [diese Antwort] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943) # 30094943) für eine Erklärung) –

Antwort

6

Sie wahrscheinlich EditorTemplates verwendet werden sollen. Diese erlauben es Ihnen genau das zu tun, was Sie beschreiben. Wenn Sie eine stark typisierte Teilansicht erstellen in ~/Ansichten/Shared/EditorTemplates/Material_Select.cshtml (die Ansicht, die das gleiche wie das Modell mit dem Namen sein), die wie folgt aussieht:

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

dann in Ihrer Gesamtform rufen Sie können einfach:

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

Welches ist Ihre Sammlung automatisch auflisten und die Editor-Vorlage für jedes Element in der Sammlung machen.

+1

Das ist wie Magie :) – float

5

Zähl-Start in 0 Unter der Annahme, und Ihre Aktion post-Methode erhält einen Parameter vom Typ Ansichtsmodell, können Sie versuchen, diese für bindet die MATERIALID für jeden Drop-Down:

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

Danke! Ich habe Änderungen an Ihrer Antwort vorgenommen. Antwort von @Ian Routledge passt besser, da es grundlegende MVC-Techniken verwendet. – float