In ASP.NET war ViewState schon immer ein Problem, da es viel Platz im HTML des Clients einnimmt und wiederholt mit dem PostBack der Seite an das Netzwerk übergeben wird. Tatsächlich kann ViewState jedoch an einer beliebigen Stelle in der Datenbank, im Cache usw. gespeichert werden, wodurch das häufige Senden langer Base64-Zeichenfolgen an den Client vermieden wird. Dies kann nicht nur die Leistung erheblich verbessern (und die Anzahl der über das Netzwerk übertragenen Bytes erheblich reduzieren), sondern auch verhindern, dass der Inhalt leicht entschlüsselt und geknackt wird. Daher ist diese Methode sehr nützlich.
Im Folgenden wird ein einfaches Beispiel beschrieben, bei dem der Cache als ViewState-Speicherziel verwendet wird. Was den zwischengespeicherten Schlüssel betrifft, so handelt es sich im Artikel lediglich um eine einfache Schreibmethode, und je nach Situation kann ein strenger Plan angegeben werden.
Der Code wird grob wie folgt demonstriert:
<%@ Page language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<Kopf>
<title>SaveViewStateToOther</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name=vs_defaultClientScript content="JavaScript">
<meta name=vs_targetSchema content=" http://schemas.microsoft.com/intellisense/ie5 ">
</head>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server"><asp:DataGrid id=DataGrid1 style="Z-INDEX: 101; LEFT: 104px; POSITION: absolute; TOP: 72px" runat="server " BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="4" PageSize="6" AllowPaging="True">
<selecteditemstyle font-bold="True" forecolor="#CCFF99" backcolor="#009999">
</SelectedItemStyle>
<itemstyle forecolor="#003399" backcolor="White">
</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>
</body>
</html>
using System;
Verwenden von System.Data;
mit System.IO;
Verwenden von System.Text;
mit System.Web.UI;
mit System.Web.UI.WebControls;
Namespace LinkedList
{
/// <Zusammenfassung>
/// Zusammenfassende Beschreibung von SaveViewStateToOther.
/// </summary>
öffentliche Klasse SaveViewStateToOther: Seite
{
protected DataGrid DataGrid1;
private void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
Binden();
}
private void Bind()
{
DataTable-Tabelle = new DataTable();
table.Columns.Add("id", typeof (int));
table.Columns.Add("name", typeof (string));
for (int i = 0; i < 1000; i++)
{
DataRow row = table.NewRow();
row["id"] = i;
row["name"] = "student_" + i.ToString();
table.Rows.Add(row);
}
DataGrid1.DataSource = Tabelle;
DataGrid1.DataBind();
}
#region Von Web Form Designer generierter Code
protected override void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void 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)
{
LosFormatter format = new LosFormatter();
StringWriterwriter = new StringWriter();
format.Serialize(writer, viewState);
string vsRaw =writer.ToString();
byte[] buffer = Convert.FromBase64String(vsRaw);
string vsText = Encoding.ASCII.GetString(buffer);
object v = Cache[PageKey];
if (v == null)
Cache.Insert(PageKey, vsText);
anders
Cache[PageKey] = vsText;
}
öffentliche Zeichenfolge PageKey
{
get { return Session.SessionID + "_page_SaveViewStateToOther_aspx";
}
protected override object LoadPageStateFromPersistenceMedium()
{
object s = Cache[PageKey];
if (s != null)
{
string state = s.ToString();
byte[] buffer = Encoding.ASCII.GetBytes(state);
string vsRaw = Convert.ToBase64String(buffer);
LosFormatter formatter = new LosFormatter();
return formatter.Deserialize(vsRaw);
}
null zurückgeben;
}
private void DataGrid1_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
Binden();
}
}
}
Wenn Sie sich für tatsächliche Anwendungen entscheiden möchten, diese Lösung im gesamten Programm anzuwenden, ist es sinnvoller, eine gemeinsame Seitenbasisklasse zu verwenden, in der dieser Mechanismus implementiert wird.
Quelle: Kinoho BLOG