Redirecionando usuários da página de edição de volta para a página de chamada

StackOverflow https://stackoverflow.com/questions/36733

  •  09-06-2019
  •  | 
  •  

Pergunta

Estou trabalhando em um aplicativo web de gerenciamento de projetos.O usuário tem várias maneiras de exibir uma lista de tarefas.Ao visualizar uma página de lista, eles clicam na tarefa e são redirecionados para a página de edição da tarefa.

Como eles vêm de diversas maneiras, estou apenas curioso para saber melhor forma de redirecionar o usuário de volta à página de chamada.Tenho algumas ideias, mas gostaria de receber a opinião de outros desenvolvedores.

Você armazenaria o ligando url na sessão?como um biscoito?Eu gosto do conceito de usar um objeto lidar o redirecionamento.

Foi útil?

Solução

Eu armazenaria o URL de referência usando o Visualizar estado.Armazenar isso fora do escopo da página (ou seja,no estado Session ou cookie) pode causar problemas se mais de uma janela do navegador estiver aberta.

O exemplo abaixo valida que a página foi chamada internamente (ou seja,não solicitado diretamente) e volta para a página de referência depois que o usuário envia sua resposta.

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.UrlReferrer == null)
        {
            //Handle the case where the page is requested directly
            throw new Exception("This page has been called without a referring page");
        }

        if (!IsPostBack)
        {   
            ReturnUrl = Request.UrlReferrer.PathAndQuery;
        }
    }

    public string ReturnUrl
    {
        get { return ViewState["returnUrl"].ToString();  }
        set { ViewState["returnUrl"] = value; }
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        //Do what you need to do to save the page
        //...

        //Go back to calling page
        Response.Redirect(ReturnUrl, true);
    }
}

Outras dicas

Esta mensagem pode ser marcada como asp.net, mas acho que é um problema independente de plataforma que incomoda todos os novos desenvolvedores da Web, pois procuram uma maneira 'limpa' de fazer isso.

Acho que as duas opções para conseguir isso são:

  1. Um parâmetro no URL
  2. Um URL armazenado na sessão

Não gosto do método url, é um pouco confuso e você deve se lembrar de incluir o parâmetro em cada URL relevante.

Eu apenas usaria um objeto com métodos estáticos para isso.O objeto envolveria o item de sessão que você usa para armazenar URLs de redirecionamento.

Os métodos provavelmente seriam os seguintes (todos estáticos públicos):

  • setRedirectUrl(URL da string)
  • doRedirect(string URL padrão)

setRedirectUrl seria chamado em qualquer ação que produzisse links/formulários que precisassem redirecionar para um determinado URL.Digamos que você tenha uma ação de visualização de projetos que gera uma lista de projetos, cada um com tarefas que podem ser executadas neles (por exemplo,excluir, editar) você chamaria RedirectClass.setRedirectUrl("/project/view-all") no código desta ação.

Então, digamos que o usuário clique em excluir, ele precisa ser redirecionado para a página de visualização após uma ação de exclusão, portanto, na ação de exclusão você chamaria RedirectClass.setRedirectUrl("/project/view-all").Este método verificaria se a variável de redirecionamento foi definida na sessão.Se sim, redirecione para esse URL.Caso contrário, redirecione para a URL padrão (a string passada para o método setRedirectUrl).

Concordo com "rmbarnes.myopenid.com" em relação a este problema como sendo independente de plataforma.

Eu armazenaria o URL da página de chamada no QueryString ou em um campo oculto (por exemplo, no ViewState para ASP.NET).Se você armazená-lo fora do escopo da página (como Sessão, variável global - Estado do aplicativo e assim por diante), não será apenas um exagero, como Tom disse, mas trará problemas.

Que tipo de problema?Problema se o usuário tiver mais de uma aba (janela) desse navegador aberta.As abas (ou janelas) do mesmo navegador provavelmente compartilharão a mesma sessão e o redirecionamento não será o esperado e tudo o que o usuário sentirá é que se trata de um bug.

Meus 2 centavos de euro..

Eu pessoalmente armazenaria as informações de redirecionamento necessárias em um objeto e as trataria globalmente.Eu evitaria usar um parâmetro QueryString ou algo semelhante, pois eles poderiam tentar voltar para uma página que não deveriam (possível problema de segurança?).Você poderia então criar um método estático para lidar com o objeto de redirecionamento, que poderia ler as informações e agir de acordo.Isso encapsula seu processo de redirecionamento em uma página.

Usar um objeto também significa que você pode estendê-lo posteriormente, se necessário (como adicionar mensagens de retorno e outras informações).

Por exemplo (esta é uma diretriz aproximada de 2 minutos, aliás!):

public partial class _Default : System.Web.UI.Page 
{

    void Redirect(string url, string messsage)
    {
        RedirectionParams paras = new RedirectionParams(url, messsage);
        RedirectionHandler(paras); // pass to some global method (or this could BE the global method)
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Redirect("mypage.aspx", "you have been redirected");
    }
}

public class RedirectionParams
{
    private string _url;

    public string URL
    {
        get { return _url; }
        set { _url = value; }
    }

    private string _message;

    public string Message
    {
        get { return _message; }
        set { _message = value; }
    }

    public RedirectionParams(string url, string message)
    {
        this.URL = url;
        this.Message = message;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top