none
Response.Redirect Referencia a objeto no establecida RRS feed

  • Pregunta

  • Hola a todos,

    Tengo un problema, lo que pasa es que no puedo recibir datos por Response.Redirect(url)

    el código que tengo es el siguiente:

    protected void btnRedirect_Click(object sender, EventArgs e)
            {
                //Response.Redirect("PaginaRedirect.aspx");
                string url = string.Empty;
                url = string.Format("{0}?nombre={1}", "PaginaRedirect.aspx", this.MiPersona.ObtenerNombre());
                Response.Redirect(url);
            }
    
            protected void btnTransfer_Click(object sender, EventArgs e)
            {
                //Server.Transfer("PaginaTransfer.aspx");
                string url = string.Empty;
                url = string.Format("{0}?nombre={1}", "PaginaTransfer.aspx", this.MiPersona.ObtenerNombre());
                Server.Transfer(url);
            }

    Con Server.Transfer(url) ningún problema puedo ver los datos en la pagina de destino, pero con Response.Redirect(url) me da el siguiente error:

    El código que tengo para recibir los datos es el siguiente:

    1.- Para Transfer

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            string nombre = Request.Params["nombre"];
            if(nombre != null)
            {
                this.txtNombre.Text = nombre;
                this.txtNombreForm.Text = Request.Form["txtSaludo"].ToString();
            }
        }
    }

    2.- Para Redirect:

            protected void Page_Load(object sender, EventArgs e)
            {
                if(!IsPostBack)
                {
                    string nombre = Request.Params["nombre"];
                    if(nombre != null)
                    {
                        this.txtNombre.Text = nombre;
                        //this.txtNombreForm.Text = Request.QueryString["txtSaludo"].ToString();
                        this.txtNombreForm.Text = Request.Form["txtSaludo"].ToString();
                    }
                }
            }

    Espero puedan colaborar para encontrar la ayuda.

    Gracias!


    Cristian






    sábado, 31 de agosto de 2019 22:06

Respuestas

  • Entonces  ¿como se usa el Redirect de forma correcta?

    Bueno, es correcto usarlo como lo haces. Lo que no es correcto es intentar recuperar en el destino del Redirect más valores de los que has pasado en el redirect. El remedio es pasar todos los valores que necesites:

    string url = string.Format("{0}?nombre={1}&otracosa={2}&otramas={3}", "PaginaRedirect.aspx", this.MiPersona.ObtenerNombre(), unavariable, otravariable);
    Response.Redirect(url);
    

    Y entonces en el destino puedes preguntar por Request.QueryString["otracosa"], Request.QueryString["otramas"], etc.

    En esos datos podrías pasar lo que quieras y llamarlos como quieras. Pero la cuestión es que tienes que meterlos en la url expresamente desde el código que hace el Redirect. No hay ninguna manera de que en el destino del Redirect se puedan recuperar otros datos de la página original si no los has metido antes en la Url.

    Si esto no resulta práctico (tiene al menos dos inconvenientes: uno es que se ven los datos en la Url y se pueden manipular, y otro es que hay un límite máximo de longitud de la Url), entonces hay que buscar otra alternativa.

    Una alternativa, como ya has comprobado, es Request.Transfer. Esto tiene dos ventajas: una es que es más rápido porque (a diferencia del Redirect) no requiere un viaje de ida y vuelta al navegador, sino que ocurre localmente en el servidor. Y otra es que se "ven" todos los datos de la página (porque todavía la tenemos en el servidor, no nos hemos "movido" de ella). Y tiene el inconveniente de que en el navegador se sigue viendo la Url de la página antigua, no la de la página a la que nos hemos movido, por lo que no funcionará correctamente si a continuación el navegador hace alguna operación que deba funcionar sobre la página nueva en lugar de la antigua.

    Otra alternativa es hacer un POST (en lugar del GET) a la pagina de destino. Entonces sí que se envían todos los datos y pueden recuperarse con Request.Form. Y también pueden recuperarse con los nombres de variable si declaras la página origen al principio del aspx. Este POST se puede hacer mediante javascript desde la página origen. Y si no quieres escribir manualmente el javascript, se puede conseguir que asp.net lo genere automáticamente poniendo la propiedad PostBackUrl en el botón que hace el Submit.

    domingo, 1 de septiembre de 2019 17:10

Todas las respuestas

  • Es lógico que te dé el error que te da con el Response.Redirect, si piensas un poco en cómo funciona internamente.

    Estás tratando de recoger un valor así:

    this.txtNombreForm.Text = Request.Form["txtSaludo"].ToString();

    ¿De dónde sale el Request.Form? Pues de desempaquetar los datos del <form> de html que se han transmitido al servidor al hacer un POST.

    ¿Y qué hace el Response.Redirect? Pues envía una respuesta al navegador que le fuerza a hacer un GET a la direcciónindicada en el redirect. Fíjate bien que es un GET y no un POST. Por lo tanto no transmite ningún dato de <form>. En consecuencia, el Request.Form en la página de destino viene siempre vacío, cualquier elemento que intentes sacar del Form será null, y si haces un ToString del null sale el error de "referencia no establecida" que estás viendo.

    En resumen: no puedes usar un Response.Redirect para saltar a una página de destino y esperar que dicha página pueda tomar algún dato de la página origen. Si tienes que pasar algo del origen al destino usando un Redirect, entonces lo que quieras pasar tienes que concatenarlo en la URL antes de hacer el Redirect, y luego recuperarlo con Request.QueryString en lugar de Request.Form. Ojo, solo sirve para pasar una cantidad pequeña de datos, de lo contrario te pasas de la longitud máxima del query.

    domingo, 1 de septiembre de 2019 6:38
  • Hola Alberto, Gracias por tu ayuda.

    Como bien dices: Si tienes que pasar algo del origen al destino usando un Redirect, entonces lo que quieras pasar tienes que concatenarlo en la URL antes de hacer el Redirect.

    Eso lo que intento hacer acá:

    protected void btnRedirect_Click(object sender, EventArgs e)
            {
                //Response.Redirect("PaginaRedirect.aspx");
                string url = string.Empty;
                url = string.Format("{0}?nombre={1}", "PaginaRedirect.aspx", this.MiPersona.ObtenerNombre());
                Response.Redirect(url);
            }

    y luego recuperarlo con Request.QueryString en lugar de Request.Form (eso tambien lo intente y sigue el mismo error)

    protected void Page_Load(object sender, EventArgs e)
            {
                if(!IsPostBack)
                {
                    string nombre = Request.Params["nombre"];
                    if(nombre != null)
                    {
                        this.txtNombre.Text = nombre;
                        this.txtNombreForm.Text = Request.QueryString["txtSaludo"].ToString();
                        //this.txtNombreForm.Text = Request.Form["txtSaludo"].ToString();
                    }
                }
            }

    Saludos


    Cristian

    domingo, 1 de septiembre de 2019 7:11
  • No, así no funcionará. Si lo quieres recuperar desde el QueryString, tienes que usar el mismo valor que pusiste en el QueryString. No puedes recuperar "txtSaludo", solo puedes recuperar "nombre", que es el único valor que viene en la Url:

            protected void Page_Load(object sender, EventArgs e)
            {
                if(!IsPostBack)
                {
                    this.txtNombre.Text = Request.QueryString["nombre"];
                }
            }

    Donde dice ["nombre"] no puedes poner ninguna otra cosa que no sea "nombre", salvo que antes la añadas en la Url. No se puede recuperar ningún valor del form anterior tal como "txtSaludo".

    domingo, 1 de septiembre de 2019 11:09
  • No, así no funcionará. Si lo quieres recuperar desde el QueryString, tienes que usar el mismo valor que pusiste en el QueryString. No puedes recuperar "txtSaludo", solo puedes recuperar "nombre", que es el único valor que viene en la Url:

            protected void Page_Load(object sender, EventArgs e)
            {
                if(!IsPostBack)
                {
                    this.txtNombre.Text = Request.QueryString["nombre"];
                }
            }

    Donde dice ["nombre"] no puedes poner ninguna otra cosa que no sea "nombre", salvo que antes la añadas en la Url. No se puede recuperar ningún valor del form anterior tal como "txtSaludo".

    Ya vi que con Transfer no da ningún problema.

    Según entiendo el método Redirect (alternativa mas segura que QueryString) se usa para pasar valores desde una pagina a otra.

    Entonces  ¿como se usa el Redirect de forma correcta?

    PD: Lo que estoy tratando de hacer, es un ejemplo muy sencillo solo para entender su uso, nada mas.

    Saludos


    Cristian


    domingo, 1 de septiembre de 2019 16:50
  • Entonces  ¿como se usa el Redirect de forma correcta?

    Bueno, es correcto usarlo como lo haces. Lo que no es correcto es intentar recuperar en el destino del Redirect más valores de los que has pasado en el redirect. El remedio es pasar todos los valores que necesites:

    string url = string.Format("{0}?nombre={1}&otracosa={2}&otramas={3}", "PaginaRedirect.aspx", this.MiPersona.ObtenerNombre(), unavariable, otravariable);
    Response.Redirect(url);
    

    Y entonces en el destino puedes preguntar por Request.QueryString["otracosa"], Request.QueryString["otramas"], etc.

    En esos datos podrías pasar lo que quieras y llamarlos como quieras. Pero la cuestión es que tienes que meterlos en la url expresamente desde el código que hace el Redirect. No hay ninguna manera de que en el destino del Redirect se puedan recuperar otros datos de la página original si no los has metido antes en la Url.

    Si esto no resulta práctico (tiene al menos dos inconvenientes: uno es que se ven los datos en la Url y se pueden manipular, y otro es que hay un límite máximo de longitud de la Url), entonces hay que buscar otra alternativa.

    Una alternativa, como ya has comprobado, es Request.Transfer. Esto tiene dos ventajas: una es que es más rápido porque (a diferencia del Redirect) no requiere un viaje de ida y vuelta al navegador, sino que ocurre localmente en el servidor. Y otra es que se "ven" todos los datos de la página (porque todavía la tenemos en el servidor, no nos hemos "movido" de ella). Y tiene el inconveniente de que en el navegador se sigue viendo la Url de la página antigua, no la de la página a la que nos hemos movido, por lo que no funcionará correctamente si a continuación el navegador hace alguna operación que deba funcionar sobre la página nueva en lugar de la antigua.

    Otra alternativa es hacer un POST (en lugar del GET) a la pagina de destino. Entonces sí que se envían todos los datos y pueden recuperarse con Request.Form. Y también pueden recuperarse con los nombres de variable si declaras la página origen al principio del aspx. Este POST se puede hacer mediante javascript desde la página origen. Y si no quieres escribir manualmente el javascript, se puede conseguir que asp.net lo genere automáticamente poniendo la propiedad PostBackUrl en el botón que hace el Submit.

    domingo, 1 de septiembre de 2019 17:10