Нет элемента ViewData типа "IEnumerable", который имеет ключ "xxx"

есть несколько сообщений об этом в Stack Overflow, но нет ответа, который, похоже, устраняет проблему в моей текущей ситуации.

у меня есть страница с таблицей, каждая строка имеет несколько текстовых полей и выпадающих. Все выпадающие списки должны использовать те же данные SelectList, поэтому я настроил его следующим образом:

контроллер

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

посмотреть

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

я использовал именно эту настройку во многих места, но по какой-то причине в этом конкретном представлении я получаю ошибку:

нет элемента ViewData типа "IEnumerable", который имеет ключ "submarket_0".

8 ответов


хорошо, поэтому ответ был получен из некоторых других сообщений об этой проблеме, и это:

если ViewData содержит SelectList с тем же именем, что и ваш DropDownList т. е. "submarket_0", помощник Html автоматически заполнит ваш DropDownList С если не указать 2-й параметр который в этом случае является исходным списком выбора.

что случилось с моей ошибки:

потому что таблица, содержащая выпадающие списки, была в частичном виде и ViewData был изменен и больше не содержал SelectList я ссылался,HtmlHelper (вместо того, чтобы выбрасывать ошибку) попытался найти SelectList под названием "submarket_0" в ViewData (GRRRR!!!) который он все еще не мог найти, а затем бросил ошибку на это:)

пожалуйста, поправьте меня, если я ошибаюсь


старый вопрос, но вот еще одно объяснение этой проблемы. Вы получите эту ошибку, даже если у вас есть строго типизированные представления и вы не используете 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 с этим именем.


У меня была такая же ошибка, Я думаю, проблема в том, что текст ошибки сбивает с толку, потому что он дает ложное имя ключа.

в вашем случае он должен сказать: "нет элемента ViewData типа "IEnumerable", который имеет ключ"Submarkets"".

моя ошибка была опечатка в коде представления (ваш "Субрынков"), но текст ошибки свели меня с ума.

Я публикую этот ответ, потому что хочу сказать, что люди ищут эту ошибку, как и я, что проблема в том, что его не найти IENumerable, но в var, который он должен искать ("Субмаркетах"в этом случае), а не в том, который показан по ошибке ("submarket_0").

принятый ответ очень интересен, но, как вы сказали, соглашение применяется, если вы не укажете 2-й параметр, в этом случае он был указан, но var не был найден (в вашем случае, потому что viewdata не было его, в моем случае, потому что я неправильно написал имя var)

Надежда это помогает!


проблема заключается в том, что post back происходит при нажатии кнопки отправки. Поэтому при публикации данных на submit нажмите снова напишите перед возвратом View ()

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

Проверьте пространство имен.

вы можете назначить система.Сеть.Страницы.Формат html.SelectListItem в контроллере, вместо система.Сеть.В 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();
}

==> in View file (создать.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();

мы увидим эту ошибку:

нет элемента ViewData типа "IEnumerable", который имеет ключ "OperatorId".

* Поэтому будьте уверены в существовании этих утверждений. *


для меня проблема, вызвавшая эту ошибку, возникла, когда я сохранял новую строку в базе данных, но поле было null. В конструкции таблицы базы данных это поле не равно NULL. Поэтому, когда я попытался сохранить новую строку с нулевым значением для поля not-null, Visual Studio выбросила эту ошибку. Таким образом, я убедился, что полю было присвоено значение, и проблема была исправлена.


В моем случае был конфликт в пространствах имен , у меня есть:

using System.Web.Mvc;

и

using System.Collections.Generic;

Я явно хочу использовать MVC, поэтому я объявил его как:

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