Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Produto não inserido no Banco com a ViewBag

Pessoal, utilizando a ViewBag, não estou conseguindo inserir os produtos no Banco de Dados. Aparentemente o código das Actions Form e Adiciona estão corretos, bem como o código da View Form; no entanto, ao preencher o formulário e enviá-lo, sou levado à página de listagem dos produtos, e nela não consta o que acabei de cadastrar. Mesmo preenchendo com erros de validação, sou levado à página de listagem, ao invés de retornar ao formulário para as devidas correções. Seguem os códigos abaixo:

public ActionResult Form()
                        {
                            CategoriaDoProduto categoriaVazia = new CategoriaDoProduto();
                            Produto produtoVazio = new Produto
                            {
                                Categoria = categoriaVazia
                            };
                            ViewBag.Produto = produtoVazio;
                            CategoriaDao dao = new CategoriaDao();
                            List<CategoriaDoProduto> categorias = dao.Lista();
                            return View(categorias);
                        }

        [HttpPost]
                        public ActionResult Adiciona(Produto produto)
                        {
                            int idInformatica = 1;
                            if (produto.Categoria.Id == idInformatica && produto.Preco < 100)
                            {
                                ModelState.AddModelError("produto.InformaticaComPrecoErrado", "Produtos da categoria informática devem ter preço maior do que 100");
                            }
            if (ModelState.IsValid)
                            {
                                ProdutoDao dao = new ProdutoDao();
                                dao.Salva(produto);
                                return RedirectToAction("Index");
                            }
                            else
                            {
                                ViewBag.Produto = produto;                
                CategoriaDao dao = new CategoriaDao();
                                List<CategoriaDoProduto> categorias = dao.Lista();
                                return View("Form", categorias);
                            }
                                                    }

<form action="/Produto/Adiciona" method="post" >

    @Html.ValidationMessage("produto.InformaticaComPrecoErrado")                    
    <label> Nome do produto: <input name="produto.Nome" value="@ViewBag.Produto.Nome" /> </label>
@Html.ValidationMessage("produto.Nome")
<label> Preço: <input name="produto.Preco" value="@ViewBag.Produto.Preco" /> </label>
<label> Quantidade: <input name="produto.Quantidade" value="@ViewBag.Produto.Quantidade" /></label>
<label> Descrição: <input name="produto.Descricao" value="@ViewBag.Produto.Descricao" /></label>
<label>
    Categoria:
    <select name="produto.Categoria.Nome">
    @foreach (var categoria in Model ) {        
    if (categoria.Id.Equals(ViewBag.Produto.Categoria.Id)) {
        <option value="@categoria.Id" selected="selected"> @categoria.Nome</option> 
    }
    else {        
    <option value="@categoria.Id"> @categoria.Nome</option>
        }
        }
        </select>
</label>
<input type="submit" value="Enviar" />
</form>
`
4 respostas

No seu post você tem q colocar o mesmo que a ViewBag.Produto recebe no Get ficando ViewBag.Produto = produtoVazio; e não ViewBag.Produto = produto; Espero que tenha resolvido!!

Olá, Evelyn! Não é possível fazer o que sugere, primeiramente porque produtoVazio possui visibilidade apenas na action Form, servindo para preencher inicialmente os campos do formulário com os valores default de cada tipo de atributo, quando acessamos essa página para o preenchimento do formulário e em seguida salvar os dados no banco, caso todos os campos estejam válidos. Já revisei todo o código, mas não consigo encontrar o erro. Em todo o caso, obrigado por tentar me ajudar!

solução

Pessoal, acabo de descobrir o erro!!!! Estava na parte do código do formulário referente ao select da categoria: ```

``

hAVIA COLOCADO:

AO INVÉS DE:

aGORA TUDO ESTÁ OCORRENDO NORMALMENTE!