没有types为“IEnumerable <SelectListItem>”的ViewData项具有键“xxx”

在Stack Overflow上有一些关于这个的post,但是没有一个在我目前的情况下似乎解决了这个问题。

我有一个表中的一个页面,每一行都有一个文本字段和一个下拉列表。 所有的下拉列表需要使用相同的SelectList数据,所以我已经设置如下:

调节器

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name"); 

视图

 <%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %> 

我已经在很多地方使用了这个设置,但由于某些原因,在这个特定的视图中,我得到了错误:

没有types为“IEnumerable”的ViewData项目具有关键字“submarket_0”。

好的,所以答案是来自其他一些关于这个问题的post,它是:

如果你的ViewData包含一个和你的DropDownList同名的SelectList ,即“submarket_0”, 如果你不指定第二个参数 ,在这个例子中是源SelectList,那么Html帮助器会自动填充你的DropDownList

我的错误发生了什么事情是:

由于包含下拉列表的表在部分视图中并且ViewData已经被更改并且不再包含我所引用的SelectList ,所以HtmlHelper (而不是抛出错误)试图在ViewData中find名为“submarket_0”的SelectList (GRRRR !!!)它仍然无法find,然后抛出一个错误:)

如果我错了,请纠正我

老问题,但这是对问题的另一种解释。 即使您已经强制input了视图,并且没有使用ViewData创build下拉列表,也会得到此错误。 当您查看MVC源代码时,错误的原因可以变得清晰:

 // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = htmlHelper.GetSelectData(name); usedViewData = true; } 

所以如果你有这样的东西:

@Html.DropDownList("MyList", Model.DropDownData, "")

Model.DropDownData为null,MVC通过ViewData查找名为Model.DropDownData东西,并在ViewData中没有包含该名称的对象时引发错误。

我有同样的错误,我认为问题是错误文本混淆 ,因为它给一个错误的关键名称。

在你的情况它应该说:“有没有ViewData项目的types'IEnumerable'有关键”子市场“”。

我的错误是在视图代码拼写错误(你的“子市场”),但错误的文字让我发疯。

我发布这个答案,因为我想说的人像我这样寻找这个错误,问题是它找不到IENumerable,但在它应该寻找它(在这种情况下,“子市场”)的变种,而不是在错误显示(“submarket_0”)

接受的答案是非常有趣的,但正如你所说的惯例是应用如果你不指定第二个参数,在这种情况下,它是指定的,但没有find变种(在你的情况,因为viewdata没有它,在我的情况,因为我拼错了var的名字)

希望这可以帮助!

问题是因为提交button点击发生回发。 所以在发布数据时提交点击再次返回之前写回到View()

 ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name"); 

检查名称空间。

您可以在Controller中分配System.Web.Webpages.Html.SelectListItem ,而不是System.Web.Mvc.SelectListItem

这也可以; 例如:
==>在“NumberController”文件中:

 public ActionResult Create([Bind(Include = "NumberId,Number1,Number2,OperatorId")] Number number) { if (ModelState.IsValid) { ... ... return RedirectToAction("Index"); } ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId); return View(); } 

==>在查看文件(Create.cshtml)中:

 <div class="form-group"> @Html.LabelFor(model => model.Number1, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Number1, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Number1, "", new { @class = "text-danger" }) </div> </div> 

现在,如果我们删除这个声明:

 ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId); 

从以下声明的后面(在我们的控制器中):

 return View(); 

我们会看到这个错误:

没有types为“IEnumerable”的ViewData项具有“OperatorId”键。

所以要确定这些陈述的存在。 *

在我的情况下,在命名空间中有一个冲突,我有:

 using System.Web.Mvc; 

 using System.Collections.Generic; 

我明确地想要使用Mvc,所以我声明为:

 new System.Web.Mvc.SelectList(...)