ASP.NET MVC - 下拉列表 - 没有类型为'IEnumerable <selectlistitem>'的</selectlistitem>的ViewData项目

时间:2015-01-16 16:15:36

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

MenuType definiation:

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

ASP.NET MVC 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;" })%>

2 个答案:

答案 0 :(得分:2)

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

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

之后,出于某种原因,您将其转换为IEnumerable<SelectListItem>,然后将其分配给ViewBag项并调用您的View。因此,此时,ViewBag.DropDownTypeOfContract的类型为IEnumerable<SelectListItem>

接下来,在您的视图中,您出于某种原因定义了@model,而没有将任何模型传递给视图。好的......无论如何......

所以现在我们遇到了真正的问题。

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

好吧,让我们暂时忽略一下因为某种原因你有一个WebForms关闭代码块指示符(%&gt;)的事实......这里最大的问题是你正在尝试施放ViewBag.DropDownTypeOfContractList<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");

答案 1 :(得分:1)

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

编辑此答案

所有下拉列表都是值和文本对的集合。

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

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

假设您将此作为MenuType.cs

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

}

你的dropDown应该像这样生成:

    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")