2013-04-16 126 views
5

我想從列表中動態創建DropDownLists,該列表提供了SelectList和一個用於保存選擇的字段。在foreach循環中創建多個DropDownListFor

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

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

在視圖中,我想通過materialSelect列表循環和動態創建DropDownLists。

事情是這樣的:

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我需要選擇的值。有沒有人有一個想法如何解決這個問題?

+0

您不能使用'foreach'循環爲集合生成表單控件 - 參考[this answer](http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943 #30094943)的解釋) –

回答

6

你或許應該使用EditorTemplates。這些允許你激動地描述你所描述的內容。如果你創建一個強類型的局部視圖〜/查看/共享/ EditorTemplates/Material_Select.cshtml(視圖已經被命名爲相同型號),看起來像:

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

然後在你的整體形式你可以撥打電話:

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

它會自動枚舉你的集合併爲集合中的每個項目渲染編輯器模板。

+1

那就像神奇:) – float

5

假設在0計數開始,你的動作後收到的方法類型視圖模型的參數,你可以嘗試一下本作綁定MaterialId每個下拉:

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

謝謝!我對你的答案做了修改。來自@Ian Routledge的回答更好,因爲它使用基本的mvc技術。 – float