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

Contínuas Requisições

Na tela de lista de Produto do projeto CaelumEstoque, vi que a página fica fazendo requisições GET continuamente, sem ter tomado nenhuma ação nela. Qual a razão disso?

http://prntscr.com/dtsxtq

Não faço retornos AJAX no controller:

[Route("produtos",Name = "listaProdutos")]
        public ActionResult Index()
        {
            ProdutosDAO dao = new ProdutosDAO();
            IList<Produto> produtos = dao.Lista();

            return View(produtos);
        }

E teoricamente a chamada AJAX só ocorre com interação do usuário (clicando no link 'Decrementar'):

<tbody>
        @foreach (var produto in Model)
            {
            <tr>
                <td>@produto.Id</td>
                <td>
                    @Html.RouteLink(produto.Nome, "visualizaProduto", new { id = produto.Id })
                </td>
                <td class="quantidade" id="quantidade@(produto.Id)">
                    @produto.Quantidade
                </td>
                <td>
                    <a href="#" id="decrementar" onclick="decrementa(@produto.Id)">Decrementar</a>
                </td>
            </tr>
        }
    </tbody>
function decrementa(produtoId){
      var url = "@Url.Action("DecrementaQtd", "Produto")";
      var params = { id: produtoId };
      $.post(url, params, atualiza);
    }

    function atualiza(response){
        var element = $("#quantidade" + response.Id);
        console.log(element.html(response.Quantidade));
        element.html(response.Quantidade);
    }
6 respostas

Olá Renan,

pelo código que você mandou não consegui ver nada que poderia estar causando estes problemas dos multiplos GETs. Só que o seu AJAX na verdade está chamando a action DecrementaQtd do ProdutoController. Me manda o código desta action para eu ver que pode estar lá o problema.

Oi Lucas, segue o código do Controller:

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
        [Route("produtos",Name = "listaProdutos")]
        public ActionResult Index()
        {
            ProdutosDAO dao = new ProdutosDAO();
            IList<Produto> produtos = dao.Lista();
            ///ViewBag.Produtos = produtos;

            return View(produtos);
        }

        [Route("produtos/cadastraProduto", Name = "cadastraProduto")]
        public ActionResult Form()
        {
            carregaListaCategorias();
            ViewBag.Produto = new Produto();
            return View();
        }

        [HttpPost]
        [Route("produtos/salvaProduto", Name = "salvaProduto")]
        public ActionResult Adiciona(Produto produto)
        {
            int idInformatica = 1;
            if (produto.CategoriaId.Equals(idInformatica) && produto.Preco <100)
            {
                ModelState.AddModelError("produto.categoriaInvalida","A categoria não permite itens com preço abaixo de 100 reais");
            }
            if (ModelState.IsValid)
            {
                ProdutosDAO dao = new ProdutosDAO();
                dao.Adiciona(produto);
            }
            else
            {
                ViewBag.Produto = produto;
                carregaListaCategorias();
                return View("Form");
            }


            return RedirectToAction("Index", "Produto");
        }

        [Route("produtos/{id}", Name = "visualizaProduto")]
        public ActionResult Visualiza(int id)
        {
            ProdutosDAO dao = new ProdutosDAO();
            Produto produto = dao.BuscaPorId(id);

            ViewBag.Produto = produto;
            return View();
        }


        public void carregaListaCategorias()
        {
            CategoriasDAO dao = new CategoriasDAO();
            IList<CategoriaDoProduto> categorias = dao.Lista();
            ViewBag.CategoriasProduto = categorias;
        }

        public ActionResult DecrementaQtd(int id)
        {
            ProdutosDAO dao = new ProdutosDAO();
            Produto produto = dao.BuscaPorId(id);

            produto.Quantidade--;
            dao.Atualiza(produto);

            return Json(produto);
        }
    }
}

No seu controller parece tudo certo. E o Ajax que você montou também parece correto. Ele começa a fazer esse monte de requisição apenas depois que você clicou no link de decrementar? Chegou a reparar se acontece em outras páginas? Ou quando você clica em outros links?

O mais estranho são os endereços que os Get estão batendo. Cada requisição tem como url localhost:2236, mas seu projeto parece que estava no ar em localhost:51270. Não Você pode mandar todo o projeto para algum repositório, tipo um github, para eu baixar e rodar na minha máquina?

O que você pode fazer também é copiar esse endereço do get http://localhost:2236/c17ac... e tentar abrir na mão em alguma aba para ver o que ele te mostra e está tentando acessar.

Abri um dos links e me retornou essa linha:

{"C":"d-E7BF928A-D,0|G,8|H,0","M":["{\"name\":\"sys.callback\",\"args\":[8,true],\"callbackId\":-1}"]}

Tá meio torto, mas tá lá:

https://github.com/lipsinch/caelumEstoque

Baixei o projeto e rodei na minha máquina, mas ele não faz esse comportamento estranho de fazer vários Gets. Meu chute é que estes links podem ser o browser link do visual studio te zuando. Aqui tem um link de como você desabilita o browser link, veja se com isso esses gets somem.

solução!

É isso mesmo, desativei e sumiram as requisições.

Valeu!

Edit: Opa, marquei aqui sem querer como solução. A resposta do lucas.takeshi é a solução:

Baixei o projeto e rodei na minha máquina, mas ele não faz esse comportamento estranho de fazer vários Gets. Meu chute é que estes links podem ser o browser link do visual studio te zuando. Aqui tem um link de como você desabilita o browser link, veja se com isso esses gets somem.