Redirigir a los usuarios desde la página de edición a la página de llamada

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy trabajando en una aplicación web de gestión de proyectos.El usuario tiene una variedad de formas de mostrar una lista de tareas.Al ver una página de lista, hacen clic en la tarea y son redirigidos a la página de edición de la tarea.

Dado que provienen de diversas formas, solo tengo curiosidad por saber mejor manera de redirigir el usuario regresa a la página de llamada.Tengo algunas ideas, pero me gustaría recibir comentarios de otros desarrolladores.

¿Guardarías el vocación URL en sesión?como una galleta?Me gusta el concepto de usar un objeto. manejar la redirección.

¿Fue útil?

Solución

Almacenaría la URL de referencia usando el Ver estado.Almacenar esto fuera del alcance de la página (es decir,en el estado de sesión o cookie) pueden causar problemas si hay más de una ventana del navegador abierta.

El siguiente ejemplo valida que la página fue llamada internamente (es decir,no solicitado directamente) y regresa a la página de referencia después de que el usuario envía su respuesta.

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);
    }
}

Otros consejos

Este mensaje puede estar etiquetado como asp.net, pero creo que es un problema independiente de la plataforma que molesta a todos los nuevos desarrolladores web que buscan una forma "limpia" de hacerlo.

Creo que las dos opciones para lograr esto son:

  1. Un parámetro en la URL.
  2. Una URL almacenada en la sesión.

No me gusta el método de la URL, es un poco complicado y debes recordar incluir el parámetro en cada URL relevante.

Simplemente usaría un objeto con métodos estáticos para esto.El objeto rodearía el elemento de sesión que utiliza para almacenar las URL de redireccionamiento.

Los métodos probablemente serían los siguientes (todos públicos estáticos):

  • setRedirectUrl (URL de cadena)
  • doRedirect (cadena URL predeterminada)

setRedirectUrl se llamaría en cualquier acción que produzca enlaces/formularios que deban redirigir a una URL determinada.Supongamos que tiene una acción de visualización de proyectos que genera una lista de proyectos, cada uno con tareas que se pueden realizar en ellos (p. ej.eliminar, editar) llamarías a RedirectClass.setRedirectUrl("/project/view-all") en el código para esta acción.

Luego digamos que el usuario hace clic en eliminar, debe ser redirigido a la página de visualización después de una acción de eliminación, por lo que en la acción de eliminación llamaría a RedirectClass.setRedirectUrl("/project/view-all").Este método buscaría ver si la variable de redireccionamiento se configuró en la sesión.Si es así redirija a esa URL.De lo contrario, redirija a la URL predeterminada (la cadena pasada al método setRedirectUrl).

Estoy de acuerdo con "rmbarnes.myopenid.com" en cuanto a que este tema es independiente de la plataforma.

Almacenaría la URL de la página de llamada en QueryString o en un campo oculto (por ejemplo, en ViewState para ASP.NET).Si lo almacena fuera del alcance de la página (como Sesión, variable global - Estado de la aplicación, etc.), no será simplemente excesivo como dijo Tom, sino que le traerá problemas.

¿Que tipo de problema?Problemas si el usuario tiene abierta más de una pestaña (ventana) de ese navegador.Las pestañas (o ventanas) de un mismo navegador probablemente compartirán la misma sesión y la redirección no será la esperada y lo único que el usuario sentirá es que se trata de un error.

Mis 2 céntimos de euro...

Yo personalmente almacenaría la información de redirección requerida en un objeto y la manejaría globalmente.Evitaría usar un parámetro QueryString o similar, ya que podrían intentar regresar a una página que no deberían (¿posible problema de seguridad?).Luego podría crear un método estático para manejar el objeto de redirección, que podría leer la información y actuar en consecuencia.Esto encapsula su proceso de redirección en una página.

Usar un objeto también significa que puedes ampliarlo más adelante si es necesario (como agregar mensajes de respuesta y otra información).

Por ejemplo (¡esta es una guía aproximada de 2 minutos, por cierto!):

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top