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

Produto adicionado não aparece em carrinho

Boa tarde, o produto não está sendo carregado dentro do carrinho. Coloquei um break point no Foreach e descobri que o Model a ser percorrido tem count = 0, ou seja, não está conseguindo capturar o código do produto. Alguém pode checar?

@{ 
    ViewData["Title"] = "Carrinho";
}
@model IList<ItemPedido>;

<h3>Meu Carrinho</h3>

{...}
        @foreach (var item in Model)
        {
            <div class="row row-center linha-produto">
                <div class="col-md-3">
                    <img class="img-produto-carrinho" src="/images/produtos/large_@(item.Produto.Codigo).jpg" />
                </div>
                <div class="col-md-3">@(item.Produto.Nome)</div>
                <div class="col-md-2 text-center">R$ @(item.PrecoUnitario)</div>
                <div class="col-md-2 text-center">
                    <div class="input-group">
                        <span class="input-group-btn">
                            <button class="btn btn-default">
                                <span class="glyphicon-minus"></span>
                            </button>
                        </span>
                        <input type="text" value="@(item.Quantidade)"
                                class="form-control text-center" />
                        <span class="input-group-btn">
                            <button class="btn btn-default">
                                <span class="glyphicon-plus"></span>
                            </button>
                        </span>
                    </div>
                </div>
                <div class="col-md-2">
                    R$ <span class="pull-right" subtotal>
                        @(item.Quantidade * item.PrecoUnitario)
                    </span>
                </div>
            </div>
        } 

    </div>
    <div class="panel-footer">
        <div class="row">
            <div class="col-md-10">
                <span numero-itens>
                    Total: @(Model.Count())
                    itens
                </span>
            </div>
            <div class="col-md-2">
                Total: R$ <span class="pull-right" total>
                    @(Model.Sum(i => i.Quantidade * i.PrecoUnitario))
                </span>
            </div>
 [...]

Código Pedido Repository

        public void AddItem(string codigoProduto)
        {
            var produto = contexto.Set<Produto>()
                .Where(p => p.Codigo == codigoProduto)
                .SingleOrDefault();

            if (produto == null)
            {
                throw new ArgumentException("Produto não encontrado.");
            }

            var pedido = GetPedido();

            var itemPedido = contexto.Set<ItemPedido>()
                .Where(i => i.Pedido.Id == pedido.Id &&
                       i.Produto.Codigo == codigoProduto)
                .SingleOrDefault();

            if (itemPedido == null)
            {
                itemPedido = new ItemPedido(pedido, produto, 1, produto.Preco);
                contexto.Set<ItemPedido>().Add(itemPedido);
                contexto.SaveChanges();
            }
        }

        public Pedido GetPedido()
        {
            var pedidoId = GetPedidoId();
            var pedido = dbSet
                .Where(p => p.Id == pedidoId)
                .SingleOrDefault()
            if (pedido == null)
            {
                pedido = new Pedido();
                dbSet.Add(pedido);
                contexto.SaveChanges();
                SetPedidoId(pedido.Id); 
            }
            return pedido;
        }
3 respostas

Segue abaixo meu código para que vocês possam acessá-lo por inteiro. Coloquei-o no Drive.

https://drive.google.com/file/d/1oUmREJFbfIZ6TOrPwHzdoWnV0WPGwLeU/view?usp=sharing

Após novo teste com break point, descobri que o parâmetro codigoProduto está null após eu clicar em adicionar produto. Creio que o código do produto, de alguma forma, não esteja sendo enviado.

        public IActionResult Carrinho(string codigoProduto)
        {
            if (!string.IsNullOrEmpty(codigoProduto))
            {
                pedidoRepository.AddItem(codigoProduto);
            }

            var pedido = pedidoRepository.GetPedido();
            return View(pedido.Itens);
        }
solução!

Olá Guilherme,

Lembra que lá no Carrossel.cshtml adicionamos o TagHelper asp-route-codigo, certo? Fizemos isso para passar a informação do código do produto para a action do nosso controller via querystring. A chave usada é justamente o complemento que colocamos no final da tag "asp-route-CHAVE". Então, para que o framework associe as informações (enviadas x esperadas) por padrão esses dados devem ser iguais aos argumentos da action que tu está chamando, nesse caso para resolvermos temos duas opções:

  • Alterar o nome do argumento esperado na action, public IActionResult Carrinho(string codigo) para igualar ao taghelper atual.

  • Alterar o taghelper para asp-route-codigoProduto e mantendo o seu código atual na action Carrinho.

Existem outras possibilidades também para customizar essa associação (binding), segue referencia https://docs.microsoft.com/pt-br/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.0.

Espero que tenha esclarecido, abraço.