在 ASP.NET MVC 應用程式啟動時,透過 Global.asax 的 RegisterRoutes 方法向路由表 (RouteTable.Routes) 添加自訂路由實例,是常見需求。但路由定義方式的細微差異可能導致截然不同的行為。
開發者嘗試兩種方式添加路由:
routes.Add("s", new Route("a/b", new WebFormRouteHandler("~/WebForm1.aspx")));
結果:呼叫 RedirectToAction() 時直接跳轉至 WebForm1.aspx,而非預期的控制器動作。
routes.Add("a", new Route(
"c/b",
new RouteValueDictionary { { "controller", "Default" }, { "action", "Index" } },
new WebFormRouteHandler("~/WebForm1.aspx")
));
結果:正常運作,僅當訪問 c/b 時才導向該頁面。
關鍵在於第二個建構子參數:
string url,使用 Route(string, IRouteHandler) 建構子。缺少預設值字典,路由系統無法正確解析控制器/動作資訊,導致 URL 生成與匹配邏輯異常。RouteValueDictionary,使用 Route(string, RouteValueDictionary, IRouteHandler) 建構子。明確提供預設值 (controller=Default, action=Index),路由系統據此正確處理 URL 生成 (UrlHelper) 與請求分派。根據微軟官方文件,RouteValueDictionary 表示不區分大小寫的鍵/值對集合,用於路由框架多處:
在方式二中,它為 URL 模板 c/b 定義了預設的控制器與動作,使路由系統知道此路由對應 DefaultController.Index,從而正確處理 RedirectToAction 等 URL 生成操作。
public class WebFormRouteHandler : MvcRouteHandler {
private string VirtualPath;
public WebFormRouteHandler(string path) { VirtualPath = path; }
protected override IHttpHandler GetHttpHandler(RequestContext requestContext) {
var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
return page;
}
}
此處理器將路由導向傳統 Web Form 頁面 (.aspx),實現 MVC 與 Web Form 混合應用。
controller, action),避免路由系統推測失敗。RedirectToRoute 等 API 參考。RouteDebugger 套件 (NuGet) 視覺化路由匹配過程,快速診斷問題。[Route("c/b")] 直接標註於動作方法,更直觀、不易衝突。路由定義時省略預設值字典 是導致 RedirectToAction 異常的根本原因。透過 RouteValueDictionary 明確指定 controller 與 action 預設值,可確保路由系統正確處理 URL 生成與請求分派,實現 MVC 與 Web Form 的無縫整合。