Técnicas de Navegacion entre Web Forms ASP.NET Fecha: 30/Abr/2005 (24/04/2005)
|
Introducción
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 SubObservació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 SubLa 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.aspxPrivate Sub ImageButton1_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ImageButton1.ClickServer.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 SubObservació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 SubObservació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 SubEl 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.
Fichero con el código de ejemplo: lveliz_TecnicasNavegacionNET.zip - 44,8 KB