如何从 Viewbag 项目列表中创建 select 列表?

How do I make a select list from a Viewbag item list?

我有一个从传递到 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" })

我遇到各种错误。

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

我见过很多不同的错误 - 最常见的错误是'

There is no ViewData item of type IEnumerable<SelectListItem> that has the key “test”'

但是,我尝试根据此处的不同问题强制转换和更改名称,但是,我似乎无法克服这个问题。

在这一点上,我正在考虑制作一个手动 HTML 下拉列表和一个 foreach 内容循环,但是,这似乎是一种浪费。

有人知道我做错了什么吗?

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

Extension methods cannot be dynamically dispatched

所以。结果只是改变 ViewBag.PTL2ViewBag.PTL2 as IEnumerable<SelectListItem>.

我希望现在还不算太晚,这就是我使用 .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>

将为您代劳