| 方案 | 適用範圍 | 資料類型 | 安全性 | 生命週期 | 典型場景 |
|---|---|---|---|---|---|
| QueryString | 頁面間 | 簡單字串/數值 | 低 (明文、可竄改) | 單次請求 | 分頁、搜尋條件、資料識別碼傳遞 |
| Application | 全站所有使用者 | 任意物件 | 中 (需 Lock/Unlock) | 應用程式存活期間 | 全站公告、線上人數統計、共用快取 |
| Session | 單一使用者會話 | 任意物件 | 高 (伺服器端儲存) | 逾時/瀏覽器關閉 | 購物車、登入狀態、多步驟精靈表單 |
Protected Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click
Dim url As String = "b.aspx?name=" & Server.UrlEncode(lblName.Text)
Response.Redirect(url)
End Sub
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not IsPostBack Then
Dim name As String = Request.QueryString("name")
If Not String.IsNullOrEmpty(name) Then
lblDisplay.Text = Server.UrlDecode(name)
End If
End If
End Sub
注意:必須使用 Server.UrlEncode/UrlDecode 處理特殊字元;長度限制約 2KB (IE);敏感資料嚴禁使用。
Protected Sub btnSet_Click(sender As Object, e As EventArgs) Handles btnSet.Click
Application.Lock()
Application("GlobalMessage") = txtMessage.Text
Application.UnLock()
Server.Transfer("b.aspx") ' 保持同一請求,不換網址
End Sub
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Application.Lock()
Dim msg As String = CStr(Application("GlobalMessage"))
Application.UnLock()
lblDisplay.Text = msg
End Sub
關鍵點:Lock/UnLock 防止多執行緒競爭;Server.Transfer 保持同一請求上下文;資料對**所有使用者**可見,不適合個人化資料。
Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Session("UserName") = txtName.Text
Session("ShoppingCart") = cartObject ' 可存放複雜物件
Response.Redirect("b.aspx")
End Sub
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not IsPostBack Then
Dim name As String = CStr(Session("UserName"))
Dim cart As ShoppingCart = CType(Session("ShoppingCart"), ShoppingCart)
lblWelcome.Text = "Welcome, " & name
End If
End Sub
效能警示:Session 預設 InProc 儲存於記憶體,大量使用者且存放大物件會導致記憶體壓力、GC 頻繁、甚至回收。生產環境建議改用 StateServer 或 SQLServer 模式 (參考 web.config <sessionState> 設定)。
PostBackUrl 屬性導向目標頁,目標頁用 PreviousPage 存取來源頁控制項 (FindControl)。Server.Transfer 時共用同一 HttpContext,可用 Context.Items("Key") = Value 傳遞請求級資料。QueryString、Application、Session 是 ASP.NET 跨頁面傳值的三大基石,各有適用邊界。實務開發中常**組合使用**:QueryString 傳遞識別碼,Session 維護使用者狀態,Application/Cache 共享全站資料。理解其生命週期、範圍、同步機制與效能特性,才能做出正確架構決策。