Eu tenho o seguinte modelo de visão
public class ProjectVM
{
....
[Display(Name = "Category")]
[Required(ErrorMessage = "Please select a category")]
public int CategoryID { get; set; }
public IEnumerable<SelectListItem> CategoryList { get; set; }
....
}
e o seguinte método de controlador para criar um novo projeto e atribuir um Category
public ActionResult Create()
{
ProjectVM model = new ProjectVM
{
CategoryList = new SelectList(db.Categories, "ID", "Name")
}
return View(model);
}
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Save and redirect
}
e na vista
@model ProjectVM
....
@using (Html.BeginForm())
{
....
@Html.LabelFor(m => m.CategoryID)
@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryID)
....
<input type="submit" value="Create" />
}
A visualização é exibida corretamente, mas ao enviar o formulário, recebo a seguinte mensagem de erro
InvalidOperationException: O item ViewData que possui a chave 'CategoryID' é do tipo 'System.Int32', mas deve ser do tipo 'IEnumerable <SelectListItem>'.
O mesmo erro ocorre usando o @Html.DropDownList()
método, e se eu passar na SelectList usando um ViewBag
ou ViewData
.
de acordo com stephens (usuário3559349) resposta , isso pode ser útil:
ou no ProjectVM:
fonte
Provavelmente causou algum tipo de erro ao redirecionar para sua página e você não inicializar as listas suspensas de seu modelo novamente.
Certifique-se de inicializar seus menus suspensos no construtor do modelo ou todas as vezes antes de enviar o referido modelo para a página.
Caso contrário, você precisará manter o estado das listas suspensas por meio do view bag ou por meio dos auxiliares de valores ocultos.
fonte
Eu tive o mesmo problema, estava recebendo um ModelState inválido quando tentei postar o formulário. Para mim, isso foi causado pela configuração de CategoryId como int, quando mudei para string, o ModelState era válido e o método Create funcionou conforme o esperado.
fonte
OK, a resposta pronta do pôster explicou perfeitamente por que o erro ocorreu, mas não como fazê-lo funcionar. Não tenho certeza se isso é realmente uma resposta, mas me apontou na direção certa.
Encontrei o mesmo problema e encontrei uma maneira engenhosa de resolvê-lo. Vou tentar capturar isso aqui. Isenção de responsabilidade - trabalho em páginas da web uma vez por ano ou mais e realmente não sei o que estou fazendo na maioria das vezes. Esta resposta não deve de forma alguma ser considerada uma resposta de "especialista", mas faz o trabalho com pouco trabalho ...
Visto que tenho algum objeto de dados (provavelmente um objeto de transferência de dados), desejo usar uma lista suspensa para fornecer valores válidos para um campo, como:
Então o ViewModel se parece com isto:
O verdadeiro problema aqui, como @Stephen tão eloquentemente descrito acima, é que a lista de seleção não é preenchida no método POST no controlador. Portanto, seus métodos de controle seriam assim:
Aí está. Este código NÃO está funcionando, eu copiei / colei e editei para torná-lo simples, mas você entendeu. Se os membros de dados no modelo de dados original e no modelo de exibição derivado têm o mesmo nome, UpdateModel () faz um trabalho incrível de preencher apenas os dados certos para você a partir dos valores de FormCollection.
Estou postando isso aqui para poder encontrar a resposta quando inevitavelmente me deparar com este problema novamente - espero que ajude outra pessoa também.
fonte
No meu caso, o primeiro ID na minha lista era zero, uma vez que mudei o ID para começar de 1, funcionou.
fonte