2013-04-16 21 views
5

Listede bir listeden dinamik olarak DropLownlistleri oluşturmak istiyorum, bu da SelectList öğesini ve seçimin kaydedileceği bir alan sağlar. görünümünde foreach-loop içinde çok sayıda DropDownListFor oluştur

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

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

, ben materialSelect Listesi üzerinden döngü istiyoruz ve dinamik DropDownLists oluşturun. Böyle

şey:

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

HttpPost ActionResult azından ben seçilmiş değerleri almak gerekir. Bunu çözmenin bir fikri olan var mı?

+0

Koleksiyon için form denetimleri oluşturmak üzere "foreach" döngüsünü kullanamazsınız - bu [http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943 adresine bakın. # 30094943) bir açıklama için) –

cevap

6

Muhtemelen EditorTemplates kullanarak olmalıdır. Bunlar, tanımladığınız şeyi heyecanla yapmanızı sağlar. Eğer bir kesinlikle yazılan kısmi bir görünüm oluşturursanız ~/Görüntüleme/Shared/EditorTemplates/Material_Select.cshtml (görünüm modeli ile aynı ismini vermek etmiştir) benzediğini: genel formda Sonra

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

sadece arayabilirsiniz:

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

otomatik toplama numaralandırmak ve koleksiyonunda her öğe için editör şablonu hale hangi.

+1

Bu sihir gibi :) – float

5

0 yılında sayım başlangıç ​​varsayarsak, ve eylem sonrası yöntemi tipi ViewModel bir parametre almak, her açılan için bağlama için MaterialId bu deneyebilirsiniz:

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

Teşekkürler! Cevabında değişiklikler yaptım. @Ian Routledge'dan gelen cevap, temel mvc tekniklerini kullandıkça daha iyi uyuyor. – float