如何从Viewbag项目列表中选择列表?

时间:2016-09-12 05:50:17

标签: c# asp.net-mvc razor dropdown

我有一个从控制器创建的列表,该列表被传递给一个viewbag项目:

        List<SelectListItem> PTL = new List<SelectListItem>();


        List<PT> PTL2 = db.PT.ToList();



        foreach (var item in PTL2)
        {
            PTL.Add(new SelectListItem { Value = item.ID.ToString(), Text = item.Name });
        }

        ViewBag.PTL2 = PTL2;

然后,在视图中,我从另一个问题尝试了以下内容:

               @Html.DropDownList("test", new SelectListItem[]{ 
            new SelectListItem() {Text = "Exemplo1", Value="Exemplo1"},
            new SelectListItem() {Text = "Exemplo2", Value="Exemplo2"},
            new SelectListItem() {Text = "Exemplo3", Value="Exemplo3"}}
            , htmlAttributes: new { @class = "form-control" })

工作正常,但是,如果我尝试将其编辑为以下内容:

               @Html.DropDownList("test", ViewBag.PTL2, htmlAttributes: new { @class = "form-control" })

我收到各种错误。

我花了几个小时尝试不同的组合,不同的演员等等,但是,我似乎没有取得进展。

我看到了很多不同的错误 - 最常见的错误是

  

ViewData类型的IEnumerable<SelectListItem>项没有   有关键“测试”'

但是,我尝试在这里根据不同的问题进行铸造和更改名称,但是,我似乎无法理解这一点。

此时,我正在考虑为内容制作手动HTML下拉列表和foreach循环,但这似乎是浪费。

有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:2)

第二个参数必须是用于填充下拉列表的System.Web.Mvc.SelectListItem个对象的集合。但是,在这种情况下,您使用的是ViewBag属性,其类型为dynamic。因此,您必须将其强制转换为SelectListItem的集合。否则,您将在MVC 4 +中收到此错误:

  

无法动态调度扩展方法

因此。结果只是改变了 ViewBag.PTL2ViewBag.PTL2 as IEnumerable<SelectListItem>

答案 1 :(得分:0)

我希望现在还为时不晚,这就是我使用 .net core 的方式 在您的控制器中,使用以下代码

 public ActionResult ShowCalendar()
        {
            var programs = new Microsoft.AspNetCore.Mvc.Rendering.SelectList((new Programs().GetAll().ToList(), "ID", "Name")  
 
            ViewBag.AllItems = programs;
 
            return View();
        }

并在您的 cshtml 文件中使用以下内容

            <select id="ItemID" class="form-control"
                    asp-items="ViewBag.AllItems">
                <option disabled selected>--- @Localizer["PleaseSelect"] ---</option>
            </select>

将为您完成工作