Dans ASP.NET, ViewState a toujours été un problème car il occupe une grande quantité d'espace dans le HTML du client et est transmis à plusieurs reprises au réseau avec le PostBack de la page. Mais en fait, ViewState peut être stocké n'importe où dans la base de données, le cache, etc., évitant ainsi l'envoi fréquent de longues chaînes base64 au client. Cela peut non seulement améliorer considérablement les performances (en réduisant considérablement le nombre d'octets transmis sur le réseau), mais également empêcher le contenu d'être facilement déchiffré et craqué. Cette méthode est donc très utile.
Un exemple simple est écrit ci-dessous, utilisant le cache comme destination de stockage ViewState. Quant à la clé mise en cache, ce qui est donné dans l'article n'est qu'une simple méthode d'écriture, et un plan strict peut être donné en fonction de la situation.
Le code est grossièrement illustré comme suit :
<%@ Page language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<tête>
<titre>Enregistrer l'état de la vue vers un autre</titre>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<méta name="CODE_LANGUAGE" Content="C#">
<meta name=vs_defaultClientScript content="JavaScript">
<meta name=vs_targetSchema content=" http://schemas.microsoft.com/intellisense/ie5 ">
</tête>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server"><asp:DataGrid id=DataGrid1 style="Z-INDEX : 101 ; GAUCHE : 104 px ; POSITION : absolue ; HAUT : 72 px" runat="server " BorderColor="#3366CC" BorderStyle="Aucun" BorderWidth="1px" BackColor="Blanc" CellPadding="4" PageSize="6" AllowPaging="True">
<selecteditemstyle font-bold="True" forecolor="#CCFF99" backcolor="#009999">
</SelectedItemStyle>
<itemstyle forecolor="#003399" backcolor="Blanc">
</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">
</Style de page>
</asp:DataGrid>
</form>
</corps>
</html>
en utilisant le système ;
en utilisant System.Data ;
en utilisant System.IO ;
en utilisant System.Text ;
en utilisant System.Web.UI ;
en utilisant System.Web.UI.WebControls,
espace de noms LinkedList ;
{
/// <résumé>
/// Description récapitulative de SaveViewStateToOther.
/// </summary>
classe publique SaveViewStateToOther : Page
{
DataGrid protégé DataGrid1 ;
privé vide Page_Load (expéditeur d'objet, EventArgs e)
{
si (!IsPostBack)
Lier();
}
privé vide Bind()
{
Table DataTable = new DataTable();
table.Columns.Add("id", typeof (int));
table.Columns.Add("nom", typeof (string));
pour (int i = 0; i < 1000; i++)
{
Ligne DataRow = table.NewRow();
rangée["id"] = je;
row["name"] = "student_" + i.ToString();
table.Rows.Add(ligne);
}
DataGrid1.DataSource = table ;
DataGrid1.DataBind();
}
#region Code généré par Web Form Designer
protected override void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
vide privé InitializeComponent()
{
this.DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
protected override void SavePageStateToPersistenceMedium(object viewState)
{
Format LosFormatter = new LosFormatter();
StringWriter écrivain = new StringWriter();
format.Serialize(écrivain, viewState);
string vsRaw = écrivain.ToString();
byte[] buffer = Convert.FromBase64String(vsRaw);
chaîne vsText = Encoding.ASCII.GetString(buffer);
objet v = Cache[PageKey];
si (v == nul)
Cache.Insert(PageKey, vsText);
autre
Cache[PageKey] = vsText ;
}
chaîne publique PageKey
{
get { return Session.SessionID + "_page_SaveViewStateToOther_aspx" };
}
objet de remplacement protégé LoadPageStateFromPersistenceMedium()
{
objet s = Cache[PageKey];
si (s != nul)
{
état de chaîne = s.ToString();
byte[] buffer = Encoding.ASCII.GetBytes(state);
chaîne vsRaw = Convert.ToBase64String(buffer);
Formateur LosFormatter = new LosFormatter();
return formateur.Deserialize(vsRaw);
}
renvoie null ;
}
private void DataGrid1_PageIndexChanged (source de l'objet, DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex ;
Lier();
}
}
}
Pour les applications réelles, si vous souhaitez décider d'appliquer cette solution à l'ensemble du programme, il est plus approprié d'utiliser une classe de base de page commune dans laquelle implémenter ce mécanisme.
Source : BLOG Kinoho