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

ASP.NET 頁面間傳值五大方法完整比較與實作

     編輯:ASP.NET 基礎

ASP.NET Web Forms 開發中,頁面間傳遞資料是基礎且關鍵的技術。本文系統整理五種主流傳值方式:QueryString、Session、Server.Transfer、Application、PostBack (Cross-Page Posting),詳細比較適用場景、優缺點、安全性與程式碼實作,並針對 MasterPage 情境下的 PreviousPage 失效問題提供解決方案。

方法比較總覽

方法資料可見性資料型別支援生命週期適用場景
QueryStringURL 明文可見字串單次請求簡單參數、書籤分享、SEO 需求
Session伺服器端,用戶不可見任意物件跨頁面、跨請求 (逾期前)使用者狀態、購物車、多步驟精靈
Server.TransferURL 不變,用戶不可見任意物件 (透過 PreviousPage)單次伺服器端轉向同一應用程式內頁面流程控制
Application伺服器端,全域共享任意物件應用程式存活期間全站公告、快取資料、計數器
Cross-Page Post表單隱藏欄位字串/表單欄位單次 PostBack表單驗證後導向、Wizard 步驟

1. QueryString - 最簡單但最不安全

發送端

protected void btnSend_Click(object sender, EventArgs e)
{
    string url = $"Default2.aspx?username={Server.UrlEncode(txtName.Text)}&email={Server.UrlEncode(txtEmail.Text)}";
    Response.Redirect(url);
}

接收端

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        lblName.Text  = Request.QueryString["username"];
        lblEmail.Text = Request.QueryString["email"];
    }
}

優點: 實作簡單、支援書籤、可被搜尋引擎索引。
缺點: 長度限制 (~2KB)、明文暴露敏感資訊、易遭竄改、不支援複雜物件。

2. Session - 最常用的跨頁面狀態管理

發送端

protected void btnSend_Click(object sender, EventArgs e)
{
    Session["UserName"] = txtName.Text;
    Session["Email"]    = txtEmail.Text;
    Response.Redirect("Default2.aspx");
}

接收端

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        lblName.Text  = Session["UserName"]?.ToString();
        lblEmail.Text = Session["Email"]?.ToString();
        
        // 用畢清理,釋放資源
        Session.Remove("UserName");
        Session.Remove("Email");
    }
}

注意: 大量資料存放 Session 會消耗伺服器記憶體,建議搭配 Session.Clear() 或設定適當 timeout。

3. Server.Transfer + PreviousPage - 物件導向的伺服器端轉向

來源頁面

public partial class SourcePage : System.Web.UI.Page
{
    // 公開屬性供目標頁面存取
    public string UserName => txtName.Text;
    public string Email    => txtEmail.Text;

    protected void btnTransfer_Click(object sender, EventArgs e)
    {
        Server.Transfer("TargetPage.aspx");
    }
}

目標頁面

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // ASP.NET 2.0+ 強型別 PreviousPage
        SourcePage prev = PreviousPage as SourcePage;
        if (prev != null)
        {
            lblName.Text  = prev.UserName;
            lblEmail.Text = prev.Email;
        }
    }
}

優點: URL 不變、型別安全、可存取來源頁面任何 public 成員。
缺點: 僅限同一應用程式、使用 MasterPage 時 PreviousPage 為 null。

4. MasterPage 環境下的解決方案

當頁面套用 MasterPage 時,PreviousPage 屬性會失效。替代方案:

  • Session:最通用、最穩定
  • Context.Items:僅在單次請求管線內有效,Server.Transfer 時保留
    // 來源頁面
    Context.Items["UserName"] = txtName.Text;
    Server.Transfer("TargetPage.aspx");
    
    // 目標頁面
    lblName.Text = Context.Items["UserName"]?.ToString();
  • Cross-Page Posting:設定 `PostBackUrl="TargetPage.aspx"`,目標頁面用 `Request.Form["控制項ClientID"]` 取值

5. Application - 全域共享資料

// 寫入 (需鎖定)
Application.Lock();
Application["Announcement"] = "系統將於今晚維護";
Application.UnLock();

// 讀取
lblMsg.Text = Application["Announcement"]?.ToString();

適用: 全站公告、線上人數計數、共用快取資料。不適用: 使用者個人資料 (會互相覆蓋)。

最佳實務建議

  1. 敏感資料:絕對不可用 QueryString,優先用 Session 或加密 Token。
  2. 大型物件:避免存入 Session,改用資料庫 + Session 存 ID,或分散式快取。
  3. MasterPage 專案:統一採用 Session 或 Context.Items,避免 PreviousPage 陷阱。
  4. 安全性:所有接收端皆需驗證資料有效性、型別、長度,防禦 XSS 與注入攻擊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved