Almacenamiento y recuperación de parámetros en Sesión y ViewState


Muchas veces necesitamos utilizar parámetros entre distintos métodos de un mismo formulario web, o incluso entre formularios distintos. Una forma dinámica de realizar este intercambio de datos es la utilización del ViewState y del espacio de sesión.

Antes de embarcarnos a almacenar datos y datos en estos dos espacios de memoria, hay que dejar claras dos cosas:

  • El ViewState se intercambia continuamente entre cliente y servidor, por lo que es aconsejable no sobrecargarlo. Al aumentar el ViewState, aumentará el tamaño de la página, y por consiguiente, el tráfico de datos y la velocidad de carga de la misma.
  • La sesión se almacena en servidor, por lo que si nuestro sitio web posee una carga de datos moderada – alta, el rendimiento del mismo se verá penalizado. Nuevamente, es aconsejable utilizar con cautela este espacio de memoria.

Teniendo claros estos dos conceptos, utilizaremos el ViewState para almacenar datos locales (de una misma página) y la sesión para pasar parámetros entre distintas páginas sin hacer uso de la QueryString. Para los profanos en la materia, explicaremos que la QueryString es la colección de parámetros que pueden, opcionalmente, acompañar a la dirección de la página. Éstos parámetros ofrecen información directamente recopilable por nuestro formulario web, pero cuenta con la desventaja de que es visible para el usuario.

Un ejemplo de QueryString sería, por ejemplo, la siguiente:

http://danigarcia.org/?tag=sql-server

En ella se está indicando que la variable ‘tag’ cuenta con el valor ‘sql-server’. En nuestra aplicación, podríamos recoger el valor de esa variable de la siguiente forma:


string recurso = (string)Request.QueryString.Get("tag");

En este momento, la variable recurso almacenaría el valor ‘sql-server’, valor que podríamos usar para realizar una consulta a base de datos. También podemos insertar más de un valor en la QUeryString, concatenando los variables en la forma:

http://danigarcia.org/?p=274&preview=true

Aquí podríamos acceder a dos variables: ‘p‘ y ‘preview‘.

Dejando a un lado el funcionamiento de la QueryString, si lo que realmente quisiéramos es ocultar esta información, podremos hacer uso de la sesión para recuperar los valores entre distintas páginas.

ViewState

El objetivo de almacenar datos en el ViewState es el de mantener el estado de una variable en la página de forma permanente, a modo de variable global, entre distintas llamadas a servidor. Para acceder a la variable dentro del ViewState, realizaríamos un acceso de la siguiente manera:


// Almacenar un valor
ViewState["variableEntera"] = 3;

// Recuperar un valor
int entero = (int)ViewState["variableEntera"];

Para simplificar el acceso, es aconsejable encapsularlo dentro de una property, de la siguiente manera:


private int entero
{
get { return (int)ViewState["variableEntera"]; }
set { ViewState["variableEntera"] = value; }
}

De este modo, podremos realizar asignaciones y recuperaciones de forma completamente natural:


entero = 3;
int otroEntero = entero;

Hay que comentar, no obstante, el requisito indispensable para almacenar un dato en el ViewState: el tipo del objeto a almacenar debe poseer la propiedad [Serializable()], es decir, ha de poder “comprimirse” como una cadena de texto. Muchos de los tipos preestablecidos soportan la serialización, pero en el caso de que creemos una nueva clase que queramos serializar, deberá declararse del siguiente modo:


[Serializable()]
public class miClase
{
// Contenido de la clase
}

Session

Otra forma de intercambiar datos, pero esta vez entre distintos formularios (lo cual no impide que también permita el acceso desde la propia página que crea la variable) es el uso de las variables de sesión. La forma de utilizar la sesión es la misma que la del ViewState:


// Almacenar un valor
Session["variableEntera"] = 3;

// Recuperar un valor
int entero = (int)Session["variableEntera"];

Nuevamente, encapsulando la funcionalidad dentro de una property, ganaremos en claridad:


private int entero
{
get { return (int)Session["variableEntera"]; }
set { Session["variableEntera"] = value; }
}

Así, un uso práctico de la sesión sería la de obtener el ID de un elemento seleccionado en un grid, almacenarlo en sesión y redirigir a una página en la que se tratará ese mismo elemento. Para ello, se recuperará la variable de sesión y posteriormente se eliminará (lo cual es muy aconsejable, pero no obligatorio, ya que podemos mantener en sesión, por ejemplo, el identificador del usuario que está logado en la aplicación, y acceder contínuamente a esta variable para comprobar, por ejemplo, permisos).

PAGINA 1


int idUsuario;
idUsuario = DAO.ConsultarUsuario(login, password);

Session["idUsuario"] = idUsuario;

// Redireccionamos
Response.Redirect("Pagina2.aspx");

PAGINA 2


// Property que encapsula la variable almacenada en el ViewState
private int idUsuario
{
get { return (int)ViewState["variableEntera"]; }
set { ViewState["variableEntera"] = value; }
}

// ...

// Carga de la página
protected void Page_Load(object sender, EventArgs e)
{
// Si es la carga inicial...
if(!IsPostBack)
{
// Comprobamos que la variable de sesión 'idUsuario' existe
if(Session["idUsuario"] != null)
{
// Pasamos el ID de usuario al ViewState, que permanecerá en la página local
idUsuario = (int)Session["idUsuario"];

// Eliminamos el ID de usuario de sesión
Session["idUsuario"] = null;
}
}
}

One comment

  1. Muy buen artículo, claro y conciso. Me ha sido de gran ayuda, sobre todo la parte de encapsular la funcionalidad con get y set. Gracias.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s