一、GET - QueryString (最常用、可書籤)
// 來源頁
Response.Redirect($"Target.aspx?name={HttpUtility.UrlEncode(txtName.Text)}&email={txtEmail.Text}");
// 目標頁
string name = Request.QueryString["name"];
string email = Request.QueryString["email"];
- 優點:簡單、支援瀏覽器歷史/書籤/分享、無伺服器資源。
- 缺點:長度限制 (~2KB)、明文敏感資料、可被竄改。
二、POST - 表單跨頁面提交
<!-- 來源頁 -->
<form id="form1" runat="server" action="Target.aspx" method="post">
<asp:TextBox ID="txtUser" runat="server" />
<asp:Button ID="btnGo" runat="server" Text="送出" />
</form>
// 目標頁
string user = Request.Form["txtUser"]; // 或 Request["txtUser"]
- 注意:目標頁面**無法直接存取來源頁面控制項**,僅能讀取 `Request.Form`。
- 若需驗證 ViewState,來源與目標需共用 MachineKey 或關閉 `EnableViewStateMac` (不建議)。
三、Session (安全、大量資料、多步驟)
// 來源頁
Session["UserData"] = new UserModel { Name = "Tom", Age = 25 };
Response.Redirect("Step2.aspx");
// 目標頁
var data = Session["UserData"] as UserModel;
- 生命週期:Session Timeout (預設 20 分鐘) 或手動 `Session.Remove`。
- 叢集環境需設定 **StateServer / SQLServer / Redis** 模式。
四、Server.Transfer + Context.Items (同一請求、URL 不變)
// 來源頁
Context.Items["Token"] = Guid.NewGuid();
Server.Transfer("Target.aspx"); // 伺服器端轉向,瀏覽器 URL 仍為 Source.aspx
// 目標頁
var token = Context.Items["Token"];
- 優點:效能佳 (無重導)、可共享同一請求的物件實例。
- 缺點:URL 不變易造成使用者困惑、書籤失效、相對路徑錯誤。
五、Cookie (跨瀏覽器分頁、持久化)
// 寫入
var cookie = new HttpCookie("Pref", "DarkMode") { Expires = DateTime.Now.AddDays(30) };
Response.Cookies.Add(cookie);
// 讀取
string pref = Request.Cookies["Pref"]?.Value;
- 大小限制 4KB/個、每域名約 20-50 個、可被用戶停用/清除。
六、Application / Cache (全域共享、非使用者專屬)
Application["OnlineCount"] = 100; // 全域
Cache.Insert("Key", data, null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration);
- 不適合傳遞個人化資料,適用於設定、計數器、共享快取。
方式選型決策樹
- 需**書籤/分享/SEO** → **GET (QueryString)**
- **表單送出/修改/刪除/敏感資料** → **POST** (搭配 `PostBackUrl` 或 MVC Form)
- **多步驟精靈/大量物件/安全性優先** → **Session**
- **同一請求內轉向/效能極致** → **Server.Transfer + Context.Items**
- **跨分頁/長期偏好設定** → **Cookie**
- **全域設定/共享快取** → **Application / Cache**
安全性補充
- **QueryString/Form/Cookie** 皆可被竄改 → **後端必須驗證權限與資料合法性**。
- 敏感資料 (ID、Token) 傳遞前 **加密 (AES) 或簽章 (HMAC)**。
- 防止 CSRF:表單加入 `__RequestVerificationToken` (MVC `@Html.AntiForgeryToken()` / Web Forms `Page.ViewStateUserKey`)。