Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Não consigo abrir a página de /Produto/Form

Por favor pessoal, não consigo resolver esse problema. Podem me ajudar?

Seguinte...

Quando executo a página de /Produto/Form


@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Form</title>
</head>
<body>
    <form action="/Produto/Adiciona" method="post">


        <label for="nome">Nome</label>
        <input id="nome" name="produto.nome" value="@ViewBag.produto.nome" />
        @Html.ValidationMessage("produto.nome")

        <label for="preco">Preço</label>
        <input id="preco" name="produto.preco" value="@ViewBag.produto.preco" />

        <label for="quantidade">Quantidade</label>
        <input id="quantidade" name="produto.quantidade" value="@ViewBag.produto.quantidade"  />

        <label for="descricao">Descrição</label>
        <input id="descricao" name="produto.descricao" value="@ViewBag.produto."  />

        <label for="categoria">Categoria</label>
        <select id="categoria" name="produto.CategoriaId">
            @foreach(var categoria in ViewBag.categorias)
            {
                <option value="@categoria.Id"  >
                    @categoria.Nome
                </option>
            }
        </select>

        <input type="submit" value="Cadastrar" />

    </form>
</body>
</html>

o código do controle é

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CaelumEstoque.DAO;
using CaelumEstoque.Models;

namespace CaelumEstoque.Controllers
{
    public class ProdutoController : Controller
    {
        //
        // GET: /Produto/
        public ActionResult Index()
        {
            ProdutosDAO ctx = new ProdutosDAO();
            IList<Produto> lstProduto = ctx.Lista();

            ViewBag.produtos = lstProduto;

            return View();
        }

        public ActionResult Form()
        {
            CategoriasDAO dao = new CategoriasDAO();
            IList<CategoriaDoProduto> lstCategoria = dao.Lista();
            ViewBag.categorias = lstCategoria;

            return View();
        }

        [HttpPost]
        public ActionResult Adiciona(Produto produto)
        {
            if (ModelState.IsValid)
            {
                ProdutosDAO dao = new ProdutosDAO();
                dao.Adiciona(produto);

                return RedirectToAction("Index", "Home");
            }
            else
            {
                CategoriasDAO dao = new CategoriasDAO();
                IList<CategoriaDoProduto> lstCategoria = dao.Lista();
                ViewBag.categorias = lstCategoria;

                return View("Form");
            }

        }

    }
}

Recebo o erro: "Detalhes da Exceção: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Não é possível fazer associação em tempo de execução em uma referência nula"

Linha 1:  
Linha 2:  @{
Linha 3:      Layout = null;
Linha 4:  }
Linha 5:
1 resposta
solução!

Oi Joseph

O seu erro está acontecendo porque a action Form do ProdutoController precisa mandar a variável ViewBag.produto preenchida para a camada de visualização.

Veja que na sua view você colocou o seguinte código: @ViewBag.produto.nome, mas o método Form não colocou nada em ViewBag.produto e por isso o código está lançando a exceção.

Esse exato problema é discutido no final do vídeo do capítulo de validações do curso.