Нет элемента ViewData типа "IEnumerable <SelectListItem>", который имеет ключ "xxx",
В Qaru есть несколько сообщений об этом, но ни один из них не отвечает на проблему, которая, как представляется, устраняет проблему в моей текущей ситуации.
У меня есть страница с таблицей в ней, каждая строка имеет несколько текстовых полей и выпадающее меню. Все выпадающие списки должны использовать одни и те же данные SelectList, поэтому я установил его следующим образом:
контроллер
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Просмотр
<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>
Я использовал эту настройку во многих местах, но по какой-то причине в этом конкретном представлении я получаю ошибку:
Нет элемента ViewData типа "IEnumerable", который имеет ключ "submarket_0".
Ответы
Ответ 1
Итак, ответ был получен из некоторых других сообщений об этой проблеме, и это:
Если ваш ViewData
содержит SelectList
с тем же именем, что и ваш DropDownList
, то есть "submarket_0", помощник Html автоматически заполнит ваши DropDownList
этими данными , если вы не укажете 2-й параметр, который в этом случае является исходным SelectList.
Что случилось с моей ошибкой:
Поскольку таблица, содержащая выпадающие списки, находилась в частичном представлении, а ViewData
был изменен и больше не содержал SelectList
, на который я ссылался, HtmlHelper
(вместо того, чтобы бросать ошибку) пытался найти SelectList, называемый "submarket_0" в ViewData (GRRRR!!!), который он STILL не смог найти, а затем сделал ошибку на этом:)
Пожалуйста, исправьте меня, если я ошибаюсь
Ответ 2
Старый вопрос, но вот еще одно объяснение проблемы. Вы получите эту ошибку, даже если у вас есть строго типизированные представления и не используете 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 с этим именем нет объекта.
Ответ 3
У меня была такая же ошибка, я думаю, проблема в том, что текст ошибки запутывает, потому что он дает ложное имя ключа.
В вашем случае он должен сказать: "Нет элемента ViewData типа" IEnumerable ", у которого есть ключ" Submarkets ".
Моя ошибка была ошибкой в коде просмотра (ваши "субмаркеты" ), но текст ошибки заставил меня сходить с ума.
Я отправляю этот ответ, потому что хочу сказать людям, которые ищут эту ошибку, как и я, что проблема заключается в том, что не находит IENumerable, но в var, который должен ее искать ( "Submarkets" в этом случае), а не в том, что показано по ошибке ( "submarket_0" ).
Принятый ответ очень интересен, но, как вы сказали, конвенция применяется, если вы не указали второй параметр, в этом случае он был указан, но var не был найден (в вашем случае, поскольку в viewdata не было этого, в мой случай, потому что я ошибся с именем var)
Надеюсь, это поможет!
Ответ 4
Проблема заключается в том, что post post происходит при нажатии кнопки отправки.
Поэтому при отправке данных на отправке нажмите
снова напишите перед возвратом View()
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Ответ 5
Проверьте пространство имен.
Вы можете назначить System.Web.Webpages.Html.SelectListItem в контроллере вместо System.Web.Mvc.SelectListItem.
Ответ 6
Это тоже хорошо; Например:
== > В файле "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();
}
== > В файле 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".
* Поэтому будьте уверены в существовании этих утверждений. *
Ответ 7
Для меня проблема, которая вызвала эту ошибку, возникла, когда я сохранял новую строку в базе данных, но поле было пустым. В дизайне таблицы базы данных это поле НЕ ПУСТО. Поэтому, когда я попытался сохранить новую строку с нулевым значением для ненулевого поля, Visual Studio выдал эту ошибку. Таким образом, я убедился, что поле было присвоено значение, и проблема была исправлена.
Ответ 8
В моем случае я обнаружил, что по ошибке установил метод post как private. после смены частного на публичный.
[HttpPost]
private async Task<ActionResult> OnPostRemoveForecasting(){}
изменить на
[HttpPost]
public async Task<ActionResult> OnPostRemoveForecasting(){}
Сейчас работает нормально.
Ответ 9
В моем случае был конфликт в пространствах имен, у меня есть:
using System.Web.Mvc;
и
using System.Collections.Generic;
Я явно хочу использовать Mvc, поэтому я объявил его как:
new System.Web.Mvc.SelectList(...)