問題背景
在 Action 或 Filter 中需要存取前一個 HTTP 請求的路由資料(Controller、Action、參數等)。
方案比較
| 方案 | 適用場景 | 生命週期 | 程式碼範例 |
| Session | 跨多個請求持久保存 | Session 過期前 | // 儲存
Session["PrevRouteData"] = RouteData;
// 讀取
var prev = Session["PrevRouteData"] as RouteData;
|
| TempData | 僅需在下一個請求可用(PRG 模式) | 下一請求讀取後自動刪除 | // 儲存
TempData["PrevRouteData"] = RouteData;
// 讀取
var prev = TempData["PrevRouteData"] as RouteData;
|
| 自訂 ActionFilter | 全域自動記錄,不侵入業務代碼 | 依實作而定 | public class RouteTrackerAttribute : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext) {
var prev = filterContext.HttpContext.Session["PrevRouteData"] as RouteData;
filterContext.Controller.ViewBag.PrevRoute = prev;
filterContext.HttpContext.Session["PrevRouteData"] = filterContext.RouteData;
}
}
|
注意事項
RouteData 包含 Values、DataTokens、Route 等,序列化存入 Session 時確保型別可序列化。
- 若部署於 Web Farm,Session 需使用分散式快取(Redis、SQL Server)。
- 避免在 Session 存放大型物件,影響效能與記憶體。
替代方案
若僅需上一頁 URL,可直接讀取 Request.UrlReferrer 或在 View 隱藏欄位傳遞 ReturnUrl。