一、超鏈接導航(用戶主動)
- HTML ``
- 服務端控件 `` —— 可後台動態修改 `NavigateUrl`。
二、服務端編程導航(代碼控制)
| 方法 | 運行位置 | 地址欄變化 | 數據傳遞 | 性能/適用場景 |
| Response.Redirect | 客戶端(302 跳轉) | 變為新 URL | QueryString 可攜帶 | 兩次請求,跨域/跨服務器,非 ASPX 資源 |
| Server.Transfer | 服務端 | 不變(隱藏轉向) | 默認不傳遞,`preserveForm=true` 可保留 Form/QueryString | 單次請求,同服務器 ASPX 間,需目標頁 `EnableViewStateMac=false` |
| Server.Execute | 服務端 | 不變 | 可訪問源頁面 Form/QueryString | 類似函數調用,捕獲輸出插入當前頁,需 `EnableViewStateMac=false` |
三、代碼示例
Response.Redirect
Response.Redirect("Target.aspx?id=123");
Server.Transfer(保留表單)
Server.Transfer("Target.aspx", true); // 保留 Form/QueryString
// 目標頁面頁面指令:<%@ Page EnableViewStateMac="false" %>
Server.Execute(捕獲輸出)
StringWriter sw = new StringWriter();
Server.Execute("Target.aspx", sw);
Literal1.Text = sw.ToString(); // 將目標頁輸出插入當前頁指定位置
四、選擇決策樹
- 用戶決定何時去哪 → **超鏈接 / HyperLink**。
- 程序決定去哪,用戶觸發 → **HyperLink 動態 NavigateUrl**。
- 跳轉到**其他服務器/非 ASPX** → **Response.Redirect**。
- 同服務器 ASPX 間,**性能優先、隱藏真實路徑** → **Server.Transfer**。
- 需要**組合多個頁面輸出**(如母版頁局部填充) → **Server.Execute**。
- 要求**輸出合法 HTML**(單一 ``/``) → **Response.Redirect**。
五、常見坑提醒
- `Server.Transfer`/`Execute` 後頁面可能包含多組 `` 導致瀏覽器渲染異常,IE 容錯較好但其他瀏覽器可能亂碼。
- `EnableViewStateMac=false` 降低安全性,僅在可信內部系統使用。
- `Response.Redirect` 會拋出 `ThreadAbortException`,`catch` 時需注意不吞噬該異常(或用 `Response.Redirect(url, false)` + `Context.ApplicationInstance.CompleteRequest()`)。