模型中来自Dictionary(KVP)的多个DropDownLists

时间:2016-01-03 07:31:00

标签: c# asp.net-mvc razor

我正在尝试动态创建多个下拉列表(ASP.Net MVC项目),以便用户映射列以从CSV文件导入数据。我从CSV文件中获取列的列表,并将它们放在SelectList中。这些是用户为每个目标选择的SourceColumns。

如果我对目标索引进行硬编码,它可以正常工作。我的意思是,如果我为每个目标索引添加一个整数属性。

但是,我需要动态创建它,所以我在我的模型中添加了一个Dictionary来保存目标名称和选定的源索引。目标只是键值对(IDictionary<string key, int? value>),其中value是源列的索引。

然而,使用字典我无法弄清楚如何将值返回给我的控制器。它们的键返回null值。也许这对Html助手来说是不可能的,但欢迎提出任何建议。

模型

public class ProductionImportModel 
{
    public IDictionary<string, int ?> ColumnIndices { get; set; } 
    // plus other properties
}

控制器

model.ColumnIndices.Add("Line", null);

视图

@foreach (var kvp in @Model.ColumnIndices)
{
    @Html.DropDownList("Model.ColumnIndices[" + @kvp.Key + "].Key", (SelectList)ViewBag.SourceColumns, String.Empty, null)
}

生成的HTML

<select id="Model_ColumnIndices_Line__Key" name="Model.ColumnIndices[Line].Key">
    <option value=""></option>
    <option value="0">Col1</option>
    <option value="1">Col2</option>
    <option value="2">Col3</option>
</select>

1 个答案:

答案 0 :(得分:0)

解决方案对我的观点略有改动。我没有为模型装订器提供正确的信息。我使用了DropDownList For ()帮助器而不是DropDownList()。

修订后的视图

@foreach (var kvp in @Model.ColumnIndices)
{
    @Html.DropDownListFor(m => @Model.ColumnIndices[@kvp.Key], (SelectList)ViewBag.SourceColumns, String.Empty, null)
}

这意味着生成的HTML看起来像这样

<select id="ColumnIndices_Line_" name="ColumnIndices[Line]">
    <option value=""></option>
    <option value="0">Col1</option>
    <option value="1">Col2</option>
    <option value="2">Col3</option>
</select>