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.