2013-04-16 27 views
5

SelectListと選択肢を保存するフィールドを提供するListから動的にDropDownListsを作成したいとします。foreach-loopで多くの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 Listをループして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でカウントスタートを仮定し、あなたの行動のPOSTメソッドは、タイプのViewModelのパラメータを受け取り、あなたはそれぞれのドロップダウンのためにバインド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

関連する問題