Não há nenhum item ViewData do tipo ‘IEnumerable ‘ que possui a chave ‘xxx’

Há alguns posts sobre isso no Stack Overflow, mas nenhum com uma resposta que pareça corrigir o problema na minha situação atual.

Eu tenho uma página com uma tabela, cada linha tem um número de campos de texto e uma lista suspensa. Todos os dropdowns precisam usar os mesmos dados SelectList, então eu os configurei da seguinte forma:

Controlador

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

Visão

  

Eu usei exatamente essa configuração em muitos lugares, mas por algum motivo, nesta visão em particular, recebo o erro:

Não há nenhum item ViewData do tipo ‘IEnumerable’ que tenha a chave ‘submarket_0’.

    Ok, então a resposta foi derivada de alguns outros posts sobre este problema e é:

    Se o seu ViewData contém um SelectList com o mesmo nome que o seu DropDownList ou seja, “submarket_0”, o Html ajudante irá preencher automaticamente o DropDownList com esses dados se você não especificar o segundo parâmetro que neste caso é o SelectList de origem.

    O que aconteceu com o meu erro foi:

    Como a tabela contendo as listas suspensas estava em uma visualização parcial e o ViewData foi alterado e não continha mais o SelectList eu referenciei, o HtmlHelper (em vez de lançar um erro) tentou localizar o SelectList chamado “submarket_0” no ViewData (GRRRR !!!) que ainda não consegui encontrar, e depois joguei um erro nisso 🙂

    Por favor me corrija se eu estiver errado

    Pergunta antiga, mas aqui está outra explicação do problema. Você obterá esse erro mesmo que tenha uma forte digitação de visualizações e não esteja usando o ViewData para criar sua lista suspensa. A razão para o erro pode ficar clara quando você olha para a fonte 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; } 

    Então, se você tem algo como:

    @Html.DropDownList("MyList", Model.DropDownData, "")

    E Model.DropDownData é nulo, MVC examina seu ViewData para algo chamado MyList e lança um erro se não houver nenhum object em ViewData com esse nome.

    Eu tive o mesmo erro, acho que o problema é que o texto do erro é confuso , porque está dando um nome de chave falso.

    No seu caso, ele deve dizer “Não há nenhum item ViewData do tipo ‘IEnumerable’ que tenha a chave” Submarkets “”.

    Meu erro foi um erro de ortografia no código de visualização (seus “Submercados”), mas o texto do erro me deixou louco.

    Eu posto esta resposta porque eu quero dizer que as pessoas que procuram este erro, como eu estava, que o problema é que ele não está achando o IENumerável, mas no var que ele deveria procurá-lo (“Submercados” neste caso), não na que mostrou erro (“submarket_0”) .

    Resposta aceita é muito interessante, mas como você disse a convenção é aplicada se você não especificar o segundo parâmetro, neste caso, foi especificado, mas o var não foi encontrado (no seu caso, porque o viewdata não tinha, no meu caso porque Eu escrevi incorretamente o nome do var)

    Espero que isto ajude!

    O problema é porque o post back acontece no clique do botão de envio. Assim, ao postar dados no envio, clique novamente em gravar antes de retornar View ()

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

    Verifique o namespace.

    Você pode atribuir System.Web.Webpages.Html.SelectListItem no Controlador, em vez de System.Web.Mvc.SelectListItem .

    Tudo bem também; Por exemplo:
    ==> No arquivo “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(); } 

    ==> No arquivo View (Create.cshtml):

     
    @Html.LabelFor(model => model.Number1, htmlAttributes: new { @class = "control-label col-md-2" })
    @Html.EditorFor(model => model.Number1, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Number1, "", new { @class = "text-danger" })

    Agora, se removermos esta declaração:

     ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId); 

    por trás da seguinte declaração (em nosso controlador):

     return View(); 

    vamos ver esse erro:

    Não há nenhum item ViewData do tipo ‘IEnumerable’ que tenha a chave ‘OperatorId’.

    * Portanto, certifique-se da existência dessas declarações. *

    Para mim, o problema que causou esse erro surgiu quando eu estava salvando uma nova linha no database, mas um campo era nulo. No design da tabela de database, esse campo é NOT NULL. Então, quando tentei salvar uma nova linha com um valor nulo para o campo não-nulo, o Visual Studio lançou esse erro. Assim, certifiquei-me de que o campo recebesse um valor e o problema foi corrigido.

    No meu caso houve um conflito nos namespaces, tenho:

     using System.Web.Mvc; 

    e

     using System.Collections.Generic; 

    Eu quero explicitamente usar o Mvc, então eu declarei como:

     new System.Web.Mvc.SelectList(...)