На Stack Overflow есть несколько сообщений об этом, но ни один из них не содержит ответа, который, похоже, решает проблему в моей текущей ситуации.
У меня есть страница с таблицей, в каждой строке есть несколько текстовых полей и раскрывающийся список. Все раскрывающиеся списки должны использовать одни и те же данные SelectList, поэтому я настроил их следующим образом:
Контроллер
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Посмотреть
<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>
Я использовал именно эту настройку во многих местах, но по какой-то причине в этом конкретном представлении я получаю сообщение об ошибке:
Нет элемента ViewData типа «IEnumerable» с ключом «submarket_0».
<%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>
DropDownList принимаетIEnumerable<SelectListItem>
.<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
Ответы:
Итак, ответ был получен из некоторых других сообщений об этой проблеме, и это:
Если ваш
ViewData
содержит элементSelectList
с тем же именем, что и ваш,DropDownList
например, «submarket_0», помощник Html автоматически заполнит вас этимиDropDownList
данными, если вы не укажете второй параметр, который в данном случае является исходным SelectList.Что случилось с моей ошибкой:
Поскольку таблица, содержащая раскрывающиеся списки, была в частичном представлении, а
ViewData
была изменена и больше не содержала упомянутогоSelectList
мной,HtmlHelper
(вместо выдачи ошибки) попытался найти список выбора под названием "submarket_0" в ViewData (GRRRR! !!), которую он ВСЕ ЕЩЕ не мог найти, а затем выдал ошибку :)Пожалуйста, поправьте меня, если я ошибаюсь
источник
Ajax.ActionLink
. Просто добавьте вSelectList
Get
тот,ActionMethod
который содержит вызов Ajax.Старый вопрос, но вот еще одно объяснение проблемы. Вы получите эту ошибку, даже если у вас есть строго типизированные представления и вы не используете 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, а находится в переменной, которую он должен искать (в данном случае «Субрынки»), не в том, что показывали по ошибке ("submarket_0") .
Принятый ответ очень интересен, но, как вы сказали, соглашение применяется, если вы не укажете второй параметр, в этом случае он был указан, но var не был найден (в вашем случае, потому что у viewdata его не было, в моем случае, потому что Я неправильно написал имя var)
Надеюсь это поможет!
источник
Проблема в том, что при нажатии кнопки отправки происходит обратная отправка. Итак, при публикации данных при отправке нажмите снова, напишите перед возвратом View ()
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
источник
Проверьте пространство имен.
Вы можете назначить System.Web.Webpages.Html.SelectListItem в контроллере вместо System.Web.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(); }
==> В файле просмотра (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».
* Так что будьте уверены в существовании этих утверждений. *
источник
Для меня проблема, вызвавшая эту ошибку, возникла, когда я сохранял новую строку в базе данных, но поле было пустым. В дизайне таблицы базы данных это поле НЕ ПУСТО. Поэтому, когда я попытался сохранить новую строку с нулевым значением для ненулевого поля, Visual Studio выдала эту ошибку. Таким образом, я убедился, что полю присвоено значение, и проблема была устранена.
источник
В моем случае я обнаружил, что ошибочно установил метод публикации как частный. после изменения приватного на публичный.
[HttpPost] private async Task<ActionResult> OnPostRemoveForecasting(){}
изменить на
[HttpPost] public async Task<ActionResult> OnPostRemoveForecasting(){}
Теперь работает нормально.
источник
Причина не противоречит синтаксису, а не неправильному использованию объектов. Жизненный цикл объектов в ViewData, ViewBag и View Life Cycle короче, чем в сеансе. Данные, определенные в формирователях, будут потеряны после запроса-ответа (при попытке доступа после запроса-ответа вы получите исключения). Таким образом, формеры подходят для передачи данных между View и Controller, а последний - для хранения временных данных. Временные данные должны храниться в сеансе, чтобы к ним можно было обращаться много раз.
источник
В моем случае возник конфликт в пространствах имен, у меня есть:
using System.Web.Mvc;
а также
using System.Collections.Generic;
Я явно хочу использовать Mvc, поэтому я объявил его как:
new System.Web.Mvc.SelectList(...)
источник
SelectList
вSystem.Collections.Generic
.