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

ASP.NET 頁面間傳值完整指南:PreviousPage、QueryString、Session、Context、Cross-Page Postback 實戰比較

     編輯:關於ASP.NET

ASP.NET Web Forms 頁面間傳遞資料有多種方式,各有適用場景與優缺點。本文系統比較 **Cross-Page Postback (PreviousPage)**、`QueryString`、`Session`、`Context.Items`、`Server.Transfer`、`Cookie`、`ViewState` 跨頁面等 7 大方法,附程式碼範例與選擇指南。

方法比較總表

方法資料型別生命週期可見性適用場景缺點
PreviousPage (Cross-Page Postback)控制項值單次請求URL 不變表單提交到另一頁、Wizard 步驟緊耦合來源頁面控制項 ID、需 Postback
QueryString字串單次請求URL 可見簡單參數傳遞、書籤分享、SEO長度限制、不安全、不可傳複雜物件
Session任意物件跨請求 (逾時前)伺服器端購物車、多步驟精靈、使用者狀態記憶體壓力、需序列化、Web Farm 需共享 Session
Context.Items任意物件單次請求 (含 Transfer)伺服器端`Server.Transfer` 內部傳遞大量資料Redirect 失效、僅限同一請求管線
Server.Transfer整個頁面上下文單次請求URL 不變內部頁面跳轉、保留表單資料瀏覽器網址列不同步、書籤失效
Cookie字串持久化 (設定過期)客戶端可見記住我、偏好設定、追蹤大小限制 4KB、可被竄改/停用
Cache/Application任意物件全域/依策略伺服器端共用資料、快取非用戶專屬、需鎖定同步

1. Cross-Page Postback (PreviousPage) - 原文重點

來源頁面 (Source.aspx) 按鈕設定 `PostBackUrl="~/Target.aspx"`:






目標頁面 (Target.aspx) 使用 `PreviousPage` 強型別存取:


public partial class Target : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack && PreviousPage != null)
        {
            // 強型別轉型 (需在 Source.aspx 加入 <%@ PreviousPageType VirtualPath="~/Source.aspx" %>)
            var source = PreviousPage as Source;
            if (source != null)
            {
                lblResult.Text = $"姓名: {source.txtName.Text}, 日期: {source.calDate.SelectedDate:d}";
            }
            else
            {
                // 弱型別 FindControl (不需 PreviousPageType)
                var txt = PreviousPage.FindControl("txtName") as TextBox;
                var cal = PreviousPage.FindControl("calDate") as Calendar;
                lblResult.Text = $"姓名: {txt?.Text}, 日期: {cal?.SelectedDate:d}";
            }
        }
    }
}

**關鍵**:來源頁面加入 `<%@ PreviousPageType VirtualPath="~/Source.aspx" %>` 即可獲得強型別 `PreviousPage`,享受 IntelliSense 與編譯時期檢查。

2. QueryString - 最通用


// 來源頁
Response.Redirect($"Target.aspx?name={Server.UrlEncode(txtName.Text)}&date={calDate.SelectedDate:yyyy-MM-dd}");

// 目標頁
string name = Request.QueryString["name"];
DateTime date = DateTime.Parse(Request.QueryString["date"]);

優點:可書籤、可分享、支援 GET、無伺服器狀態。缺點:敏感資料不可用、長度 ~2KB。

3. Session - 跨請求狀態


// 來源頁
Session["WizardData"] = new WizardModel { Name = txtName.Text, Date = calDate.SelectedDate };
Response.Redirect("Target.aspx");

// 目標頁
var model = Session["WizardData"] as WizardModel;
if (model != null) { ... }
Session.Remove("WizardData"); // 用完即刪

4. Context.Items + Server.Transfer - 內部高效傳遞


// 來源頁
Context.Items["BigData"] = hugeDataTable;
Server.Transfer("Target.aspx"); // URL 不變,同一請求管線

// 目標頁
var data = Context.Items["BigData"] as DataTable;

優點:避免序列化、大物件高效傳遞、URL 不變。缺點:Redirect 失效、瀏覽器網址列不同步。

5. 現代化替代:ASP.NET Core / MVC 模式

Web FormsMVC / Core
PostBackUrl / PreviousPageController Action 參數繫結、TempData (Redirect 後保留一請求)
SessionSession / IDistributedCache (Redis)
QueryStringRoute Data / Query String / Model Binding
Context.Items`HttpContext.Items` (Middleware 間傳遞)
Server.Transfer不存在,改用內部服務呼叫或重新設計流程

選擇決策樹

  1. **敏感資料/大物件/多步驟精靈** → Session / TempData
  2. **簡單參數/可書籤/SEO** → QueryString / Route Data
  3. **內部頁面跳轉/保留表單/高效能** → Server.Transfer + Context.Items
  4. **表單提交到另一頁/需驗證來源頁控制項** → Cross-Page Postback (PreviousPage)
  5. **持久化偏好/追蹤** → Cookie

安全性提醒

  • **QueryString/Cookie/表單資料皆可被竄改**,伺服器端務必驗證授權與資料完整性
  • **Session 劫持風險**:使用 HTTPS、HttpOnly Cookie、定期重新生成 Session ID
  • **Cross-Page Postback**:驗證 `PreviousPage.IsCrossPagePostBack` 確認來源合法

理解各種傳值機制的生命週期、可見度、耦合度,能根據業務需求選擇最適合的方案,避免濫用 Session 導致擴展性問題。

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