In ASP.NET, ViewState has always been a problem because it occupies a large amount of space in the client's HTML and is repeatedly passed to the network with the PostBack of the page. But in fact, ViewState can be stored anywhere in the database, cache, etc., thus avoiding frequent sending of lengthy base64 strings to the client. Doing so can not only significantly improve performance (significantly reducing the number of bytes transmitted over the network), but also prevent the content from being easily decrypted and cracked. Therefore this method is very useful.
A simple example is written below, using cache as the ViewState storage destination. As for the cached Key, what is given in the article is just a simple writing method, and a strict plan can be given according to the situation.
The code is roughly demonstrated as follows:
<%@ Page language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<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;
using System.Data;
using System.IO;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace LinkedList
{
/// <summary>
/// Summary description of SaveViewStateToOther.
/// </summary>
public class SaveViewStateToOther : Page
{
protected DataGrid DataGrid1;
private void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
Bind();
}
private void Bind()
{
DataTable table = 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 = table;
DataGrid1.DataBind();
}
#region Code generated by Web Form Designer
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();
StringWriter writer = 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);
else
Cache[PageKey] = vsText;
}
public string 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);
}
return null;
}
private void DataGrid1_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
Bind();
}
}
}
For actual applications, if you want to decide to apply this solution throughout the entire program, it is more appropriate to use a common page base class in which to implement this mechanism.
Source: Kinoho BLOG