模型中字典(KVP)中的多个下拉列表

本文关键字:下拉列表 KVP 字典 模型 | 更新日期: 2023-09-27 18:28:50

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

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

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

然而,使用字典,我无法计算出如何将值返回到我的控制器。它们的键返回时为空值。也许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>

模型中字典(KVP)中的多个下拉列表

该解决方案是对我的视图的一个小更改。我没有为模型活页夹提供正确的信息。我使用了DropDownListFor()帮助程序,而不是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>