ASP.NET 控制項開發人員長期依賴 ViewState 與 控制項狀態 來跨請求保持狀態資訊。預設情況下,這些資料會序列化為 Base64 編碼字串,以隱藏欄位形式嵌入頁面 HTML 中,隨表單回傳至伺服器再還原。雖然 HTTP 協定本質上是無狀態的,但這項機制讓開發者能輕鬆構建豐富的互動體驗。
ASP.NET 2.0 開放了頁面狀態儲存位置與方式的自訂能力。若想避免在用戶端與伺服器間來回傳遞大量資料,可改用伺服器端 Session 儲存。框架內建兩種持久化器:
選擇時需權衡:隱藏欄位不佔伺服器記憶體,但會增加頁面體積;Session 雖能精簡頁面,卻需考慮擴展性(可搭配 SQL Server Session State 實現 Web Farm 架構)。
只需在頁面類別中覆寫 PageStatePersister 屬性,回傳 SessionPageStatePersister 實例即可。下列程式碼示範一個包含大量資料繫結 GridView 的頁面,採用 Session 儲存 ViewState:
<%@ Page Language="C#" %>
<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(i.ToString());
GridView1.DataSource = list;
GridView1.DataBind();
}
}
</script>
<html xmlns="https://www.w3.org/1999/xhtml">
<head runat="server"><title>Session ViewState Demo</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>
此範例將 1000 筆資料繫結至 GridView,若使用預設隱藏欄位,頁面大小將顯著膨脹;改用 Session 持久化後,HTML 體積大幅縮減,提升傳輸效能。
ASP.NET 2.0 的頁面狀態持久化架構採用 Provider 模式,開發者可依據應用場景(如行動裝置頻寬限制、Web Farm 部署需求)靈活切換或自行實作 PageStatePersister 衍生類別,實現最佳化的狀態管理策略。