ASP.NET 控件的開發人員利用 ViewState 和控件狀態來保持浏覽器發出的各 請求之間的狀態信息。通常,該信息作為由頁面呈現的 HTML 標記中的隱藏字段 傳送給客戶端。然後,該頁面狀態作為下一個窗體提交的一部分傳回服務器並還 原給控件或頁面。即使浏覽器使用 HTTP 協議(該協議定義為無狀態),但利用臨 時存儲狀態信息的功能,控件的開發人員能夠輕松地提供更豐富的應用程序體驗 。
ASP.NET 2.0 允許您修改臨時保持頁面狀態的位置和方式。在某些情況下, 避免在客戶端與服務器之間往返傳送數據可能更為可取。ASP.NET 2.0 提供的兩 個頁面狀態持續程序分別是 HiddenFieldPageState 持續程序(我們已提到過)和 SessionPageStatePersister。SessionPageStatePersister 利用與浏覽器會話 相關的服務器會話存儲數據。使用 SessionPageStatePersister 有正反兩個方 面。對於發送到(自)浏覽器的頁面而言,使用會話(而非隱藏字段)可以避免其大 小的增加。在許多情況中,頁面狀態是全部標記的一個重要部分。然而,在會話 中存儲數據將占用寶貴的服務器資源。此外,隱藏字段不像會話那樣具有相關的 超時。您可以配置一個應用程序,以便將會話保持到後端數據庫,並避免將負載 直接加到 Web 服務器。這也將擴展至 Web 場方案。
要使用除默認持續程序之外的持續程序,需要重寫該頁的 PageStatePersister 屬性,並返回另一個持續程序的一個實例。首先,下面的 一個簡單頁面只使用大量數字填充一個 ArrayList,然後將它綁定到一個 GridView 控件。
以下是引用片段:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected override PageStatePersister PageStatePersister {
get {
return new SessionPageStatePersister(this);
}
}
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
if (!IsPostBack) {
ArrayList list = new ArrayList();
for (int i = 0; i < 1000; i++)
{
list.Add(Convert.ToString(i));
}
GridView1.DataSource = list;
GridView1.DataBind();
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Submit" /></div>
</form>
</body>
</html>