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

ASP.NET 頁面間傳遞資料的九大方法完整比較指南

     編輯:ASP.NET 基礎

前言

ASP.NET 提供多種頁面間資料傳遞機制,各有適用場景、容量限制、安全性考量。選錯方式會導致效能低落、資料外洩、維護困難。本文系統整理九大方法,附上比較表、程式碼範例與選型建議。

九大傳遞方法總覽

方法儲存位置容量生命週期適用場景安全性
QueryString (GET)URL~2KB單次請求簡單、少量、可書籤參數低(明文、可被攔截)
Form PostRequest Body無限制單次請求大量資料、檔案上傳、敏感資訊中(HTTPS 下較安全)
HttpContext.Handler伺服器記憶體無限制單次請求頁面間傳遞複雜物件高(不暴露客戶端)
Cookie客戶端瀏覽器4KB/個,20個/網域自訂/瀏覽器關閉使用者偏好、記住我、跨頁面少量資料低(可被竄改、XSS 風險)
Session伺服器記憶體/資料庫/Redis視提供者而定逾時預設 20 分鐘使用者登入狀態、購物車、個人化設定高(伺服器端)
Cache伺服器記憶體視記憶體而定應用程式存活/相依/過期全站共用、讀多寫少、昂貴計算結果高
Application伺服器記憶體視記憶體而定應用程式存活全站全域共用、計數器、設定值高
ViewState頁面隱藏欄位建議 < 100KB單頁 Postback頁面內控制項狀態保持中(可加密、但體積增大)
Static 靜態變數AppDomain 記憶體視記憶體而定應用程式存活唯讀共用資料、單例服務高(但易造成併發問題)

核心程式碼範例

1. QueryString

// 來源頁
Response.Redirect("Target.aspx?id=123&name=Tom");

// 目標頁
string id = Request.QueryString["id"]; // 建議明確指定集合
// 避免 Request["id"] 遍歷所有集合影響效能

2. Form Post

// 來源頁:表單提交或 Server.Transfer
// 目標頁
string val = Request.Form["fieldName"];
// 檔案上傳
HttpPostedFile file = Request.Files["file1"];

3. HttpContext.Handler (PreviousPage)

// 來源頁需設定 public property
public string UserName { get; set; }

// 目標頁
if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
{
    SourcePage src = PreviousPage as SourcePage;
    string name = src.UserName;
}

4. Cookie

// 寫入
Response.Cookies["pref"]["theme"] = "dark";
Response.Cookies["pref"].Expires = DateTime.Now.AddDays(30);

// 讀取
if (Request.Cookies["pref"] != null)
    string theme = Request.Cookies["pref"]["theme"];

5. Session

Session["UserId"] = 12345;
int uid = (int)Session["UserId"]; // 需轉型

6. Cache

Cache["ProductList"] = GetProducts(); // 可設定相依、過期、優先權
// 讀取
var list = Cache["ProductList"] as List;

7. Application

Application["OnlineCount"] = 0;
// Global.asax Session_Start
Application.Lock();
Application["OnlineCount"] = (int)Application["OnlineCount"] + 1;
Application.UnLock();

8. ViewState

ViewState["SortExpr"] = "Name DESC";
string expr = ViewState["SortExpr"]?.ToString();

9. Static

public class AppConfig { public static readonly string ConnStr = "..."; }
// 僅適合唯讀、執行期不變更的資料

選型決策樹

  1. 資料是否敏感? → 是 → 排除 QueryString、Cookie、ViewState。
  2. 資料大小? > 4KB → 排除 Cookie;> 100KB → 排除 ViewState。
  3. 生命週期?單次請求 → QueryString、Form、PreviousPage;跨請求同一使用者 → Session、Cookie;全站共用 → Cache、Application、Static。
  4. 資料結構?複雜物件 → Session、Cache、Application、PreviousPage;簡單值 → 皆可。
  5. 效能考量?頻繁讀取、昂貴計算 → Cache;極高併發唯讀 → Static。

常見誤區與最佳實踐

  • 濫用 Session:大量資料塞入 Session 導致記憶體暴漲,應改用 Cache 或資料庫暫存。
  • Request[] 效能:Request["key"] 會依序搜尋 QueryString、Form、Cookies、ServerVariables,建議明確使用 Request.QueryString["key"] 等。
  • ViewState 膨脹:關閉不需要的控制項 ViewState(EnableViewState="false"),或改用 Session/Cache 儲存大型資料集。
  • Static 併發:靜態變數跨所有使用者共享,寫入時必須加鎖,否則資料竄改風險極高。
  • Cookie 安全:設定 HttpOnly=true、Secure=true(HTTPS)、SameSite=Lax 降低 XSS/CSRF 風險。

總結

沒有萬用的傳遞方式,只有最適合當前情境的選擇。建立專案層級的「資料傳遞規範文件」,明確規定各情境採用何種機制,能有效降低維護成本與安全風險。

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