Нет элемента ViewData типа 'IEnumerable ‹SelectListItem›' с ключом 'xxx'

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

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

Контроллер

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

Просмотр

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

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

Нет элемента ViewData типа IEnumerable с ключом submarket_0.


person Jimbo    schedule 17.05.2010    source источник
comment
Вы пробовали это? <%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %> DropDownList занимает IEnumerable<SelectListItem>.   -  person LukLed    schedule 17.05.2010
comment
@LukLed - именно так я в конце концов нашел источник ошибки :), а также информацию из некоторых других сообщений! Спасибо   -  person Jimbo    schedule 17.05.2010
comment
Обнаружил это сегодня и обнаружил, что второй аргумент в моем помощнике DropDownList был нулевым, согласно приведенному ниже выводу от @jonathansewell.   -  person Ken Palmer    schedule 01.02.2019


Ответы (10)


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

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

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

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

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

person Jimbo    schedule 17.05.2010
comment
Я получил эту ошибку, потому что моя коллекция SelectListItems для раскрывающегося списка была нулевой, что, как мне кажется, является той же проблемой, что и у вас. - person Johnathan Sewell; 10.11.2011
comment
Для других, столкнувшихся с этой проблемой, временно оберните раскрывающийся список нулевой проверкой, например @if (ViewData [Submarkets]! = null). Если представление затем отображается без выдачи ошибки (и без раскрывающегося списка), вы определили свою проблему. Ошибка отсутствия элемента данных в этом случае вводит в заблуждение. - person GDB; 04.01.2014
comment
Я столкнулся с этим, используя Ajax.ActionLink. Просто добавьте SelectList Get к ActionMethod, содержащему вызов Ajax. - person stink; 07.01.2014
comment
Ага! Я изменил имя списка, который передавал в ViewData из контроллера, и не изменил его в представлении. Это действительно ужасно сбивающее с толку сообщение об ошибке! - person neminem; 18.02.2014
comment
@JonathanSewell, спасибо, спасибо, спасибо! Это была моя проблема. - person johnw182; 10.08.2015
comment
Да, в моем случае я просто добавил назначение Viewbag неправильным методом. - person Mirek Michalak; 20.01.2017

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

person hawkke    schedule 11.10.2013
comment
Привет, это тоже моя проблема. Что нам делать , если список пустой! вы можете что-нибудь предложить, - person Transformer; 15.03.2017
comment
@transformer Проще всего было бы установить для Model.DropDownData пустой список вместо нуля. Если это невозможно, вы можете изменить разметку бритвы, чтобы проверить, является ли список нулевым, и если да, отобразить пустой список выбора. - person hawkke; 15.03.2017

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

В вашем случае он должен сказать: «Нет элемента ViewData типа IEnumerable с ключом« Субрынки »».

Моя ошибка заключалась в неправильном написании кода просмотра (ваши «Субрынки»), но текст ошибки сводил меня с ума.

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

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

Надеюсь это поможет!

person Peto    schedule 28.10.2011

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

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

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

Вы можете назначить System.Web.Webpages.Html.SelectListItem в контроллере вместо System.Web.Mvc.SelectListItem.

person MovGP0    schedule 22.05.2013

Это тоже нормально; Например:
==> В файле «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();

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

Нет элемента ViewData типа IEnumerable с ключом OperatorId.

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

person Morteza    schedule 08.10.2017

Для меня проблема, вызвавшая эту ошибку, возникла, когда я сохранял новую строку в базе данных, но поле было пустым. В дизайне таблицы базы данных это поле НЕ ПУСТО. Поэтому, когда я попытался сохранить новую строку с нулевым значением для ненулевого поля, Visual Studio выдала эту ошибку. Таким образом, я убедился, что полю было присвоено значение, и проблема была устранена.

person Thuy    schedule 13.02.2018

В моем случае я обнаружил, что ошибочно установил метод публикации как частный. после изменения частного на публичный.

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

изменить на

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

Теперь работает нормально.

person Mohammed Sabbir    schedule 11.07.2019

Причина не противоречит синтаксису, а не неправильному использованию объектов. Жизненный цикл объектов в ViewData, ViewBag и View Life Cycle короче, чем в сеансе. Данные, определенные в формирователях, будут потеряны после запроса-ответа (при попытке доступа после запроса-ответа вы получите исключения). Таким образом, формеры подходят для передачи данных между представлением и контроллером, а последний - для хранения временных данных. Временные данные должны храниться в сеансе, чтобы к ним можно было обращаться много раз.

person sdfs    schedule 30.10.2019

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

using System.Web.Mvc;

и

using System.Collections.Generic;

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

new System.Web.Mvc.SelectList(...)
person IndieTech Solutions    schedule 10.03.2015
comment
Если мои глаза не обманывают меня, в _ 2_. - person Erik Philips; 20.07.2015