Нет элемента ViewData типа 'IEnumerable <SelectListItem>' который имеет ключ «ххх»

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

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

контроллер

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

Вид

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

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

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

81 голос | спросил Jimbo 17 Maypm10 2010, 17:22:59

8 ответов


0

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

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

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

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

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

ответил Jimbo 17 Maypm10 2010, 18:08:18
0

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

ответил hawkke 12 +04002013-10-12T00:10:14+04:00312013bEurope/MoscowSat, 12 Oct 2013 00:10:14 +0400 2013, 00:10:14
0

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

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

Моя ошибка была ошибкой в ​​коде представления (ваши "Подмаркет"), но текст ошибки заставил меня сойти с ума.

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

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

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

ответил Peto 28 +04002011-10-28T11:38:59+04:00312011bEurope/MoscowFri, 28 Oct 2011 11:38:59 +0400 2011, 11:38:59
0

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

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
ответил rakesh 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 05 Sep 2011 11:29:08 +0400 2011, 11:29:08
0

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

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

ответил MovGP0 22 Maypm13 2013, 13:28:33
0

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

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

ответил Morteza 8 +03002017-10-08T15:46:19+03:00312017bEurope/MoscowSun, 08 Oct 2017 15:46:19 +0300 2017, 15:46:19
0

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

ответил Thuy 13 FebruaryEurope/MoscowbTue, 13 Feb 2018 22:20:05 +0300000000pmTue, 13 Feb 2018 22:20:05 +030018 2018, 22:20:05
0

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

using System.Web.Mvc;

и

using System.Collections.Generic;

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

new System.Web.Mvc.SelectList(...)
ответил IndieTech Solutions 10 MarpmTue, 10 Mar 2015 18:55:59 +03002015-03-10T18:55:59+03:0006 2015, 18:55:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132