El Protocolo de transferencia de hipertexto (HTTP) es un protocolo sin estado. Cuando el cliente se desconecta del servidor, el motor ASP.NET descarta el objeto de página. De esta manera, cada aplicación web puede escalarse para atender una gran cantidad de solicitudes simultáneamente sin agotar la memoria del servidor.
Sin embargo, se necesita alguna técnica para almacenar la información entre solicitudes y recuperarla cuando sea necesario. Esta información se llama estado, que son los valores actuales de todos los controles y variables utilizados por el usuario actual en la sesión actual.
ASP.NET gestiona cuatro estados:
ver estado
estado de control
estado de sesión
Estado de la solicitud
El estado de vista es el estado de la página y todos sus controles. Se mantiene sin cambios a través de los comentarios del marco ASP.NET.
Cuando se devuelve una página al cliente, las propiedades y controles de estos cambios de página se determinan y almacenan en el valor de un campo de entrada oculto llamado _VIEWSTATE. Cuando la página se vuelve a publicar, el campo _VIEWSTATE se envía al servidor con la solicitud HTTP.
El estado de visualización se puede habilitar o deshabilitar para:
Aplicación completa : establezca la propiedad EnableViewState de la sección en el archivo web.config.
Una página : establezca la propiedad EnableViewState del comando de página en <%@ Page Language="C#" EnableViewState="false" %>
Un control : establece la propiedad control.EnableViewState.
Para ello, utiliza un objeto de estado de vista, que está definido por una clase StateBag definida por un conjunto de elementos de estado de vista. StateBag es una estructura de datos que contiene pares de valores de propiedad y se almacena como una cadena asociada con un objeto.
La clase StateBag tiene las siguientes propiedades:
propiedad | describir |
---|---|
Artículo (nombre) | El valor del estado de la vista con el nombre especificado, que es la propiedad predeterminada de StateBag. |
Contar | El nombre del elemento en la colección de estado. |
Llaves | Una colección de claves para todos los elementos de la colección. |
Valores | La colección de valores para todos los elementos de la colección. |
La clase StateBag tiene los siguientes métodos:
método | describir |
---|---|
Agregar (nombre, valor) | Agrega un elemento a la colección viewstate y actualiza los elementos existentes. |
Claro | Elimina todos los elementos de la colección. |
Igual a(Objeto) | Determina si el objeto especificado es igual al objeto actual. |
Finalizar | Permite liberar recursos y realizar otras operaciones de limpieza. |
ObtenerEnumerador | Devuelve un contador de pares clave/valor para objetos StateItem duplicados almacenados en el objeto StateBag. |
Obtener tipo | Obtenga el tipo de instancia actual. |
IsItemDirty | Verifique el objeto almacenado en StateBag para confirmar si ha sido modificado. |
Eliminar (nombre) | Eliminar elementos personalizados. |
Establecer sucio | Establece el estado del objeto StateBag y la propiedad Dirty de cada objeto StateItem contenido. |
Establecer artículo sucio | Establece la propiedad Dirty para el objeto StateItem especificado en el objeto StateBag. |
Para cadena | Devuelve una cadena que representa el objeto del paquete de estado. |
El siguiente ejemplo ilustra el concepto de cadenas que almacenan el estado de la vista.
Mantengamos un contador que se pueda incrementar cada vez que se vuelva a llamar a la página haciendo clic en un botón de la página. El control de etiqueta muestra el valor del contador.
El código del archivo de etiqueta se ve así:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body></html>
El archivo de código subyacente para esta instancia se ve así:
public partial class _Default : System.Web.UI.Page{ public int counter { get { if (ViewState["pcounter"] != null) { return ((int)ViewState["pcounter"]); } else { return 0; } } set { ViewState["pcounter"] = value; } } protected void Page_Load(object sender, EventArgs e) { lblCounter.Text = counter.ToString(); counter++; }}
Producirá los siguientes resultados:
El estado de control no se puede modificar, acceder ni desactivar directamente.
Cuando un usuario se conecta a un sitio web ASP.NET, se crea un nuevo objeto de sesión. Cuando el estado de la sesión está habilitado, se crea un nuevo estado de sesión para cada nueva solicitud. Este objeto de estado de sesión pasa a formar parte del entorno de ejecución y está disponible a través de la página.
El estado de sesión se utiliza normalmente para almacenar datos de aplicaciones como inventario, listas de proveedores, registros de clientes o carritos de compras. Puede almacenar la información del usuario y su información de preferencias, y guardar las rutas indecisas del usuario.
Las sesiones se identifican y rastrean mediante un SessionID de 120 bits, que se pasa del cliente al servidor y se devuelve como una cookie o una URL modificada. SessionID es globalmente único y aleatorio.
Los objetos de estado de sesión son creados por la clase HttpSessionState, que define una colección de elementos de estado de sesión.
La clase HttpSessionState tiene las siguientes propiedades:
propiedad | describir |
---|---|
ID de sesión | Identificador de sesión único. |
Artículo (nombre) | El valor del elemento de estado de la sesión con el nombre especificado, que es la propiedad predeterminada de la clase HttpSessionState. |
Contar | El número de elementos de la colección de estado de sesión. |
Se acabó el tiempo | Obtiene y establece la cantidad de tiempo, en minutos, permitido entre solicitudes antes de que el proveedor detenga el estado de la sesión. |
La clase HttpSessionState tiene los siguientes métodos:
método | describir |
---|---|
Agregar (nombre, valor) | Agrega nuevos elementos a la colección de estados de sesión. |
Claro | Elimina todos los elementos de la colección de estados de sesión. |
Eliminar (nombre) | Elimina el elemento especificado de la colección de estados de sesión. |
Eliminar todo | Elimina todas las claves y valores de la colección de estados de sesión. |
Eliminar en | Elimina el elemento en el índice especificado de la colección de estados de sesión. |
Un objeto de estado de sesión es un par nombre-valor que puede almacenar y recuperar información de un objeto de estado de sesión. De igual forma, puedes utilizar el siguiente código:
void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}
El código anterior solo almacena cadenas en el objeto de diccionario de sesión; sin embargo, puede almacenar todos los tipos de datos primitivos y matrices compuestas por tipos de datos primitivos, objetos DataSet, DataTable, HashTable e Image, así como cualquier objeto definido por el usuario que herede de Objetos serializables.
El siguiente ejemplo ilustra el concepto de almacenar el estado de la sesión. Hay dos botones en la página: un botón de cuadro de texto para ingresar una cadena y un botón de etiqueta para mostrar el texto almacenado de la última sesión. El código del archivo de etiqueta se ve así:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <asp:Label ID="lblstr" runat="server" Text="Enter a String" > </asp:Label> </td> <td> <asp:TextBox ID="txtstr" runat="server"> </asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Button ID="btnnrm" runat="server" Text="No action button" /> </td> <td> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblsession" runat="server" > </asp:Label> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td> </td> </tr> </table> </div> </form> </body></html>
Debería verse así en la vista de diseño:
El código de fondo es el siguiente:
public partial class _Default : System.Web.UI.Page { String mystr; protected void Page_Load(object sender, EventArgs e) { this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } protected void btnstr_Click(object sender, EventArgs e) { this.mystr = this.txtstr.Text; this.Session["str"] = this.txtstr.Text; this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; }}
Ejecute el archivo y observe cómo se ejecuta:
Una aplicación ASP.NET es una colección de todas las páginas web, códigos y otros archivos en un único directorio virtual en un servidor web. Cuando la información se almacena en el estado de la aplicación, está disponible para todos los usuarios.
Para proporcionar el uso del estado de la aplicación, ASP.NET crea un objeto de estado de la aplicación para cada aplicación desde la clase HttpApplicationState y almacena el objeto en la memoria del servidor. Este objeto está representado por el archivo de clase global.asax.
El estado de la aplicación se utiliza principalmente para almacenar contadores, otras estadísticas y todos los datos de la aplicación, como tasas impositivas y de descuento, y para almacenar la ruta del usuario al sitio web.
La clase HttpApplicationState tiene las siguientes propiedades:
propiedad | describir |
---|---|
Artículo (nombre) | El valor de la entrada de la aplicación con el nombre especificado, que es la propiedad predeterminada de HttpApplicationState. |
Contar | El número de elementos de la colección de estado de la aplicación. |
La clase HttpApplicationState tiene los siguientes métodos:
método | describir |
---|---|
Agregar (nombre, valor) | Agrega nuevos elementos a la colección de estados de la aplicación. |
Claro | Elimina todos los elementos de la colección de estado de la aplicación. |
Eliminar (nombre) | Elimina el elemento especificado de la colección de estado de la aplicación. |
Eliminar todo | Elimina todos los objetos de una colección HttpApplicationState. |
Eliminar en | Elimina un objeto HttpApplicationState de la colección encontrada por el índice. |
Cerrar con llave() | Bloquee la colección de estados de la aplicación para que solo el usuario actual pueda acceder a ella. |
Descubrir() | Desbloquee la colección de estados de la aplicación para que todos los usuarios puedan acceder a ella. |
Los datos del estado de la aplicación normalmente los mantienen controladores escritos para eventos:
Se abre la aplicación
La aplicación finaliza
error de aplicación
Comienza la sesión
sesión terminada
El siguiente fragmento de código muestra la sintaxis básica para almacenar información del estado de la aplicación:
Void Application_Start(object sender, EventArgs e){ Application["startMessage"] = "The application has started.";}Void Application_End(object sender, EventArgs e){ Application["endtMessage"] = "The application has ended.";}