首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 跨頁面傳值三大經典方案:QueryString、Application、Session

     編輯:關於ASP.NET

方案比較總覽

方案適用範圍資料類型安全性生命週期典型場景
QueryString頁面間簡單字串/數值低 (明文、可竄改)單次請求分頁、搜尋條件、資料識別碼傳遞
Application全站所有使用者任意物件中 (需 Lock/Unlock)應用程式存活期間全站公告、線上人數統計、共用快取
Session單一使用者會話任意物件高 (伺服器端儲存)逾時/瀏覽器關閉購物車、登入狀態、多步驟精靈表單

1. QueryString - 最簡單的頁面間傳值

來源頁面 (a.aspx)

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

目標頁面 (b.aspx)

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);敏感資料嚴禁使用。

2. Application - 全域共享狀態

寫入 (a.aspx)

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

讀取 (b.aspx)

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 保持同一請求上下文;資料對**所有使用者**可見,不適合個人化資料。

3. Session - 個人化會話狀態

寫入 (a.aspx)

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

讀取 (b.aspx)

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> 設定)。

進階方案補充

  • Cross-Page Posting:PostBackUrl 屬性導向目標頁,目標頁用 PreviousPage 存取來源頁控制項 (FindControl)。
  • Context.Items:Server.Transfer 時共用同一 HttpContext,可用 Context.Items("Key") = Value 傳遞請求級資料。
  • Cookie:用戶端持久化,適合「記住我」等長期偏好設定。
  • Profile / ViewState / ControlState:針對特定層級狀態管理。

選型決策樹

  1. 資料是否敏感?→ 是 → Session / 加密 Cookie / Server-side 儲存。
  2. 資料是否需跨使用者共享?→ 是 → Application / Cache / 資料庫。
  3. 資料是否僅單次頁面跳轉使用?→ 是 → QueryString / Context.Items (Transfer)。
  4. 資料結構複雜 (物件/集合)?→ Session / Cache / 资料庫 + ID 傳遞。
  5. 需支援瀏覽器前進後退不丟失?→ QueryString / ViewState / Client-side 儲存。

結語

QueryString、Application、Session 是 ASP.NET 跨頁面傳值的三大基石,各有適用邊界。實務開發中常**組合使用**:QueryString 傳遞識別碼,Session 維護使用者狀態,Application/Cache 共享全站資料。理解其生命週期、範圍、同步機制與效能特性,才能做出正確架構決策。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved