Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Exercício 4 aula 3

O programa consegue salvar o produto vinculado com a categoria no banco de dados, porém ocorre o seguinte erro: System.NullReferenceException: 'Referência de objeto não definida para uma instância de um objeto.' Esse erro ocorre nas seguintes linhas do código(mais precisamente na linha do foreach):

  @foreach(var produto in @Model ) 
        {
            <tr>
                <td>@produto.Id</td>
                <td>@produto.Nome</td>
                <td>@produto.Preco</td>
                <td>@produto.Categoria.Nome</td>
                <td><a href="@Url.Action("Visualiza", "Produtos", new {id = produto.Id})">Visualizar</a></td>
                <td><a href="@Url.Action("Remove", "Produtos", new {id = produto.Id})">Remover</a></td>
            </tr>
        }
3 respostas

Olá Camila,

o erro indica que provavelmente o controller não enviou a lista de produtos para o Model. Como está o seu controller do produto?

Segue o código do controller do produto

namespace LojaWeb.Controllers
{
    public class ProdutosController : Controller
    {
        private ProdutosDAO dao;

        public ProdutosController(ProdutosDAO dao)
        {
            this.dao = dao;
        }

        //
        // GET: /Produtos/
        public ActionResult Index()
        {

            IList<Produto> produtos = new List<Produto>();
            return View(produtos);
        }

        public ActionResult Form()
        {
            return View();
        }

        public ActionResult Adiciona(Produto produto)
        {
            if (produto.Categoria.Id == 0)
            {
                produto.Categoria = null;
            }
            dao.Adiciona(produto);
            return View("Index");
        }

        public ActionResult Remove(int id)
        {
            return RedirectToAction("Index");
        }

        public ActionResult Visualiza(int id)
        {
            ISession session = NHibernateHelper.AbreSession();
            ProdutosDAO dao = new ProdutosDAO(session);
            Produto produto = dao.BuscaPorId(id);
            session.Close();
            return View(produto);
        }

        public ActionResult Atualiza(Produto produto)
        {
            if (produto.Categoria.Id == 0)
            {
                produto.Categoria = null;
            }
            dao.Atualiza(produto);
            return RedirectToAction("Index");
        }

        public ActionResult ProdutosComPrecoMinimo(double? preco)
        {
            ViewBag.Preco = preco;
            IList<Produto> produtos = new List<Produto>();
            return View(produtos);
        }

        public ActionResult ProdutosDaCategoria(string nomeCategoria)
        {
            ViewBag.NomeCategoria = nomeCategoria;
            IList<Produto> produtos = new List<Produto>();
            return View(produtos);
        }

        public ActionResult ProdutosDaCategoriaComPrecoMinimo(double? preco, string nomeCategoria)
        {
            ViewBag.Preco = preco;
            ViewBag.NomeCategoria = nomeCategoria;
            IList<Produto> produtos = new List<Produto>();
            return View(produtos);
        }

        public ActionResult BuscaDinamica(double? preco, string nome, string nomeCategoria)
        {
            ViewBag.Preco = preco;
            ViewBag.Nome = nome;
            ViewBag.NomeCategoria = nomeCategoria;

            IList<Produto> produtos = new List<Produto>();
            return View(produtos);
        }
        public ActionResult ListaPaginada(int? pagina)
        {
            int paginaAtual = pagina.GetValueOrDefault(1);
            ViewBag.Pagina = paginaAtual;
            IList<Produto> produtos = new List<Produto>();
            return View(produtos);
        }
    }
}

insira seu código aqui

solução!

Olá Camila,

note que no seu método Adiciona o return está assim

return View("Index");

Ou seja, depois de executar o método a requisição vai direto para o Index.cshtml, só que ele não manda no return uma List dos produtos para carregar a tela. Neste caso, você terá que na verdade usar o método RedirectToAction para pedir para na verdade redirecionar a requisição para executar o método Index.