Técnicas de Navegación entre Web Forms en ASP .Net
Por Luis Alberto Véliz
Contenido
Introducción
Técnicas de Navegación entre Páginas
Conclusiones
Introducción
Un aspecto importante en la construcción de aplicaciones Web es la navegación entra páginas y el uso de links, que en conjunto unen las páginas de nuestra aplicación haciendo de ésta un todo. Si esto no fuera así, tendríamos páginas aisladas que no se podrían comunicar entre sí. 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
Navegación con el Control HiperLink
Esta técnica permite navegar hasta otra página HTML, ASP ó 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 click desde el servidor para controlar la navegación desde código, se puede utilizar un control de servidor Button, LinkButton ó ImageButton más el objeto Response.
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 introduce el siguiente código 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. 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.
Utilizando el método Server.Transfer
El método Server.Transfer sólo 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, puesto 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. Observa el siguiente ejemplo:
'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.
Utilizando el método Server.Execute
El método Server.Execute sólo 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 que se exhibe deabajo puedes observar el uso de esta técnica utilizando el método sobrecargado Server.Execute(String, TextWriter); éste muestra el contenido de la página de destino en un control Literal de la página de origen.
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) Literal1.Text = pContenidoPaginaDestino.ToString End Sub
Observación: Al igual que cuando se utiliza Server.Transfer y se mantienen los datos del estado de la página de origen, es necesario incorporar la directiva de página EnableViewStateMac=”false” para deshabilitar el hashing del ViewState.
Utilizando el método de script del lado del cliente Window.Open
Esta técnica permite navegar a páginas HTML ó 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 el 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 sólo existe en el lado del cliente (DOM).
Hay varios métodos para llamar a un script del lado del cliente desde código del lado del servidor. En esta ocasión abordaremos 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 (la cual no veremos en este artículo) consiste en 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.
Ejemplo utilizando RegisterStartupScript
Agregaremos el script del cliente en el evento click 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) & _ "PaginaTres.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 ejemplo 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 >
Conclusiones
Como puedes 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.
Estas técnicas podrán siempre complementarse 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. 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(“defaultaspx?PAGINA=Principal”).
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.
Luis Alberto Véliz Guajardo es Ingeniero Electrónico y grado académico de Licenciado en Ciencias de la Ingeniería Electrónica. Trabaja como Gerente de Tecnología en Santiago, Chile, y ha adoptado las tecnologías de Microsoft para dar soluciones a los procesos internos y aplicaciones para sus clientes. Lleva más de 10 años ligado a la tecnología, desde la programación de microprocesadores en lenguaje Assembler y de controles automáticos de procesos con algoritmos desarrollados en C; desarrollos para equipos portátiles y aplicaciones de más alto nivel en Web y Windows. Ha obtenido 3 Estrellas del programa Desarrollador Cinco Estrellas de Microsoft MSDN.