Siguiendo con nuestro ejemplo anterior Desarrollo de Aplicaciones Web con ASP.Net, en esta ocasion veremos como mantener el estado en nuestra aplicación. Pero ¿que significa esto? Empezemos.
Al ejecutar la página de nuestro ejemplo, podemos observar que se mantiene el texto dentro el TextBox y se modifica sólo la etiqueta con el resultado.
ASP.Net realiza esto automaticamente, utilizando lo que se denomina ViewState. El ViewState almacena la información para poder restablecerlos en cada PostBack, permitiendo que el usuario solo vea los cambios y no deba ingresar toda la información nuevamente en cada ida y vuelta desde el servidor. Esta información se guarda en el mismo HTML de la página.
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTIxMjM5MTIwODgPZBYCAgMPZBYCAgkPDxYCHgRUZXh0BQlIb2xhIG1pa2VkZG
ScRXerPjcjyJEGhNowb8cy5205lg==" />
div>
Para que ASP.Net pueda mantener el estado, es necesario que cada control tengo la propiedad EnableViewState en True (establecido por default).
A continuación explicaré como funciona: cuando el usuario reliza un PostBack (click sobre algún boton o cualquier otro control), ASP.Net recibe el pedido y crea una nueva página. ASP.Net toma la información oculta en el campo de estado de la página anterior y asigna los valores a los campos de la nueva página. A continuación se produce el evento Page.Load y luego se procesan los eventos que dieron origen al PostBack. Una vez procesado los eventos, ASP.Net crea un HTML con el resutlado final de la ejecución de código y la envía al cliente nuevamente; luego se produce el evento Page.Unload en el que la página se descarta de la memoria del servidor. Lo cual quiere decir, que literalmente se olvida de todo lo que sabía de ese cliente hasta el momento. Este metodo de trabajo es muy eficiente ya que permite al servidor web atender miles de usuarios sin notar una perdida de rendimiento pero, si deseamos realizar aplicaciones que mantengan el estado entre cada petición desde el cliente, debemos usar alguna otra tecnica que nos permita almacenar algún tipo de información.
A continuación veremos algunas de ellas:
Una de las maneras que tenemos para almacenar información es utilizar el ViewState. El ViewState está disponible como una colección de valores a los cuales se puede acceder por clave.
Veamos un ejemplo del manejo del ViewSate. Tomando nuestro ejemplo anterior, supongamos que queremos saber cuántas veces precionamos el botón. Primero agregaremos un par de Labels más y agregamos una propiedad a la página para encapsular las llamadas a las variables del ViewState. De esta manera evitamos la confusión de nombres ya que, si nos equivocamos de clave, el ViewState automáticamente
Private Property peticiones() As Integer
Get
'retornamos el valor del ViewState
Return Convert.ToInt32(ViewState("Peticiones"))
End Get
Set(ByVal value As Integer)
'almacenamos el valor en el ViewState
ViewState("Peticiones") = value
End Set
End Property
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
peticiones = 0
lblClick.Text = peticiones
End If
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSaludar.Click
lblResultado.Text = "Hola " & txtNombre.Text
peticiones += 1
lblClick.Text = peticiones
End Sub
Y este sería el resultado:
Como podemos ver en la imagen, estamos manteniendo el estado con el ViewState almacenando la cantidad de peticiones realizados por el usuario.
Transfiriendo Información entre páginas
Cuando creamos una apliación con múltiples páginas, necesitaremos de alguna manera pasar la información a alguna otra para que pueda realizar su tarea. Dentro de ASP.Net podemos utilizar 2 técnicas básicas para ir a otra página:
- Utilizar un control Hyperlink
- Utilizar el método Redirect del objeto Response por código para redirigir al ASP.Net a esa página. Por ejemplo.
Response.Redirect("Default2.aspx")
Response.Redirect("Default2.aspx")
En ambos casos la nueva página no podrá acceder al ViewState de la página original para obtener los datos, ya que este es por página. Existen otras soluciones dentro las cuales estan: QueryString y Variables de Sesión.
Sin entrar en tanto detalle sobre el QueryString la mayoría de nosotros creo que ya abremos notado que muchas páginas tienen un signo de ? seguido de una secuencia de valores en pares Clave-Valor.
Para obtener los valores en la página de destino, debemos hacer uso del objeto Request y su propiedad QueryString.
Pero creo que un ejemplo explicara mejor el funcionamiento de este método. Primero agragamos una pagina mas a nuestro pequeño proyecto de ejemplo yo le llame ejemploQueryString.aspx.
Codigo VB.
En el Click del botón Saludar de la página Default agregamos:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSaludar.Click
'lblResultado.Text = "Hola " & txtNombre.Text
'peticiones += 1
'lblClick.Text = peticiones
'ejemplo de como usar el objeto request
Dim cadenaSaludo As String
cadenaSaludo = "?saludoQueryString=" & txtNombre.Text
Response.Redirect("ejemploQueryString.aspx" & cadenaSaludo)
End Sub
En el evento Load de nuestra página ejemploQueryString.aspx agregamos:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim saludo As String
saludo = Request.QueryString("saludoQueryString")
lblSaludo2.Text = saludo
End Sub
Variables de Sesión
El uso de variables de sesión para mantener el estado de la aplicación web es una de las herramientas más útiles. Esta información se almacena por cada usuario en particular y puede ser obtenida desde cualquier WebForm de la apliación a diferencia del ViewState, que es por cada página.
Una sesión comienza cuando del browser solicita una página por pimera vez y finaliza cuando explícitamente se llama al método Session.Abandon(), o bien el servidor no ha recibido pedidos (Request) de ese cliente en un período de tiempo determinado.
Cada variable de sesión es almacenada en el servidor a diferencia del ViewState, que se envia en un campo oculto al cliente. Utilizar variable de sesión es muy sencillo pero que mejor que un ejemplo para entender mejor como funciona. Modificando nuestro ejemplo original del ViewState, utilizamos la misma lógica con la diferencia que donde escribimos ViewState("peticiones"), lo remplazamos con Session("peticiones").
Codigo en VB
Private Property peticiones() As Integer
Get
'retornamos el valor del ViewState
'Return Convert.ToInt32(ViewState("Peticiones"))
'ejemplo del uso de variables de sesion
Return Convert.ToInt32(Session("Peticiones"))
End Get
Set(ByVal value As Integer)
'almacenamos el valor en el ViewState
'ViewState("Peticiones") = value
Session("Peticiones") = value
End Set
End Property
Solo quedaría ejecutar la página en el browser, escribimos cualquier nombre y presionamos el boton Saludar. El resultado es el mismo que cuando empleamos el ViewState. La diferencia radica en que se puede utilizar la información que se encuentra en la varaible de sesión desde cualquier página del sitio.
En los siguientes links pueden descargar los códigos de ejemplo tanto para VB.Net como para C#.Net.
Link VB
Link C#
Ya para terminar este post solo me quedaría comentar que estos métodos que vimos se pueden utilizar en conjunto para mejorar el performance de nuestra aplicación y no solo enfocarse en un solo método.
Nos veremos pronto


0 comentarios:
Publicar un comentario en la entrada