没有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(...)