Estou tentando preencher uma lista suspensa de um banco de dados mapeado com Linq-2-SQL, usando o ASP.NET MVC 2, e continuo recebendo esse erro.
Estou tão confuso porque estou declarando uma variável do tipo IEnumerable<SelectListItem>
na segunda linha, mas o erro me faz pensar que esse não é o caso. Eu sinto que isso deve ser muito simples, mas estou lutando. Qualquer ajuda é apreciada.
Aqui estão os bits interessantes do meu controlador:
public ActionResult Create()
{
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;
return View();
}
E aqui estão os bits interessantes da minha opinião:
<div class="editor-label">
<%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
<%: Html.DropDownList("basetype") %>
<%: Html.ValidationMessageFor(model => model.basetype) %>
</div>
Aqui está a ação POST ao enviar o formulário
// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
if (ModelState.IsValid)
{
try
{
// TODO: Add insert logic here
var db = new DB();
db.Meals.InsertOnSubmit(meal);
db.SubmitChanges();
return RedirectToAction("Index");
}
catch
{
return View(meal);
}
}
else
{
return View(meal);
}
}
Obrigado.
asp.net-mvc
JBibbs
fonte
fonte
Respostas:
Eu tive o mesmo problema, e finalmente consegui a resposta ...
O problema é que, na ação POST, após o envio do formulário, o ModelState não é válido ou está detectando um erro na tentativa / captura, portanto a Visualização é retornada. Mas desta vez a View não está
ViewData["basetype"]
configurada corretamente.Você precisa preenchê-lo novamente, provavelmente com o mesmo código usado antes, então repita isso:
antes do
return View(meal)
no[HttpPost]
método.exatamente isso resolverá seu problema:
Sei que essa pergunta é muito antiga, mas vim aqui hoje com o mesmo problema, para que outros possam vir aqui mais tarde ...
fonte
Você receberá esse erro se o SelectList for nulo.
fonte
ModelState.IsValid==false
assim você retorna o modelo,return View(model)
mas não repovoa sua origem do SelectList antes de retornar do POST. Como não há WebForms do ViewState ala, não há fonte para o@Html.DropDown
auxiliar reconstruir a seleção. Você precisa preencher essa lista de fontes Toda vez que retornar a exibição para o cliente, não apenas no GET.Acabei de encontrar este problema e este artigo me ajudou a resolvê- lo - http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx
O mais provável é que sua coleção seja preenchida novamente após o
fonte
Para futuros leitores, se você estiver usando navalha, tente alterar o tipo de item da lista de seleção de List para IEnumerable.
De
Para
fonte
Tente adicionar uma sequência para o nome da sua lista suspensa como o primeiro parâmetro e retire o item dos seus dados de exibição:
Aqui também está um método de extensão que você pode usar para que a lista suspensa seja configurada em um estilo semelhante ao de seus outros controles:
Por exemplo
fonte
Você está configurando a coleção como um item no dicionário ViewData e tentando recuperá-la como propriedade no modelo. Uma correção simples seria referenciá-lo da mesma maneira que você o define:
Como alternativa, o código abaixo usa uma exibição fortemente tipada:
Em seguida, na sua exibição fortemente digitada:
fonte
Se você usar
Html.DropDownList()
método - o mesmo erro poderá ocorrer, se o item ViewData / Viewbag não estiver definido, como o @Peto respondeu.Mas pode não estar definido corretamente no caso de um item definido do controlador, mas na visualização principal você usa a chamada parcial do viw com novos valores de ViewDataDictionary.
se você tem
@Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })
então a sua visão parcial não vai verViewData
eViewBag
dados, removanew ViewDataDictionary()
o parâmetrofonte
Para futuros leitores,
Hoje me deparei com o problema e não consegui consertá-lo. Afinal, tornou-se realmente simples. Eu estava trabalhando com uma tabela + vista. Quando atualizei a tabela (adicionei algumas colunas), esqueci de atualizar (descartar e recriar) a exibição, o que causou o problema para mim. Espero que ajude alguém.
fonte
Recebi o mesmo erro hoje e minha solução é tornar o modelo "válido".
No meu caso, após o envio do usuário, clicando em "Salvar", obtive o estado do modelo: inválido se o usuário digitar "0", mas o estado do modelo será válido se o usuário digitar "0.0".
Então, eu substituo o método "IsValid" para retornar a verdadeira entrada de usuário "0".
Espero que ajude.
fonte