7
respostas

Duvidas no Incrimento e Descremento dos Produtos

O incremento e decremento do produto funciona somente se atualizar a pagina do meu carrinho com F5, fiz teste com outros navegadores todos permanecem da mesma forma . O visual studio tbm não aparece nenhum erro ou aviso especificando. O instrutor informou na vídeo aula para a acrescentar função var token, porém mesmo com essa função, ainda ` não funcionou . Oque eu faço ? Segue os codigos :

class Carrinho {
    clickIncremento(btn) {
        var data = this.getData(btn);
        data.Quantidade++;
        this.postQuantidade(data);
    }

    clickDecremento(btn) {
        var data = this.getData(btn);
        data.Quantidade--;
        this.postQuantidade(data);
    }

    updateQuantidade(input) {
        var data = this.getData(input);
        this.postQuantidade(data);
    }

    getData(elemento) {
        var linhaDoItem = $(elemento).parents('[item-id]');
        var itemId = linhaDoItem.attr('item-id');
        var qtde = linhaDoItem.find('input').val();

        return {
            Id: itemId,
            Quantidade: qtde
        };
    }

    postQuantidade(data) {
        var token = $('input[name=__RequestVerificationToken]').val();

        var header = {};
        header['RequestVerificationToken'] = token;

        $.ajax({
            url: '/pedido/PostQuantidade',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify(data),
            headers: header
        }).done(function (response) {
            this.setQuantidade(response.itemPedido);
            this.setSubtotal(response.itemPedido);
            this.setTotal(response.carrinhoViewModel);
            this.setNumeroItens(response.carrinhoViewModel);
            if (response.itemPedido.quantidade == 0)
                this.removeItem(response.itemPedido);
        }.bind(this));
    }

    setQuantidade(itemPedido) {
        this.getLinhaDoItem(itemPedido)
            .find('input').val(itemPedido.quantidade);
    }

    setSubtotal(itemPedido) {
        this.getLinhaDoItem(itemPedido)
            .find('[subtotal]').html(itemPedido.subtotal.duasCasas());
    }

    setTotal(carrinhoViewModel) {
        $('[total]').html(carrinhoViewModel.total.duasCasas());
    }

    getLinhaDoItem(itemPedido) {
        return $('[item-id=' + itemPedido.id + ']');
    }

    removeItem(itemPedido) {
        this.getLinhaDoItem(itemPedido).remove();
    }

    setNumeroItens(carrinhoViewModel) {
        var texto =
            'Total: '
            + carrinhoViewModel.itens.length
            + ' '
            + (carrinhoViewModel.itens.length > 1
                ? 'itens' : 'item');
        $('[numero-itens]').html(texto);
    }
}

var carrinho = new Carrinho();

Number.prototype.duasCasas = function () {
    return this.toFixed(2).replace('.', ',');
}
insira seu código aqui
``` Carrinho.cshtml

 @foreach (var item in Model.Itens)
        {
            <div class="row row-center" item-id="@item.Id">
                <div class="col-md-3">
                    <img src="~/images/produtos/small_@(item.Produto.Id).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"
                                    onclick="carrinho.clickDecremento(this)">
                                <span class="glyphicon-minus"></span>
                            </button>
                        </span>
                        <input type="text" value="@item.Quantidade"
                               class="form-control text-center"
                               onblur="carrinho.updateQuantidade(this)" />
                        <span class="input-group-btn">
                            <button class="btn btn-default"
                                    onclick="carrinho.clickIncremento(this)">
                                <span class="glyphicon-plus"> 
                            </button>
                        </span>
                    </div>
                </div>

insira seu código aqui ```

7 respostas

Aguardo alguém que me ajude por gentileza ?

Olá, Rodrigo

Comparei seu código com o código da aula, e parece que está tudo ok. Você pode fazer um teste por favor? Abra o carrinho no navegador Chrome, tecle F12 para abrir as ferramentas do desenvolvedor e entre na aba "Console" do Chrome. Incremente e decremente os produtos, e veja se ocorre algume erro no Console do Chrome.

Boa tarde !

Segue o erro no console :

:65487/pedido/PostQuantidade Failed to load resource: the server responded with a status of 500 (Internal Server Error)
jquery.js:9172 POST http://localhost:65487/pedido/PostQuantidade 500 (Internal Server Error)
send @ jquery.js:9172
ajax @ jquery.js:8653
postQuantidade @ carrinho.js:41
updateQuantidade @ carrinho.js:19
onblur @ carrinho?produtoId=3:81
jquery.js:9172 POST http://localhost:65487/pedido/PostQuantidade 500 (Internal Server Error)
insira seu código aqui
insira seu código aqui

Obrigado, Rodrigo!

Pelo erro, já deu pra entender que foi um erro no servidor (the server responded with a status of 500 (Internal Server Error))

Então faça o seguinte: coloque um breakpoint no início do método PostQuantidade, e veja se o programa para nesse ponto. Se ele parar, continue debugando (com a tecla F8) até acontecer um erro. Mas se ele não parar, então pode ser um problema com a sua action PostQuantidade.

Por favor, coloque aqui também o código do controller, para darmos uma olhada. Obrigado!

Coloquei breakpoint no início do método PostQuantidade e acionei o debug parou no metado PostQuantidade. Porem apareceu 1 erro no visualstudio :

// Gravidade Código Descrição Projeto Arquivo Linha Estado de Supressão Erro eqeqeq (ESLint) Expected '===' and instead saw '=='. CasaDoCodigo C:\Users\rodri\source\repos\CasaDoCodigo\CasaDoCodigo\wwwroot\js\carrinho.js 54 \

Acrescentei mais um = no comparador para testar não funcionou dessa maneira

insira seu código aqui

 if (response.itemPedido.quantidade  === 0)
                this.removeItem(response.itemPedido);
        }.bind(this));
    }

insira seu código aqui

using CasaDoCodigo.Models;
using CasaDoCodigo.Models.ViewModels;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CasaDoCodigo.Controllers
{


    public class PedidoController : Controller
    {
        private readonly IDataService _dataService;
        public PedidoController(IDataService dataService)
        {
            this._dataService = dataService;
        }
        public IActionResult Carrossel()
        {
            IList<Produto> produtos = _dataService.GetProdutos();
            return View(produtos);
        }

        public IActionResult Carrinho(int? produtoId) 
        { 
            if (produtoId.HasValue) 
            {

            _dataService.AddItemPedido(produtoId.Value);

            }

            CarrinhoViewModel viewModel = GetCarrinhoViewModel();

            return View(viewModel);
        }

        private CarrinhoViewModel GetCarrinhoViewModel()
        {
            List<Produto> produtos = this._dataService.GetProdutos();

            var itensCarrinho = this._dataService.GetItensPedido();

            CarrinhoViewModel viewModel = 
                new CarrinhoViewModel(itensCarrinho);
            return viewModel;
        }

        public IActionResult Cadastro()
        {
            var pedido = _dataService.GetPedido();

            if (pedido == null)
            {
                return RedirectToAction("Carrossel");
            }
            else
            {
                return View(pedido);
            }
        }
        [HttpPost]
        [ValidateAntiForgeryToken] 
        public IActionResult Resumo(Pedido cadastro)
        {
            if (ModelState.IsValid)
            {
                var pedido = _dataService.UpdateCastro(cadastro);

                return View(pedido);
            }
            else
            {
                return RedirectToAction("Cadastro");
            }
        }

        [HttpPost]
        [ValidateAntiForgeryToken]

        public UpdateItemPedidoResponse PostQuantidade([FromBody]ItemPedido input) 

        {
            return _dataService.UpdateItemPedido(input);
        }
    }
}

insira seu código aqui ```

Olá, Rodrigo, talvez você tenha que desabilitar o ESLint.

Por favor siga esses passos:

  1. Abra o menu do Visual Studio: Tools > Options
  2. Navegue para Text Editor > JavaScript/TypeScript > EsLint
  3. Marque Enable ESLint como "False"

Instrutor fiz conforme recomendado não funcionou ? Poderia enviar meu projeto para vocês analisarem ?