none
Return RedirectToAction em async task<ActionResult> RRS feed

  • Pergunta

  • Como faço o redirecionamento para outra action que tb é async task, pesquisei e o que encontrei como resposta é assim mais não funciona.

    return await Task.Run<ActionResult>(() =>
    {
       return RedirectToAction("Index", "Departamento");
    });


    Junior

    quinta-feira, 30 de março de 2017 11:50

Respostas

  • Então é por isto, por ser invocado via javascript/ajax, o navegador não faz o redirecionamento. O que pode ser feito é retornar um JSON (ou um texto simples), por exemplo, daí no success do $.ajax (supondo que esteja usando jQuery) você verifica se o retorno é a mensagem esperada (tipo "OK") e faz o redirecionamento via JavaScript.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Junior_luiz quinta-feira, 30 de março de 2017 16:36
    quinta-feira, 30 de março de 2017 14:02

Todas as Respostas

  • Junior,

    Sua action atual (que faz o redirecionamento) tem alguma outro recurso que necessite de processamento assíncrono (tipo consulta a banco de dados, request http, etc)? Caso não, você pode mudar sua action para síncrona pois não terá diferença no processamento.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 30 de março de 2017 12:10
  • Juliano esse meu método em questão é onde faço login, após o login com sucesso tenho que redirecionar para outro local, toda a minha api é async, estou apenas estudando, criei uma solução e nela 2 projetos um api e outro mvc 

    Junior

    quinta-feira, 30 de março de 2017 12:19
  • Perfeito, mas só pra clarificar minha resposta, se sua autenticação não utilizar métodos assíncronos, sua action assíncrona não terá diferença.

    Enfim, altere para apenas return RedirectToAction("Index", "Departamento"), sem o return await Task.Run.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 30 de março de 2017 12:24
  • Juliano minha autenticação é customizada e portanto é assincrona, inicialmente havia feito apenas o redirecttoaction(Index","Departamento") e não funcionou, por isso fui procurar a solução e o que achei foi o que postei acima e que tb não funciona.

    Junior

    quinta-feira, 30 de março de 2017 12:46
  • Dá alguma mensagem de erro ou não redireciona?

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 30 de março de 2017 13:14
  • Nenhum erro, fica na mesma página, já debuguei, cria as session tudo diretinho.

    Junior

    quinta-feira, 30 de março de 2017 13:21
  • Alguns itens a serem verificados (por não estar vendo o código):

    • Sua action que chama o redirecionamento foi invocada como? Via ajax?
    • Action ou Controller de destino requer autenticação (atributo Authorize) e o usuário é redirecionado de volta para a action do login
    • Sua action está em uma controller do MVC ou Web API?
    • Erro de digitação no nome da action ou controller

    Enfim, sem o código fica meio complicado. Se puder compartilhar ajudaria.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 30 de março de 2017 13:28
  • Realmente é invocada via ajax ai está 
    public async Task<ActionResult> GetLogin(CLIENTE cliente)
            {
                try
                {
                    string cnpj = cliente.cli_cnpj;
                    string senha = cliente.cli_senha;
                    cnpj = cnpj.Replace(".", "").Replace("/", "").Replace("-", "");
    
                    var client = new ClientApi();
                    var jSon = "{cli_cnpj:'" + cnpj + "',cli_senha:'" + senha + "'}";
                    var uri = "cliente/logar";
                    var result = await client.PostRequest(uri, jSon);
                    if (result.IsSuccessStatusCode)
                    {
                        var data = await result.Content.ReadAsStringAsync();
                        JObject json = JObject.Parse(data);
                        Session["usuarioLogadoID"] = json.GetValue("cli_id").ToString();
                        Session["nomeUsuarioLogado"] = json.GetValue("cli_nome").ToString();
                        string tese = Session["usuarioLogadoID"].ToString();
                        string teste2 = Session["nomeUsuarioLogado"].ToString();
                    }
                    else
                    {
                        ViewBag.Message("Erro no login");
                        
                    }
    
                    
                    return RedirectToAction("Index", "Departamento");
    
    
                    //return await Task.Run<ActionResult>(() =>
                    //{
                    //   return RedirectToAction("Index", "Departamento");
                    //});
    
    
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    throw;
                }
                
                
            }


    Junior

    quinta-feira, 30 de março de 2017 13:58
  • Então é por isto, por ser invocado via javascript/ajax, o navegador não faz o redirecionamento. O que pode ser feito é retornar um JSON (ou um texto simples), por exemplo, daí no success do $.ajax (supondo que esteja usando jQuery) você verifica se o retorno é a mensagem esperada (tipo "OK") e faz o redirecionamento via JavaScript.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Junior_luiz quinta-feira, 30 de março de 2017 16:36
    quinta-feira, 30 de março de 2017 14:02
  • Junior,

    Interessante.

    Eu não tenho nenhum tipo de chamada assim, mas vi que dá pra fazer com AJAX:

    <script>
        $(function()
        {
            $.ajax(
            {
                url: "/api/request",
            }).done(function(responseUrl)
            {
                window.location.href = responseUrl;
            });
        });
    </script>


    Antero Marques
    _______________________________________________________________________________
    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.


    • Sugerido como Resposta Antero Marques quinta-feira, 30 de março de 2017 14:34
    • Não Sugerido como Resposta Antero Marques quinta-feira, 30 de março de 2017 14:34
    • Editado Antero Marques quinta-feira, 30 de março de 2017 14:35
    quinta-feira, 30 de março de 2017 14:34