数据量未知的下拉列表

时间:2015-06-12 18:29:20

标签: c# asp.net

我有一个dropdownlist,我想将Dictionary绑定到其中,其中键是显示的项目,值存储在value属性标记中。

我发现了这个: bind-html-dropdownlist-with-static-items

但由于您必须手动输入SelectListItem,因此不允许绑定未知数量的项目。我试过这个:

@Html.DropDownList("OverrideConfigList", new List<SelectListItem>
{
     for(KeyValuePair<string, string> entry in Model.IdentifiFIConfiguration.Config.Configuration)
     {
         new SelectListItem { Text = entry.Key, Value = entry.Value}
     }
})

但这也不起作用。有什么建议吗?

编辑: 我的模型类看起来基本上是这样的:

public class DefaultConfigurationModel
{
   public IdentifiFIConfiguration IdentifiFIConfiguration { get; set; }

   public String FiKeySelection { get; set; }

   public List<String> FiConfigKeys
    {
        get
        {
            if (IdentifiFIConfiguration.Config == null)
            {
                return null;
            }

            List<string> fiConfigKeys = new List<string>();

            foreach (KeyValuePair<string, string> entry in IdentifiFIConfiguration.Config.Configuration)
            {
                fiConfigKeys.Add(entry.Key);
            }

            return fiConfigKeys;
        }
    }
}

IdentifiFIConfiguration保留Config,如下所示:

public class IdentifiConfiguration
{
    public Dictionary<String, String> Configuration { get; set; }

    public static IdentifiConfiguration DeserializeMapFromXML(string xml)
    {
        Dictionary<string, string> config = new Dictionary<string, string>();
        XmlDocument configDoc = new XmlDocument();
        configDoc.LoadXml(xml);

        foreach (XmlNode node in configDoc.SelectNodes("/xml/*"))
        {
            config[node.Name] = node.InnerText;
        }

        IdentifiConfiguration identifiConfiguration = new IdentifiConfiguration()
        {
            Configuration = config
        };

        return identifiConfiguration;
    }
}

2 个答案:

答案 0 :(得分:2)

您的尝试很接近,但语法错误。您无法在列表初始化程序中执行for循环。

基本上,你要做的是转换一个事物(键/值对)的集合到另一个事物的集合(SelectListItem s)。您可以使用LINQ select:

执行此操作
Model.IdentifiFIConfiguration.Config.Configuration.Select(c => new SelectListItem { Text = c.Key, Value = c.Value })

您可以选择在末尾添加.ToList().ToArray()以进行静态类型或更快地实现集合,但这不会影响语句的逻辑。

此转换将生成您想要的SelectListItem列表:

@Html.DropDownList(
    "OverrideConfigList",
    Model.IdentifiFIConfiguration.Config.Configuration.Select(c => new SelectListItem { Text = c.Key, Value = c.Value })
)

答案 1 :(得分:0)

您无法将下拉列表绑定到词典 你需要标量属性来绑定选择值 你还需要一个集合来绑定下拉列表 你可以这样做,但那丑陋

@Html.DropDownList("SelectedItemValue", new SelectList(MyDictionary, "Key", "Value"))