Подтвердить что ты не робот

Нет элемента 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".

4b9b3361

Ответ 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(...)