Server.Transfer o Response.Redirect, para enviar a los usuarios a otra pagina?

Ninguno , si sólo deseamos pasar un usuario a otro página y no vamos a cambiar el destino dinámicamente solo debemos usar <a href=”http://tu_link”>tu Link</a>.


Es que, hay algo que se debe entender y debe quedar claro, no porque ahora tengamos muchos controles de servidor, debemos usarlos todos, cada uno tiene su función y si no necesitamos procesamiento o alguna acción del lado del servidor, no hay porque usarlos, recuerden que al desarrollar aplicaciones web hay consideraciones mínimas que debemos tener para que la experiencia del usuario al navegar en nuestro sitio web sea la mejor.


Ahora, que hacemos si deseamos enviar al usuario a otra página, podemos usar un link, como el mostrado arriba. Si nuestro link será dinámico, si usar un control HyperLink o si queremos asignar programáticamente nuestros links podríamos usar Response.Redirect. La idea de Server.Transfer digamos que no es un reenviar propiamente dicho, sino un reenviar y pero mantener la información de la página origen.


Pero veamos un caso, el cual nació a través de una mail que me enviaron, y que es el origen de este post:


Caso: Veras Sergio, estoy en el capitulo de los “Themes”, lo que quiero hacer es que el usuario pueda elegir en el “dropdownlist” el color de “theme” que desea aplicar a una segunda página, cuando el usuario elija el color del “theme” lo REDIRECCIONO a una segunda página que tiene unos objetos que tomaran el color del “theme”.


Los problemas que tengo:



  • Si utilizo  Server.Transfer(“pagina2.aspx”) La barra de navegación del navegador (URL)  NOOOO MUESTRA la dirección de la página,  sino que se queda con la direccion de la primera. El color del “theme” SI funciona y se aplica a los objetos.

  • Si utilizo  Response.Redirect(“pagina2.aspx”) La barra de navegación del navegador (URL)  SIIIII MUESTRA la dirección de la página,  PERO El color del “theme” NOOOOOO funciona y por lo tanto los objetos se quedan con el color por default que tienen.

Ejecute el código enviado y pues si, ocurría lo que se mencionaba, pero examinemos el código de la página origen:



Protected Sub DropDownList1_SelectedIndexChanged( )
   
Server.Transfer(“pagina1.aspx”)
   
‘Response.Redirect(“pagina1.aspx”)
End Sub


Además hay un combo que contiene los valores: Azul, Verde, y Rojo. Al seleccionar un valor del combo se muestra el contenido de la otra página, el código que usa es el siguiente:



Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs)
   Page.Theme = Request(“menucolor”)
End Sub


Efectivamente este código funciona, pero porque no funciona cuando comento el Server y descomento el Response? , misterios sin resolver?


A ver primeros examinemos porque funciona, y después porque no funciona con Response.Redirect:



  • Lo que hace un Server.Transfer, es transferir el actual contexto a una página destino, pero solo se muestra la página destino. La ventaja esta en que se puede recuperar los valores del form, y controles de la página de origen [URL01].

  • Request(“menucolor”), porqué devuelve el color?, si solo ponemos el nombre del control?. Lo que esta pasando es como si hubiera colocado un boton html submit, y hubiéramos enviado todo el form, es por eso que al hacer Request(“menucolor”), nos devuelve el valor seleccionado del control generado en html, un SELECT. Si por ejemplo agregáramos un control label y quiséramos recuperar la propiedad Text, no podríamos porque este genera una etiqueta html SPAN, en cambio con un control TextBox si se podría recuperar la propiedad Text, porque el TextBox genera un control INPUT de tipo text.

Pero como funcionaría esto, usando Response.Redirect?



  • Al usar Response.Redirect, lo que pasa es como si hubiéramos colocado un link, y hubiéramos pulsado el link [URL02], la ventaja esta en que se puede hacer programáticamente.

  • Ahora en este caso si queremos que cuando se cambie el combo se vaya a la otra página usamos Response.Redirect, en caso contrario podríamos usar un HyperLink, el cuál sería programáticamente, se cambiaría la propiedad NavigateUrl, dependiendo que seleccione en el combo, después usando el link iríamos a la otra página. Esta última opción daría como ventaja que podríamos usar las propiedades un link, como target, entre otras.

  • Vamos hacerlo directamente en el combo, enviando valores directamente por la URL:


Protected Sub DropDownList1_SelectedIndexChanged()
  
‘Server.Transfer(“pagina1.aspx”)
   
Response.Redirect(“pagina1.aspx?colortema=” + menucolor.Text)

End
Sub



  • Y para recuperar las variables en la página destino sería de la siguiente manera:


Protected Sub Page_PreInit()    
    Page.Theme = Request.QueryString(“colortema”
)
End Sub



  • Podríamos usar también directamente Request(“colortema”), pero QueryString, es más específico para variables en la URL, ya que nos puede devolver en un arreglo de strings todas las variables de la URL, o el número de variables enviadas por la URL.

  • Con Response.Redirect, la url que aparece en el navegador es la de la página destino, y no de la página origen como si es el caso con Server.Transfer.

Mas sobre Server.Transfer vs. Response.Redirect, aquí. Pero un debate interesante es el siguiente, y una definición de ellos acá.


P.D.: Pediría que si en el futuro tengan dudas, en primera instancia las envíen a los foros, muchos de los temas ya fueron tocados por otra persona en otros post, y solo es cuestión de buscar y revisar la solución. Muchas veces es difícil, para mi, contestar rápidamente los mails de consulta, en cambio en un foro, hay muchos usuarios que podrían resolver la duda, además que hay mas variedad de opiniones. Tenemos foros muy buenos en espaniol, como el del Guille: http://foros.elguille.info, y los de solocodigo: http://foros.solocodigo.com/index.php?showforum=169.


Referencias:



Saludos,


Post cruzado desde starrillo blog

12 comentarios en “Server.Transfer o Response.Redirect, para enviar a los usuarios a otra pagina?”

  1. Hola Sergio, tengo un problema. que pasa si tengo una aplicación en asp y otra en asp.net, como le puedo pasar desde la de .net, valores en POST?

  2. Muy buenas Sergio, yo tengo otra duda. Desde una aplicación asp.net, quiero ejecutar una página .asp. Dicha página se cierra al acabar su ejecución, pero no se la manera de que esta devuelva el foco a la aplicación principal para que aparentemente todo funcione de forma secuencial y continue con su ejecución por la siguiente linea.
    Gracias de antemano.

  3. Hola Sergio,

    Antes de postear, busque en todos los links que pusiste, y no encontre nada. Justo el perro que programa hizo una pregunta similar, pero no veo como ver la respuesta, si es que ya se la diste.

    Pues estoy en una web form que llama a otra, estoy utilizando server.transfer con session. El problema es que cuando cierro la otra forma, quiero regresar a la inicial. El motivo de usar la segunda forma es como para simular un print preview en C#. Pero cuando regreso de la forma dos, quisiera regresar a la forma uno con todo igual, las variables, objetos, etc. y regresar al momento en la forma uno donde llame a la dos. Puedo hacerlo? Porque me parece que no. Tu que me recomiendas?

    Saludos,

    ale

  4. @Victor, revisa un poco esta entrada: http://geeks.ms/blogs/sergiotarrillo/archive/2008/08/25/95868.aspx. Podrías pasarlo por la URL, pero también usando POST, por defecto todas las páginas aspnet soportan POST, y si lo haces no tendrías ningún problema, tengo un ejemplo en los drafts.

    @elperroqueprograma, puedes usar PopUps con JavaScript, revisa este artículo: http://www.eggheadcafe.com/articles/20060117.asp.

    @Alejadran y @Jorge, las ventanas PopUps, sólo se trabajan con JavaScript nada más.

    Para todos, no traten de estar moviendo todos los objectos entre los request, mejor sólo mover el ID, y se vuelve a consultar a la base de datos, sobre todo si el código se vuelve muy complejo.

    Saludos,

  5. Hola! Primero que nada, les aclaro que soy aprendis en este rollo de la programada en páginas WEB 🙂 y actualmente tengo una página en ASP en la cual tengo un link que va a una HTML. Mi pregunta es: ¿Es viable que cuando me vaya a la HTML en esta pueda recoger las variables que tengo en la ASP?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *