ASP.NET 提供多種頁面間資料傳遞機制,各有適用場景、容量限制、安全性考量。選錯方式會導致效能低落、資料外洩、維護困難。本文系統整理九大方法,附上比較表、程式碼範例與選型建議。
| 方法 | 儲存位置 | 容量 | 生命週期 | 適用場景 | 安全性 |
|---|---|---|---|---|---|
| QueryString (GET) | URL | ~2KB | 單次請求 | 簡單、少量、可書籤參數 | 低(明文、可被攔截) |
| Form Post | Request Body | 無限制 | 單次請求 | 大量資料、檔案上傳、敏感資訊 | 中(HTTPS 下較安全) |
| HttpContext.Handler | 伺服器記憶體 | 無限制 | 單次請求 | 頁面間傳遞複雜物件 | 高(不暴露客戶端) |
| Cookie | 客戶端瀏覽器 | 4KB/個,20個/網域 | 自訂/瀏覽器關閉 | 使用者偏好、記住我、跨頁面少量資料 | 低(可被竄改、XSS 風險) |
| Session | 伺服器記憶體/資料庫/Redis | 視提供者而定 | 逾時預設 20 分鐘 | 使用者登入狀態、購物車、個人化設定 | 高(伺服器端) |
| Cache | 伺服器記憶體 | 視記憶體而定 | 應用程式存活/相依/過期 | 全站共用、讀多寫少、昂貴計算結果 | 高 |
| Application | 伺服器記憶體 | 視記憶體而定 | 應用程式存活 | 全站全域共用、計數器、設定值 | 高 |
| ViewState | 頁面隱藏欄位 | 建議 < 100KB | 單頁 Postback | 頁面內控制項狀態保持 | 中(可加密、但體積增大) |
| Static 靜態變數 | AppDomain 記憶體 | 視記憶體而定 | 應用程式存活 | 唯讀共用資料、單例服務 | 高(但易造成併發問題) |
// 來源頁
Response.Redirect("Target.aspx?id=123&name=Tom");
// 目標頁
string id = Request.QueryString["id"]; // 建議明確指定集合
// 避免 Request["id"] 遍歷所有集合影響效能
// 來源頁:表單提交或 Server.Transfer
// 目標頁
string val = Request.Form["fieldName"];
// 檔案上傳
HttpPostedFile file = Request.Files["file1"];
// 來源頁需設定 public property
public string UserName { get; set; }
// 目標頁
if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
{
SourcePage src = PreviousPage as SourcePage;
string name = src.UserName;
}
// 寫入
Response.Cookies["pref"]["theme"] = "dark";
Response.Cookies["pref"].Expires = DateTime.Now.AddDays(30);
// 讀取
if (Request.Cookies["pref"] != null)
string theme = Request.Cookies["pref"]["theme"];
Session["UserId"] = 12345;
int uid = (int)Session["UserId"]; // 需轉型
Cache["ProductList"] = GetProducts(); // 可設定相依、過期、優先權
// 讀取
var list = Cache["ProductList"] as List;
Application["OnlineCount"] = 0;
// Global.asax Session_Start
Application.Lock();
Application["OnlineCount"] = (int)Application["OnlineCount"] + 1;
Application.UnLock();
ViewState["SortExpr"] = "Name DESC";
string expr = ViewState["SortExpr"]?.ToString();
public class AppConfig { public static readonly string ConnStr = "..."; }
// 僅適合唯讀、執行期不變更的資料
Request["key"] 會依序搜尋 QueryString、Form、Cookies、ServerVariables,建議明確使用 Request.QueryString["key"] 等。EnableViewState="false"),或改用 Session/Cache 儲存大型資料集。HttpOnly=true、Secure=true(HTTPS)、SameSite=Lax 降低 XSS/CSRF 風險。沒有萬用的傳遞方式,只有最適合當前情境的選擇。建立專案層級的「資料傳遞規範文件」,明確規定各情境採用何種機制,能有效降低維護成本與安全風險。