В ASP.NET ViewState всегда был проблемой, поскольку он занимал большой объем пространства в HTML-коде клиента и неоднократно передавался в сеть вместе с PostBack страницы. Но на самом деле ViewState можно хранить где угодно в базе данных, кеше и т. д., что позволяет избежать частой отправки клиенту длинных строк base64. Это может не только значительно повысить производительность (значительно уменьшив количество байтов, передаваемых по сети), но и предотвратить легкую расшифровку и взлом контента. Поэтому этот метод очень полезен.
Ниже приведен простой пример использования кеша в качестве места хранения ViewState. Что касается кэшированного ключа, то то, что приведено в статье, — это всего лишь простой метод записи, и строгий план может быть дан в зависимости от ситуации.
Код примерно демонстрируется следующим образом:
<%@ Page Language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<голова>
<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 ">
</голова>
<body MS_POSITIONING="GridLayout">
<form id="Form1" метод="post" runat="server"><asp:DataGrid id=DataGrid1 style="Z-INDEX: 101; СЛЕВА: 104 пикселя; ПОЛОЖЕНИЕ: абсолютное; ВЕРХУ: 72 пикселя" runat="server " BorderColor="#3366CC" BorderStyle="Нет" 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 Horizontalign="Left" forecolor="#003399" backcolor="#99CCCC" pagebuttoncount="20" mode="NumericPages">
</ПейджерСтиль>
</asp:DataGrid>
</form>
</тело>
</html>
с помощью системы;
использование System.Data;
использование System.IO;
использование System.Text;
использование System.Web.UI;
пространства имен
System.Web.UI.WebControls LinkedList;
{
/// <сводка>
/// Краткое описание SaveViewStateToOther.
/// </сводка>
общедоступный класс SaveViewStateToOther: страница
{
защищенный DataGrid DataGrid1;
частный void Page_Load (отправитель объекта, EventArgs e)
{
если (!IsPostBack)
Связывать();
}
частная пустота Bind()
{
Таблица DataTable = новый DataTable();
table.Columns.Add("id", typeof (int));
table.Columns.Add("name", typeof (string));
for (int i = 0; i < 1000; i++)
{
Строка DataRow = table.NewRow();
строка["id"] = я;
row["name"] = "student_" + i.ToString();
таблица.Rows.Add(строка);
}
DataGrid1.DataSource = таблица;
DataGrid1.DataBind();
}
#region Код, созданный веб-дизайнером веб-форм,
защищенное переопределение void OnInit (EventArgs e)
{
ИнициализироватьКомпонент();
base.OnInit(е);
}
частная пустота InitializeComponent()
{
this.DataGrid1.PageIndexChanged += новый System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load }
#endregion
protected
override void SavePageStateToPersistenceMedium(object viewState);
{
Формат LosFormatter = новый LosFormatter();
Автор StringWriter = новый StringWriter();
format.Serialize(писатель, viewState);
строка vsRaw = Writer.ToString();
буфер byte[] = Convert.FromBase64String(vsRaw);
строка vsText = Encoding.ASCII.GetString(буфер
объект v = Cache[PageKey]);
если (v == ноль)
Cache.Insert(PageKey, vsText);
еще
Кэш[PageKey] = vsText;
}
публичная строка PageKey
{
get { return Session.SessionID + "_page_SaveViewStateToOther_aspx" };
}
защищенный объект переопределения LoadPageStateFromPersistenceMedium()
{
объект s = Кэш[PageKey];
если (s != ноль)
{
состояние строки = s.ToString();
буфер byte[] = Encoding.ASCII.GetBytes(state);
строка vsRaw = Convert.ToBase64String(буфер);
Средство форматирования LosFormatter = новый LosFormatter();
вернуть форматтер.Deserialize(vsRaw);
}
вернуть ноль;
}
Private void DataGrid1_PageIndexChanged (источник объекта, DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
Связывать();
}
}
}
В реальных приложениях, если вы хотите применить это решение ко всей программе, более уместно использовать общий базовый класс страницы, в котором можно реализовать этот механизм.
Источник: БЛОГ Кинохо