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
构造函数参数中指定 Text
和 Value
属性 名称。
之后,出于某种原因,您将其转换为 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");
菜单类型定义:
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
构造函数参数中指定 Text
和 Value
属性 名称。
之后,出于某种原因,您将其转换为 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");