ASP.NET では、ViewState がクライアントの HTML 内で大量のスペースを占有し、ページのポストバックで繰り返しネットワークに渡されるため、常に問題となってきました。しかし実際には、ViewState はデータベースやキャッシュなどのどこにでも保存できるため、長い Base64 文字列をクライアントに頻繁に送信する必要がなくなります。そうすることで、パフォーマンスが大幅に向上する (ネットワーク経由で送信されるバイト数が大幅に減少する) だけでなく、コンテンツが簡単に復号化されたりクラックされたりするのを防ぐことができます。したがって、この方法は非常に便利です。
ViewState の保存先としてキャッシュを使用する簡単な例を以下に示します。キャッシュされたKeyについては、記事で挙げているのはあくまで簡単な記述方法であり、状況に応じて厳密な計画を立てることができます。
コードは大まかに次のように示されます。
<%@ Page language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<頭>
<title>ViewStateToOther に保存</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: 絶対; 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>
<pagerstylehorizontalalign="Left" forecolor="#003399" backcolor="#99CCCC" pagebuttoncount="20" mode="NumericPages">
</PagerStyle>
</asp:DataGrid>
</form>
</body>
</html>
システムを使用します。
System.Data を使用します。
System.IO を使用します。
System.Text を使用します。
System.Web.UI を使用します。
System.Web.UI.WebControls
名前空間 LinkedList
を使用します。
{
/// <概要>
/// SaveViewStateToOther の概要説明。
/// </概要>
パブリック クラス SaveViewStateToOther : ページ
{
protected DataGrid DataGrid1;
private void Page_Load(オブジェクト送信者、EventArgs e)
{
if (!IsPostBack)
バインド();
プライベート
void Bind()
{
DataTable テーブル = 新しい DataTable();
table.Columns.Add("id", typeof (int));
table.Columns.Add("名前", typeof (文字列));
for (int i = 0; i < 1000; i++)
{
DataRow 行 = table.NewRow();
行["id"] = i;
row["名前"] = "student_" + i.ToString();
table.Rows.Add(行);
}
DataGrid1.DataSource = テーブル;
DataGrid1.DataBind();
#region
Web フォーム デザイナーによって生成されたコード
protected override void OnInit(EventArgs e)
{
InitializeComponent();
Base.OnInit(e);
プライベート
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 形式 = new LosFormatter();
StringWriter ライター = new StringWriter();
format.Serialize(writer, viewState);
文字列 vsRaw = Writer.ToString();
byte[] バッファ = Convert.FromBase64String(vsRaw);
文字列 vsText = Encoding.ASCII.GetString(buffer);
オブジェクト v = キャッシュ [PageKey];
if (v == null)
Cache.Insert(PageKey, vsText);
それ以外
キャッシュ[ページキー] = vsText;
文字
列 PageKey
{
get { return Session.SessionID + "_page_SaveViewStateToOther_aspx";
保護されたオーバーライド オブジェクト LoadPageStateFromPersistenceMedium(
)
{
オブジェクト s = キャッシュ[ページキー];
if (s != null)
{
文字列状態 = s.ToString();
byte[] バッファ = Encoding.ASCII.GetBytes(state);
文字列 vsRaw = Convert.ToBase64String(buffer);
LosFormatter フォーマッタ = new LosFormatter();
戻りフォーマッタ.Deserialize(vsRaw);
}
null を返します。
private void DataGrid1_PageIndexChanged(オブジェクト ソース、DataGridPageChangedEventArgs e
)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
バインド();
}
}
}
実際のアプリケーションでは、このソリューションをプログラム全体に適用することを決定したい場合は、このメカニズムを実装する共通のページ基本クラスを使用する方が適切です。
出典:きのほBLOG