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

Tempo para o Ajax responder

Estou fazendo um programa em que a cada clique eu aumentaria um número em tempo real. Só que com o código que coloquei abaixo eu preciso dar dois cliques. Acho que não dá tempo para o ajax mandar para o controller. Vcs conhecem algum outro código que posso colocar no lugar de " location.reload();"

$.ajax({ url: '/Home/UpdateQuantidade', type: 'POST', contentType: 'application/json', data: JSON.stringify(data) }); location.reload();
10 respostas

Boa tarde, Caio! Como vai?

O que vc quer é efetuar o location.reload() apenas quando a requisição AJAX já tiver sido respondida, é isso? Se é isso mesmo, vc pode tentar isso aqui:

$.ajax( /* Configurações da requisição omitidas. */ )
     .done(function() {
          // Essa função será executada se a requisição for bem sucedida.
          location.reload();
     });

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Boa tarde Gabriel!

Eu fiz o que me sugeriu e realmente houve uma mudança, mas não a esperada.

Agora invés de dar dois cliques para atualizar. Eu tenho que apertar F5.

Oi Caio, tudo bem?

Estou fazendo um programa em que a cada clique eu aumentaria um número em tempo real. Só que com o código que coloquei abaixo eu preciso dar dois cliques. Acho que não dá tempo para o ajax mandar para o controller. Vcs conhecem algum outro código que posso colocar no lugar de " location.reload();"

O problema é que a chamada location.reload(); não está aguardando o resultado da requisição AJAX. Você precisa colocar essa instrução dentro da função done() do jQuery, conforme abaixo:

$.ajax(
{ 
    url: '/Home/UpdateQuantidade', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify(data) 
}).done(function(response) {
    location.reload();
});

Assim, o código location.reload(); só é executado após a resposta do AJAX.

Marcelo, tudo bem.

Não mudou nada. Response fica cinza e é dito que ele é declarado mas nunca usado.

Acredito que fiz algo errado na lógica do controller e do repository, pois são diferentes da apresentada na aula, já que estou tentando fazer outro projeto.

      [HttpPost]
        public IActionResult UpdateQuantidade([FromBody]FluxoRegra Fluxoregra)
        {
            FluxoRegra ultimo = contexto.Set<FluxoRegra>().ToList().Last();

            alterarQuantidade.UpdateQuantidade(Fluxoregra, ultimo);

            return View("Rastreabilidade");

        }
public class AlterarQuantidade : IAlterarQuantidade
    {
        private readonly ProjetoContext contexto;

        public AlterarQuantidade(ProjetoContext contexto)
        {
            this.contexto = contexto;
        }

        public void UpdateQuantidade (FluxoRegra FluxoRegra, FluxoRegra ultimo)
        {


            if ((FluxoRegra.EX == ultimo.EX + 1) || (FluxoRegra.EX == ultimo.EX - 1))
            {
                ultimo.EX = FluxoRegra.EX;              
                contexto.SaveChanges();
            }
            if ((FluxoRegra.FA == ultimo.FA + 1) || (FluxoRegra.FA == ultimo.FA - 1))
            {
                ultimo.FA = FluxoRegra.FA;
                contexto.SaveChanges();
            }
            if ((FluxoRegra.FP == ultimo.FP + 1) || (FluxoRegra.FP == ultimo.FP - 1))
            {
                ultimo.FP = FluxoRegra.FP;
                contexto.SaveChanges();
            }
            if ((FluxoRegra.MSG == ultimo.MSG + 1) || (FluxoRegra.MSG == ultimo.MSG - 1))
            {
                ultimo.MSG = FluxoRegra.MSG;
                contexto.SaveChanges();
            }
            if ((FluxoRegra.PE == ultimo.PE + 1) || (FluxoRegra.PE == ultimo.PE - 1))
            {
                ultimo.PE = FluxoRegra.PE;
                contexto.SaveChanges();
            }
            if ((FluxoRegra.RN == ultimo.RN + 1) || (FluxoRegra.RN == ultimo.RN - 1))
            {
                ultimo.RN = FluxoRegra.RN;
                contexto.SaveChanges();
            }


        }

    }
       public IActionResult Rastreabilidade()
        {
            FluxoRegra ultimo = contexto.Set<FluxoRegra>().ToList().Last();

            return View(ultimo);
        }

Do Ajax vai para UpdateQuantidade no controller, que vai para alterar quantidade e o UpdateQuantidade vai para Rastreabilidade e mostraria a view atualizada.

solução!

Opa, Caio! Como vai?

Agora o problema não está mais no JS e sim no código do back-end em C#! Veja que o seu controlador continua devolvendo um IActionResult representando uma visualização mesmo nesse caso, onde vc não deseja fazer nenhuma navegação! Afinal de conta o AJAX serve justamente para atualizar a tela sem fazer navegação! Ou seja, o que vc quer na realidade é apenas devolver uma resposta informando que a operação de atualização deu certo e possivelmente devolver junto um JSON com informações relevantes para vc!

Sendo assim, o retorno do método acionado no seu controlador deve mudar! Em vez de fazer

return View( /* seu modelo de dados a ser devolvido */ );

Vc terá que fazer

return Json( /* seu modelo de dados a ser devolvido */ );

Em seguida, no código JS, utilize o seguinte código para fazer a requisição:

$.ajax(
{ 
    url: '/Home/UpdateQuantidade', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify(data) 
}).done(function(response) {
    console.log(response);  // Essa linha irá imprimir no console a resposta que vc obteve.

    // Lógica de atualização da tela omitida.
});

Feito isso, vc verá que no console do navegador será impressa a resposta que vc obteve. Daí será apenas substituir com a sua lógica de atualização do DOM a parte onde aparece o comentário // Lógica de atualização da tela omitida.

Para saber mais: O que vc está tentando fazer é transformar o método do seu controlador num endpoint, conceito muito comum quando falamos de APIs! Aqui na Alura temos uma sequência de cursos bacanas sobre construção de APIs usando o Asp.NET Core! Então, indico fortemente a vc esses cursos! Deixo a seguir o link do primeiro pra vc dar uma olhada caso queira:

APIs Rest com Asp.NET Core 2.1 Parte 1: Da app MVC para API

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Pois é. Eu estava retornando errado. Fui no exemplo e vi como faria certo e funcionou. Obrigado. Muita informação, a gente se perde. Achava que tinha que retornar é a view, e não o modelo atualizado.

 [HttpPost]
        public FluxoRegra UpdateQuantidade([FromBody]FluxoRegra Fluxoregra)
        {
            FluxoRegra ultimo = contexto.Set<FluxoRegra>().ToList().Last();

            return alterarQuantidade.UpdateQuantidade(Fluxoregra, ultimo);

        }

Opa, Caio! Que bom que resolveu o seu problema! Sempre que tiver qualquer dúvida é só mandar aqui no fórum da Alura!

Grande abraço e bons estudos, meu aluno!