ASP.NET 路由系統除了處理請求路由,另一大功能是根據註冊路由規則生成 URL,透過 RouteCollection.GetVirtualPath 方法實現。
public class RouteCollection : Collection<RouteBase>
{
public VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
public VirtualPathData GetVirtualPath(RequestContext requestContext, string name, RouteValueDictionary values);
public bool AppendTrailingSlash { get; set; }
public bool LowercaseUrls { get; set; }
}
若未指定路由名稱,系統會遍歷集合尋找第一個回傳非 Null 的 VirtualPathData。參數 requestContext 可為 Null,此時以目前 HTTP 上下文建立預設 RequestContext。
URL 模板中的變數值來源有三種,優先級由高到低:
values 參數RequestContext.RouteData.Values註冊路由模板 {areacode}/{days},預設值 areacode=010、days=2。在頁面中分別呼叫三種 GetVirtualPath 多載,觀察生成 URL 差異:
Response.Write(RouteTable.Routes.GetVirtualPath(null, null).VirtualPath + "<br/>");
Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, null).VirtualPath + "<br/>");
Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, values).VirtualPath + "<br/>");

結果證實變數選擇優先級結論:手工傳入值覆蓋 RouteData,RouteData 覆蓋預設值。