ASP.NET MVC - 下拉菜单 - 没有 'IEnumerable<SelectListItem>' 类型的 ViewData 项

ASP.NET MVC - Dropdown - There is no ViewData item of type 'IEnumerable<SelectListItem>'

菜单类型定义:

 public string Code { get; set; } 
 public string Name { get; set; }

ASP.NETMVC 5

我在此处发布问题之前已经搜索并阅读过,

我正在尝试加载 asp.net mvc 下拉列表中的数据,为什么这么复杂?

//控制器

public class ClientController : BaseController
{
    public ActionResult Index()
    {
       List<MenuType> ctypelist = db.ContractTypes.OrderBy(x => x.TypeOfContract).ToList();

       IEnumerable<SelectListItem> list = new SelectList(ctypelist.ToList());
       ViewBag.DropDownTypeOfContract = list;
       return View();
    }

}

//html

@model myapp.Models.Client


@Html.DropDownList("Codes", (List<SelectListItem>)ViewBag.DropDownTypeOfContract , new { style = "max-width: 600px;" })%>

注意: 我在不知道您的 MenuType Class 有哪些变量的情况下发布了这个答案。请添加到您的问题中,我将根据您的 MenuType Class

编辑此答案

所有下拉菜单都是值和文本对的集合。

<select>
<option value=1>TEXT 1</option>
<option value=2>TEXT 2</option>
<option value=3>TEXT 3</option>
</select>

您有一个 List<MenuType> 列表,您希望在下拉列表中显示 MenuType 中的哪些值?

假设您将此设置为 MenuType.cs

public class MenuType
{
  public int MenuTypeId {get;set;}
  public string Name {get;set;}

}

您的下拉菜单应该像这样生成:

    public ActionResult Index()
    {
       Dictionary<int,string> ctypelist = db.ContractTypes.OrderBy(x => x.TypeOfContract).ToDictionary(s => s.MenuTypeId, s=> s.Name);


IEnumerable<SelectListItem> selectListItems = ctypelist.Select(s => new SelectListItem() { Value = s.Key.ToString(), Text = s.Value });

       ViewBag.DropDownTypeOfContract = selectListItems;
       return View();
    }

在视图中:

@{
var items = (IEnumerable<SelectListItem>) ViewBag.DropDownTypeOfContract;
}

    @Html.DropDownList("Codes", items , "Select Item")

复杂的是您似乎无法决定您使用的是哪种类型...

首先你有一个List<MenuType>(我假设ContractTypes实际上是MenuType类型?)然后你创建一个SelectList,传递List<MenuType>对它而言,这意味着 MenuType 必须至少具有两个属性,一个称为 Text,一个称为 Value。如果没有,您将必须在 SelectList 构造函数参数中指定 TextValue 属性 名称。

之后,出于某种原因,您将其转换为 IEnumerable<SelectListItem>,然后将其分配给 ViewBag 项目并调用您的 View。所以,在这一点上,你的 ViewBag.DropDownTypeOfContract 是 IEnumerable<SelectListItem>.

类型

接下来,在您的视图中,您出于某种原因定义了一个 @model 尽管根本没有将任何模型传递给视图。好的....随便...

所以现在我们进入真正的问题。

@Html.DropDownList("Codes", 
    (List<SelectListItem>)ViewBag.DropDownTypeOfContract , 
     new { style = "max-width: 600px;" })%>

好吧,让我们暂时忽略你有一个 WebForms 关闭代码块指示器 (%>) 出于某种原因的事实......这里最大的问题是你试图投射 ViewBag.DropDownTypeOfContract List<SelectListItem>,它不是,也从来不是。

您将 List<MenuType> 转换为 SelectList,然后将其转换为 IEnumerable<SelectListItem>。从来没有任何 List<SelectListItem> 涉及。

所以,简单的解决方法(除了重写你的代码以保持理智之外)就是改变你的演员表:

@Html.DropDownList("Codes", 
    (IEnumerable<SelectListItem>)ViewBag.DropDownTypeOfContract, 
     new { style = "max-width: 600px;" })

编辑:

由于您的 MenuType 不包含适当的属性,您将不得不修改 SelectList(我在上面提到过)。仅供参考,ctypelist 已经是一个列表,无需再次将其转换为列表...这很愚蠢。

IEnumerable<SelectListItem> list = new SelectList(ctypelist, "Code", "Name");