Un aspecto
importante en la construcción de aplicaciones Web es la navegación entra
páginas y el uso de link, que en conjunto unen las páginas de nuestra
aplicación haciendo de esta un todo. De lo contrario tendríamos páginas
aisladas que no se podrían comunicar entre si. En este artículo, revisaremos
distintas técnicas de navegación tanto con código a nivel del servidor como del
cliente.
Conocer estas
técnicas será de gran utilidad en el momento de diseñar una aplicación WEB.
Técnicas
de navegación entre páginas
a)
Navegación con el control HiperLink
Esta técnica permite
navegar hasta otra página html como asp y aspx.
Este control no
proporciona ningún evento del lado del servidor. La navegación se realiza inmediatamente
cuando el usuario genera el evento click, del lado del cliente, en el control.
La dirección
de destino se especifica en la propiedad ‘NavigateURL’ del control. Si se
quiere interceptar un evento clic desde el servidor para controlar la navegación
desde código, se puede utilizar un control de servidor Button, LinkButton o
ImageButton más el objeto Response.
b)
Utilizando el método Response.Redirect
Permite navegar
hasta otra página, pero por código. Es equivalente a la navegación con el control
HiperLink. Para utilizar este método, simplemente introduzca el código
siguiente en el evento click de un control de servidor Button:
Private Sub ImageButton1_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ImageButton1.Click Response.Redirect("PaginaDestino.aspx") End Sub
Observación: El método sobrecargado
Redirect(URL, Boolean) tiene un parámetro boolean que especifica si se termina
la ejecución de la página actual: True, o no : False. Si se especifica True o
si se utiliza el método Redirect especificando solamente la URL de destino, se
producirá una excepción del tipo ThreadAbortException, que indica el término de la ejecución de la
página que origina la navegación. Se debe considerar este comentario cuando se
tiene sentencias Redirect
dentro de bloques Try, ya
que la excepción producida por el método Redirect puede no ser esperada en el flujo de la
aplicación.
c)
Utilizando el método Server. Transfer
Solo sirve para
navegar entre páginas aspx. Este método termina la ejecución del Web Form que
origina la llamada y navega hasta la página aspx de destino. Si consideramos el
comentario anterior, la utilización de este método, siempre va a generar una
excepción del tipo ThreadAbortException, ya que termina la ejecución de
la página de origen. La sintaxis es la misma que para el método Redirect:
Private Sub
ImageButton1_Click(ByVal sender As System.Object, ByVal
e As System.Web.UI.ImageClickEventArgs) Handles
ImageButton1.Click
Server.Transfer("NuevaPagina.aspx")
End Sub
La versión
sobrecargada de este método, incorpora un valor booleano para especificar si se
conservan las colecciones QueryString y Form luego del término de la ejecución
de la página actual. Esto permite que podamos acceder a los valores del ViewState de la página de origen desde la
página de destino. Ver el ejemplo más adelante.
'PaginaOrigen.aspx Private Sub ImageButton1_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ImageButton1.Click Server.Transfer("PaginaDestino.aspx", True) End Sub 'PaginaDestino.aspx Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim pCollectionForm As System.Collections.Specialized.NameValueCollection pCollectionForm = Request.Form Label1.Text = pCollectionForm.Item("TextBox1") End Sub
Observación: Debe introducirse la directiva EnableViewStateMac=”false” en la página de origen para
deshabilitar el hashing del ViewState, de lo contrario se producirá una
excepción.
La página de origen
contiene un control de servidor TextBox llamado Textbox1. El valor de
este cuadro sw texto es obtenido desde la página de destino y mostrado en
el control Label1.
d)
Utilizando el método Server.Execute
Solo funciona para
navegar entre páginas aspx. La ejecución de la página de destino comienza sin
detener la ejecución de la página que originó la navegación. Este método
permite desplegar el contenido de la página de destino en una sección de la
página de origen. En el ejemplo de más abajo, se muestra el uso de esta técnica
utilizando el método sobrecargado Server.Execute(String, TextWriter)
En el ejemplo
siguiente se escribe el contenido de la página de destino en la
página de origen utilizando Response.Write
Private Sub BtnServerEx_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnServerEx.Click Dim pContenidoPaginaDestino As New System.IO.StringWriter Server.Execute("PaginaTres.aspx" , pContenidoPaginaDestino) Response.Write(pContenidoPaginaDestino) End Sub
Observación: Al igual que para el caso de
utilizar Server.Transfer y mantener la los datos de la estado de la página de
origen, es necesario incorporar la directiva de página
EnableViewStateMac=”false” para deshabilitar el hashing del ViewState.
e)
Utilizando el método de script del lado del cliente Window.Open
Esta técnica,
permite navegar a páginas html o aspx. Como se trata de un script del lado del
cliente, a través de este método es posible controlar el aspecto y otras
características propias de la ventana de Internet Explorer, como por ejemplo,
abrir el contenido en una nueva ventana o en una ventana tipo ‘popup’.
Desde los objetos
del lado del servidor no es posible controlar estas características ya que este
objeto de Internet Explorer solo existe en el lado del cliente (DOM).
Existen varios
métodos para llamar script del lado del cliente desde código del lado del
servidor. En esta ocasión, mostraré un método para agregar código de cliente en
la página html utilizando RegisterStartupScript. Este método agrega secuencias
de comandos al final de la página html.
Otra técnica (no se
muestra en este artículo), sería establecer el valor del atributo onclick de un
control html desde código del servidor: Control.Attributes.Add
("onclick",
"javascript:AbrePagina('PaginaDestino.aspx’);"), para agregar el
nombre de una función, en el ejemplo AbrePagina , del lado del cliente definida
en un bloque script.
1- Ejemplo
utilizando RegisterStartupScript
Lo que haremos, será
agregar el script del cliente en el evento clic de un control asp Button. Lo
que hará el código es agregar el script al final de la página de origen, lo que
hará que este se ejecute como si siempre hubiese estado allí.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim pClientScript As String pClientScript = "<script language=vbScript> " pClientScript += " window.open " & Chr(34) & "Pagina5.aspx" & Chr(34) & _ "," & Chr(34) & "_blank" & Chr(34) & "," & Chr(34) & "width=510,height=360,left=200,top=250" & Chr(34) pClientScript += " </script>" RegisterStartupScript("PaginaDestino", pClientScript) End Sub
El código anterior,
genera el siguiente código en la página html antes de la etiqueta
</FORM>:
<SCRIPT language=vbScript> 'window.open
"PaginaTres.aspx","_blank","width=510,height=360,left=200,top=250"
</SCRIPT>
<script language=vbScript> 'window.open
"Pagina5.aspx","_blank","width=510,height=360,left=200,top=250"
</script>
Conclusiones
Como se puede ver,
existen diferentes maneras de navegar entre formularios web. El usar una u otra
técnica dependerá del escenario que estemos enfrentando. Por ejemplo, si
nuestro requerimiento involucra manejar las características de la ventana a la
que estamos navegando, necesariamente tendremos que utilizar una técnica que
considere código del lado del cliente. Siempre estas técnicas se podrán complementar
con otras alternativas que pueden dar un aspecto más profesional a nuestros
desarrollos y que dependen del ingenio del desarrollador. Por ejemplo podríamos
implementar un método de navegación con controles de usuario (.ascx) más el
método Response.Redirect (se incluye el código en los ejemplos). Con esta
técnica, se tiene una sola página donde se van cargando los distintos
formularios (controles .ascx) en un control PlaceHolder dependiendo por ejemplo
de una parámetro que se pase en la llamada: Response.Redirect("default.aspx?Pagina=Pagina1.ascx”)
Si bien en la mayoría de los casos se podrá resolver la navegación con
Response.Redirect o con Window.Open, es recomendable estudiar y practicar con
las técnicas antes descritas, ya que en ciertas situaciones nos ayudarán a
resolver nuestro problema de manera más eficiente.
|