Нет элемента ViewData типа 'IEnumerable ‹SelectListItem›' с ключом 'xxx'
Автор вопроса: JimboОтветов: 10
На Stack Overflow есть пара сообщений об этом, но ни в одной из них нет ответа, который, похоже, решает проблему в моей текущей ситуации.
У меня есть страница с таблицей, в каждой строке есть несколько текстовых полей и раскрывающийся список. Все раскрывающиеся списки должны использовать одни и те же данные SelectList, поэтому я настроил их следующим образом:
Контроллер
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Я использовал именно эту настройку во многих местах, но по какой-то причине в этом конкретном представлении я получаю сообщение об ошибке:
Нет элемента ViewData типа IEnumerable с ключом submarket_0.
Вы пробовали это? <%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %> DropDownList занимает IEnumerable<SelectListItem>. LukLed 17.05.2010
@LukLed - именно так я в конце концов нашел источник ошибки :), а также информацию из некоторых других сообщений! Спасибо Jimbo 17.05.2010
Обнаружил это сегодня и обнаружил, что второй аргумент в моем помощнике DropDownList был нулевым, согласно приведенному ниже выводу от @jonathansewell. Ken Palmer 01.02.2019
Итак, ответ был получен из некоторых других сообщений об этой проблеме, и это:
Если ваш ViewData содержит SelectList с тем же именем, что и ваш DropDownList, т.е. "submarket_0", помощник Html автоматически заполнит ваш DropDownList этими данными, если вы не укажете второй параметр, который в данном случае исходный SelectList.
Что случилось с моей ошибкой:
Поскольку таблица, содержащая раскрывающиеся списки, была в частичном представлении, а ViewData был изменен и больше не содержал SelectList, на который я ссылался, HtmlHelper (вместо того, чтобы выдавать ошибку) попытался найти список SelectList под названием "submarket_0" в ViewData (GRRRR !!!), которую он ВСЕ ЕЩЕ не мог найти, а затем выдал ошибку :)
Пожалуйста, поправьте меня, если я ошибаюсь
Ответ 2 · рейтинг 30 · hawkke
Старый вопрос, но вот еще одно объяснение проблемы. Вы получите эту ошибку, даже если у вас есть строго типизированные представления и вы не используете 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;
}
И Model.DropDownData имеет значение null, MVC просматривает ваши ViewData в поисках чего-то с именем MyList и выдает ошибку, если в ViewData нет объекта с таким именем.
Ответ 3 · рейтинг 15 · Peto
У меня была такая же ошибка, я думаю, проблема в том, что текст ошибки сбивает с толку, потому что он дает ложное имя ключа.
В вашем случае он должен сказать: "Нет элемента ViewData типа IEnumerable с ключом" Субрынки "".
Моя ошибка заключалась в неправильном написании кода просмотра (ваши "Субрынки"), но текст ошибки сводил меня с ума.
Я отправляю этот ответ, потому что хочу сказать людям, которые ищут эту ошибку, как и я, что проблема в том, что он не находит IENumerable, а в переменной, которую он должен искать ("Субрынки" в этом case), а не в том, который был показан по ошибке ("submarket_0").
Принятый ответ очень интересен, но, как вы сказали, соглашение применяется, если вы не укажете второй параметр, в этом случае он был указан, но var не был найден (в вашем случае, потому что у viewdata его не было, в моем случае, потому что Я неправильно написал имя var)
Надеюсь это поможет!
Ответ 4 · рейтинг 9 · rakesh
Проблема в том, что при нажатии кнопки отправки происходит обратная отправка. Итак, при публикации данных при отправке нажмите еще раз, напишите перед возвратом View ()
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Ответ 5 · рейтинг 3 · MovGP0
Проверьте пространство имен.
Вы можете назначить System.Web.Webpages.Html.SelectListItem в контроллере вместо System.Web.Mvc.SelectListItem.
Ответ 6 · рейтинг 1 · Morteza
Это тоже нормально; Например: ==> В файле "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();
}
ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId);
из задней части следующего оператора (в нашем контроллере):
return View();
мы увидим эту ошибку:
Нет элемента ViewData типа IEnumerable с ключом OperatorId.
* Так что будьте уверены в существовании этих утверждений. *
Ответ 7 · Thuy
Для меня проблема, вызвавшая эту ошибку, возникла, когда я сохранял новую строку в базе данных, но поле было пустым. В дизайне таблицы базы данных это поле НЕ ПУСТО. Поэтому, когда я попытался сохранить новую строку с нулевым значением для ненулевого поля, Visual Studio выдала эту ошибку. Таким образом, я убедился, что полю было присвоено значение, и проблема была устранена.
Ответ 8 · Mohammed Sabbir
В моем случае я обнаружил, что ошибочно установил метод публикации как частный. после изменения частного на публичный.
[HttpPost]
public async Task<ActionResult> OnPostRemoveForecasting(){}
Теперь работает нормально.
Ответ 9 · sdfs
Причина не противоречит синтаксису, а не неправильному использованию объектов. Жизненный цикл объектов в ViewData, ViewBag и View Life Cycle короче, чем в сеансе. Данные, определенные в формирователях, будут потеряны после запроса-ответа (при попытке доступа после запроса-ответа вы получите исключения). Таким образом, формеры подходят для передачи данных между представлением и контроллером, а последний - для хранения временных данных. Временные данные должны храниться в сеансе, чтобы к ним можно было обращаться много раз.
Ответ 10 · рейтинг -1 · IndieTech Solutions
В моем случае возник конфликт в пространствах имен, у меня есть:
using System.Web.Mvc;
и
using System.Collections.Generic;
Я явно хочу использовать Mvc, поэтому я объявил его как: