Welcome to 3Dev Blogs Sign in | Join | Help

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="#">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,

Published Saturday, September 30, 2006 1:58 PM by starrillo
Filed Under: ,

Comments

No Comments

Anonymous comments are disabled