首页 > 解决方案 > 如何使用 Razor/MVC 5 将元素动态添加到下拉列表

问题描述

我需要在我的 asp.net 应用程序中更改以下下拉列表,现在我必须根据用户类型添加值,这在以前是不需要的。以下代码可以正常工作,但显然我正在对元素的输入进行硬编码。

@Html.DropDownListFor(
    model => model.Vote, 
    new SelectList(
        new List<SelectListItem> {
            new SelectListItem { Selected=true, Text = "Randy", Value = "1" }, 
            new SelectListItem { Selected=false, Text = "Richard", Value = "2" },
            new SelectListItem { Selected=false, Text = "Bubbles", Value = "3" }, 
            new SelectListItem { Selected=false, Text = "Julian", Value = "4" } 
        }, 
        "Value", 
        "Text"
    ), 
    htmlAttributes: new { @class = "form-control" }
)

我正在从控制器接收列表,我可以遍历它,但我无法将此信息用作SelectListItems。Obvioulsy,第一个和最后一个SelectListItems 是特殊的,第一个具有属性Selected设置为true,而其他设置为false,默认选择第一个。另一方面,最后一个在它的结束标记之前没有逗号,}而前一个是这样的,所以这就是我循环的方式。

@for (var i = 0; i < candidatos.Count(); i++)
{
    if (i == 0)
    {
        <h4>"First candidate:" + candidatos.ElementAt(i)</h4>
    }
    else if (i < candidatos.Count() - 1)
    {
        <h4>"Not first nor last:" + candidatos.ElementAt(i)</h4>
    }
    else
    {
        <h4>"Last candidate:" + candidatos.ElementAt(i)</h4>
    }
}

所以这是正确输出,但我真的需要语法帮助,我一直在努力将此迭代与我硬编码的语法结合起来,并将元素正确显示为下拉列表中的项目,但我不知道如何,然而。

这就是我尝试将这两种东西结合起来的方式,但是我遇到了错误。

@Html.DropDownListFor(model => model.Voto, new SelectList(new List<SelectListItem> { 
    for (var i = 0; i < candidatos.Count(); i++)
{
    if (i == 0)
    {
        new SelectListItem { Selected = true, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() },
    }
    else if (i < candidatos.Count() - 1)
    {
        { new SelectListItem { Selected = false, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() },
    }
    else
    {
        { new SelectListItem { Selected = false, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() } }, "Value", "Text" ),
            htmlAttributes: new { @class = "form-control" })
    }
}

浏览器对我大喊大叫,说表达式需要}关闭

@Html.DropDownListFor(model => model.Voto, new SelectList(new List<SelectListItem> { 

我认为它没有意识到我正在提供相应的结束标签,并且使用 for 循环缺少元素,但显然,因为我做错了。

标签: c#asp.netdrop-down-menudropdownhtml-select

解决方案


首先要做的是创建一个新变量来存储我们的 SelectListItem。然后我们将迭代我们的“候选人”,我们将添加一个新项目,其属性将根据您的逻辑进行设置。

@{ 
    var selectListItems = new List<SelectListItem>();

    for (int i = 0; i < candidatos.Count(); i++)
    {
        if (i == 0)
        {
            selectListItems.Add(new SelectListItem { Selected = true, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() });
        }
        else if (i < candidatos.Count() - 1)
        {
             selectListItems.Add(new SelectListItem { Selected = false, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() });
        }
        else
        {
             selectListItems.Add(new SelectListItem { Selected = false, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() });
        }
    }
}

最后,您会将新生成的列表作为第二个参数传递给 Html 类的 DropDownListFor 方法。

@Html.DropDownListFor(m => m.Voto, selectListItems, htmlAttributes: new { @class = "form-control" });

我希望我的解决方案能满足您的需求。如果您有任何问题,请告诉我。


推荐阅读