我有一个从控制器创建的列表,该列表被传递给一个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
循环,但这似乎是浪费。
有谁知道我做错了什么?
答案 0 :(得分:2)
第二个参数必须是用于填充下拉列表的System.Web.Mvc.SelectListItem
个对象的集合。但是,在这种情况下,您使用的是ViewBag
属性,其类型为dynamic
。因此,您必须将其强制转换为SelectListItem
的集合。否则,您将在MVC 4 +中收到此错误:
无法动态调度扩展方法
因此。结果只是改变了
ViewBag.PTL2
至
ViewBag.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>
将为您完成工作