| 方式 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| QueryString (GET) | 少量非敏感資料、書籤分享 | 簡單、可書籤、支援瀏覽器前進後退 | 長度限制、明文、可被竄改 |
| Form POST | 表單送出、大量資料 | 無長度限制、不顯示網址 | ASP.NET 預設 PostBack 自身,跨頁需特殊處理 |
| Session | 用戶狀態、購物車、多步驟精靈 | 伺服端儲存、安全、容量大 | 消耗記憶體、需管理逾時、Web Farm 需共享 |
| Application | 全站計數器、快取共用資料 | 全域唯一、所有用戶可見 | 並發鎖爭用、不適合用戶專屬資料 |
| Cookie | 記住登入、偏好設定、追蹤 | 持久化、跨 Session 存活 | 大小 4KB、用戶可刪除/禁用、安全性風險 |
| Response.Redirect | 流程導向、帶少量參數 | 客戶端跳轉、URL 可見 | 兩次請求、參數明文 |
| Server.Transfer | 同一應用程式內大量參數傳遞、隱藏目標 URL | 單次請求、保留 Request/Context、可直接存取前頁面 public 屬性 | URL 不變、瀏覽器歷史無記錄、僅限同應用程式 |
// SourcePage.aspx.cs
public string StartDate { get { return txtStartDate.Text; } }
public string EndDate { get { return txtEndDate.Text; } }
protected void btnQuery_Click(object sender, EventArgs e) {
Server.Transfer("ResultPage.aspx");
}
// ResultPage.aspx.cs
protected void Page_Load(object sender, EventArgs e) {
SourcePage src = (SourcePage)Context.Handler;
Response.Write("Start: " + src.StartDate + "<br/>End: " + src.EndDate);
}
// 共用參數物件
public class QueryParams {
public string StartDate { get; set; }
public string EndDate { get; set; }
}
// 介面
public interface IQueryParams {
QueryParams Parameters { get; }
}
// 各查詢頁面實作介面
public class QueryPageA : Page, IQueryParams {
public QueryParams Parameters { get; private set; }
protected void btn_Click(object sender, EventArgs e) {
Parameters = new QueryParams { StartDate = txt1.Text, EndDate = txt2.Text };
Server.Transfer("ResultPage.aspx");
}
}
// 目標頁面通用處理
protected void Page_Load(object sender, EventArgs e) {
QueryParams p = new QueryParams();
if (Context.Handler is IQueryParams provider) {
p = provider.Parameters;
}
// 使用 p.StartDate, p.EndDate...
}
善用 Server.Transfer 搭配介面契約,能建構乾淨、強型別、可維護的多頁面協作架構。