没有类型为'IEnumerable <SelectListItem>'的ViewData项具有键'xxx'

Jim*_*mbo 84 asp.net-mvc ienumerable viewdata selectlist drop-down-menu

在Stack Overflow上有一些关于这个的帖子,但没有一个答案似乎解决了我目前的情况.

我有一个页面,其中包含一个表格,每行有许多文本字段和一个下拉列表.所有下拉列表都需要使用相同的SelectList数据,所以我按如下方式设置:

调节器

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Run Code Online (Sandbox Code Playgroud)

视图

<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>
Run Code Online (Sandbox Code Playgroud)

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

没有类型为"IEnumerable"的ViewData项具有键"submarket_0".

Jim*_*mbo 76

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

如果你ViewData包含的SelectList名称与你的DropDownListie"submarket_0"相同,那么如果你没有指定第二个参数(在这种情况下是源SelectList),Html帮助器将自动填充你的DropDownList数据.

我的错误发生了什么:

因为包含下拉列表的表是在局部视图中并且ViewData已经更改并且不再包含SelectList我引用的,所以HtmlHelper(而不是抛出错误)试图在ViewData中找到名为"submarket_0"的SelectList(GRRRR! !!)它仍然找不到,然后扔了一个错误:)

如果我错了请纠正我

  • 我收到此错误是因为我的下拉列表的SelectListItems集合为null,这与我认为的问题相同. (99认同)
  • 对于遇到此问题的其他人,请暂时将下拉列表包装在空检查中,例如@if(ViewData ["Submarkets"]!= null).如果视图然后呈现而不抛出错误(并且没有您的下拉列表),您将确定您的问题.在这种情况下,"无视图数据项"错误是非常误导的. (5认同)

haw*_*kke 27

老问题,但这是对问题的另一种解释.即使您有强类型视图并且没有使用ViewData来创建下拉列表,您也会收到此错误.当您查看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;
}
Run Code Online (Sandbox Code Playgroud)

所以如果你有类似的东西:

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

并且Model.DropDownData为null,MVC会查看您的ViewData以查找名称MyList并在ViewData中没有该名称的对象时抛出错误.

  • @transformer最简单的方法是将Model.DropDownData设置为空列表而不是null.如果不可能,您可以更改剃刀标记以检查列表是否为空,如果是,则渲染一个空的选择列表. (4认同)

Pet*_*eto 15

我有同样的错误,我认为问题是错误文本令人困惑,因为它给出了一个假密钥名称.

在你的情况下它应该说"没有类型'IEnumerable'的ViewData项具有关键字"子市场"".

我的错误是视图代码(您的"子市场")中的拼写错误,但错误文本让我发疯.

我发布这个答案是因为我想说人们正在寻找这个错误,就像我一样,问题是它找不到IENumerable,但是在它应该寻找它的var中(在这种情况下是"子市场"),不在错误显示的那个("submarket_0").

接受的答案非常有趣,但正如你所说的那样,如果你没有指定第二个参数就适用约定,在这种情况下它被指定了,但找不到var(在你的情况下,因为viewdata没有它,在我的情况下,因为我拼错了var的名字)

希望这可以帮助!


小智 8

问题是因为在提交按钮单击时发生回发.因此,在提交点击后再次发送数据时再次返回View()

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Run Code Online (Sandbox Code Playgroud)