Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!