頁面導向是 Web 開發核心操作。本文深度剖析三大伺服器端導向方法的機制、差異與選型指南。
| 特性 | Response.Redirect | Server.Transfer | Server.Execute |
|---|---|---|---|
| 執行位置 | 客戶端 (HTTP 302) | 伺服器端 | 伺服器端 |
| 網路往返 | 2 次 (舊頁→302→新頁) | 1 次 | 1 次 |
| 瀏覽器 URL | 變更為新頁面 | 保持原頁面 | 保持原頁面 |
| 資料保留 | Request/ViewState 遺失 | 保留 Request/Session | 保留 Request/Session |
| 跨應用程式 | 支援 (含外部網站) | 僅同應用程式 | 僅同應用程式 |
| 驗證/授權 | 重新觸發 | 繞過 (可能繞過登入頁) | 繞過 |
| HTML 合法性 | 單一完整 HTML | 可能產生多個 <html> (非 IE 錯誤) | 同 Transfer |
| 執行流程 | 新請求完整生命週期 | 移交控制權,不返回 | 像函式調用,執行完返回 |
Response.RedirectServer.Transfer
3. 需將另一頁面輸出嵌入當前頁面 (元件化/共用區塊)、執行完返回繼續 → Server.Execute
4. 導向靜態 HTML / 非 .aspx → Response.Redirect (Transfer/Execute 僅支援 .aspx)
5. 需保留 QueryString 傳遞參數 → Response.Redirect("B.aspx?" + Request.QueryString)
| 陷阱 | 現象 | 對策 |
|---|---|---|
| Transfer 繞過 Forms 認證 | 未登入用戶直接 Transfer 到需登入頁面,未跳轉登入頁 | 目標頁面 Page_Load 手動檢查 Context.User.Identity.IsAuthenticated |
| Transfer 後 Refresh 重複提交 | 用戶 F5 重新整理,瀏覽器重送原請求,再次 Transfer | 改用 Redirect (PRG 模式) 或 Transfer 後立即 Redirect |
| Execute 產生巢狀 <form> | 兩個頁面都有 <form runat="server">,輸出巢狀 form 非法 HTML | 被執行頁面移除 form 標籤,或改用 UserControl/Partial View |
| Redirect 中文 QueryString 亂碼 | URL 含中文參數,接收端解碼錯誤 | Server.UrlEncode("中文") 編碼後再 Redirect |
string msg = Server.UrlEncode("歡迎來到競賽專欄");
Response.Redirect("WebForm2.aspx?msg=" + msg);
// 接收端:Server.UrlDecode(Request.QueryString["msg"])
理解本質機制,才能在架構層面做正確決策,避免安全漏洞、效能浪費與使用者體驗缺失。