87

Stack Overflow 上有几篇关于此的帖子,但没有一个答案似乎可以解决我目前情况下的问题。

我有一个带有表格的页面,每一行都有许多文本字段和一个下拉列表。所有下拉列表都需要使用相同的 SelectList 数据,因此我将其设置如下:

控制器

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

看法

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

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

没有具有键“submarket_0”的“IEnumerable”类型的 ViewData 项。

4

10 回答 10

80

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

如果您ViewData包含一个与您的即“submarket_0”SelectList同名的,如果您不指定第二个参数(在这种情况下是源 SelectList ),Html 帮助程序将自动使用该数据填充您。DropDownListDropDownList

我的错误发生了什么:

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

如果我错了请纠正我

于 2010-05-17T14:08:18.353 回答
30

老问题,但这是对问题的另一种解释。即使您有强类型视图并且没有使用 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;
}

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

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

如果Model.DropDownData为 null,MVC 会在您的 ViewData 中查找已命名的内容MyList,如果 ViewData 中没有具有该名称的对象,则会引发错误。

于 2013-10-11T20:10:14.870 回答
15

我有同样的错误,我认为问题在于错误文本令人困惑,因为它给出了错误的键名。

在您的情况下,它应该说“没有类型为 'IEnumerable' 的 ViewData 项目具有键“子市场””。

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

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

接受的答案非常有趣,但是正如您所说,如果您不指定第二个参数,则应用约定,在这种情况下它已指定,但未找到 var(在您的情况下,因为 viewdata 没有它,在我的情况下是因为我拼错了 var 名称)

希望这可以帮助!

于 2011-10-28T07:38:59.903 回答
9

问题是因为在提交按钮单击时发生回发。因此,在提交数据时,在返回 View() 之前再次点击再次写入

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
于 2011-09-05T07:29:08.220 回答
3

检查命名空间。

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

于 2013-05-22T09:28:33.523 回答
1

这也可以;例如:
==> 在“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();

我们会看到这个错误:

没有具有键“OperatorId”的“IEnumerable”类型的 ViewData 项。

* 所以请确保这些陈述的存在。*

于 2017-10-08T12:46:19.103 回答
0

对我来说,当我将新行保存到数据库时出现导致此错误的问题,但字段为空。在数据库表设计中,该字段不为空。因此,当我尝试为非空字段保存一个空值的新行时,Visual Studio 抛出了这个错误。因此,我确保为该字段分配了一个值,并且问题已得到解决。

于 2018-02-13T19:20:05.543 回答
0

就我而言,我发现我错误地将 post 方法设置为私有。将私有更改为公共后。

[HttpPost]
private async Task<ActionResult> OnPostRemoveForecasting(){}

改成

[HttpPost]
public async Task<ActionResult> OnPostRemoveForecasting(){}

现在工作正常。

于 2019-07-11T05:47:58.243 回答
0

原因并不违反语法,而是对象使用不当。ViewData、ViewBag 和 View Life Cycle 中对象的生命周期比会话中的要短。前者定义的数据在请求-响应后会丢失(如果在请求-响应后尝试访问,则会出现异常)。所以前者适合在 View & Controller 之间传递数据,而后者适合存储临时数据。临时数据应该存储在会话中,以便可以多次访问。

于 2019-10-30T06:44:48.423 回答
-1

就我而言,命名空间中存在冲突,我有:

using System.Web.Mvc;

using System.Collections.Generic;

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

new System.Web.Mvc.SelectList(...)
于 2015-03-10T15:55:59.127 回答