En ASP.NET, ViewState siempre ha sido un problema porque ocupa una gran cantidad de espacio en el HTML del cliente y se pasa repetidamente a la red con el PostBack de la página. Pero, de hecho, ViewState se puede almacenar en cualquier lugar de la base de datos, caché, etc., evitando así el envío frecuente de largas cadenas base64 al cliente. Hacerlo no sólo puede mejorar significativamente el rendimiento (reduciendo significativamente la cantidad de bytes transmitidos a través de la red), sino también evitar que el contenido se descifre y descifre fácilmente. Por tanto este método es muy útil.
A continuación se escribe un ejemplo simple, utilizando el caché como destino de almacenamiento de ViewState. En cuanto a la clave almacenada en caché, lo que se proporciona en el artículo es solo un método de escritura simple y se puede brindar un plan estricto de acuerdo con la situación.
El código se demuestra aproximadamente de la siguiente manera:
<%@ Page language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transicional//ES" >
<html>
<cabeza>
<título>Guardar estado de vista en otro</título>
<meta nombre="GENERADOR" Contenido="Microsoft Visual Studio .NET 7.1">
<meta nombre="CODE_LANGUAGE" Contenido="C#">
<meta nombre=vs_defaultClientScript contenido="JavaScript">
<meta nombre=vs_targetSchema content=" http://schemas.microsoft.com/intellisense/ie5 ">
</cabeza>
<cuerpo MS_POSITIONING="GridLayout">
<form id="Form1" método="post" runat="servidor"><asp:DataGrid id=DataGrid1 estilo="ÍNDICE Z: 101; IZQUIERDA: 104px; POSICIÓN: absoluta; ARRIBA: 72px" runat="servidor " BorderColor="#3366CC" BorderStyle="Ninguno" BorderWidth="1px" BackColor="White" CellPadding="4" PageSize="6" AllowPaging="True">
<selecteditemstyle font-bold="True" forecolor="#CCFF99" backcolor="#009999">
</SelectedItemStyle>
<itemstyle forecolor="#003399" backcolor="Blanco">
</ItemStyle>
<headerstyle font-bold="True" forecolor="#CCCCFF" backcolor="#003399">
</HeaderStyle>
<footerstyle forecolor="#003399" backcolor="#99CCCC">
</FooterStyle>
<pagerstyle horizontalalign="Left" forecolor="#003399" backcolor="#99CCCC" pagebuttoncount="20" mode="NumericPages">
</PagerStyle>
</asp:DataGrid>
</form>
</cuerpo>
</html>
usando Sistema;
usando System.Data;
usando System.IO;
usando System.Text;
utilizando System.Web.UI;
usando System.Web.UI.WebControls
espacio de nombres LinkedList
;
{
/// <resumen>
/// Descripción resumida de SaveViewStateToOther.
/// </summary>
clase pública SaveViewStateToOther: Página
{
DataGrid protegido DataGrid1
vacío privado Page_Load (remitente del objeto, EventArgs e)
{
si (!IsPostBack)
Unir();
}
enlace vacío privado()
{
Tabla de datos = nueva tabla de datos();
table.Columns.Add("id", tipo de (int));
table.Columns.Add("nombre", tipo de (cadena));
para (int i = 0; i < 1000; i++)
{
Fila DataRow = tabla.NewRow();
fila["id"] = yo;
fila["nombre"] = "estudiante_" + i.ToString();
tabla.Rows.Add(fila);
}
DataGrid1.DataSource = tabla;
DataGrid1.DataBind();
}
#región Código generado por Web Form Designer
anulación protegida void OnInit(EventArgs e)
{
InicializarComponente();
base.OnInit(e);
}
vacío privado InitializeComponent()
{
this.DataGrid1.PageIndexChanged += nuevo System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
protected anula void SavePageStateToPersistenceMedium(object viewState)
{
Formato LosFormatter = nuevo LosFormatter();
Escritor StringWriter = nuevo StringWriter();
format.Serialize(escritor, viewState);
cadena vsRaw = escritor.ToString();
byte[] buffer = Convert.FromBase64String(vsRaw);
cadena vsText = Codificación.ASCII.GetString (
objeto de búfer v = Caché [PageKey]);
si (v == nulo)
Cache.Insert(PageKey, vsText);
demás
Caché[PageKey] = vsText;
}
cadena pública PageKey
{
obtener {return Session.SessionID + "_page_SaveViewStateToOther_aspx";
}
objeto de anulación protegido LoadPageStateFromPersistenceMedium()
{
objeto s = Caché[PageKey];
si (s! = nulo)
{
estado de cadena = s.ToString();
byte[] buffer = Codificación.ASCII.GetBytes(estado);
cadena vsRaw = Convert.ToBase64String(búfer);
Formateador LosFormatter = nuevo LosFormatter();
devolver formateador.Deserialize(vsRaw);
}
devolver nulo;
}
privado vacío DataGrid1_PageIndexChanged (fuente del objeto, DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
Unir();
}
}
}
Para aplicaciones reales, si desea decidir aplicar esta solución en todo el programa, es más apropiado utilizar una clase base de página común en la que implementar este mecanismo.
Fuente: BLOG de Kinoho