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(...)