ASP.NET 原生路由系統透過 MapPageRoute 將 URL 模板對應至實體檔案,但 ASP.NET MVC 的請求目標是 Controller 中的 Action 方法。為此,MVC 對 RouteCollection 擴展了 MapRoute 等方法,實現無實體檔案依賴的路由映射。
RouteCollectionExtensions 定義了 IgnoreRoute 與 MapRoute 兩組擴展方法:
public static class RouteCollectionExtensions
{
public static void IgnoreRoute(this RouteCollection routes, string url);
public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
}
defaults 與 constraints 採用 object 類型,方便使用匿名型別;namespaces 參數協助解析 Controller 類型,最終存放於 Route.DataTokens["Namespaces"] 中。
在一般 ASP.NET Web 應用中新增 Default.aspx,於頁面中輸出 RouteData 的 Route、RouteHandler、Values 及 DataTokens 等屬性,觀察 MVC 風格路由註冊後的解析結果。
<body>
<form id="form1" runat="server">
<div>
<table>
<tr><td>Route:</td><td><%=GetRouteData().Route != null? GetRouteData().Route.GetType().FullName:"" %></td></tr>
<tr><td>RouteHandler:</td><td><%=GetRouteData().RouteHandler != null? GetRouteData().RouteHandler.GetType().FullName:"" %></td></tr>
<tr><td>Values:</td><td><ul><%foreach (var variable in GetRouteData().Values){%><li><%=variable.Key%>=<%=variable.Value%></li><% }%></ul></td></tr>
<tr><td>DataTokens:</td><td><ul><%foreach (var variable in GetRouteData().DataTokens){%><li><%=variable.Key%>=<%=variable.Value%></li><% }%></ul></td></tr>
</table>
</div>
</form>
</body>