ASP.NET MVC 透過 URL 路由機制,從 HTTP 請求解析出目標 Controller 與 Action 名稱。核心在於 RouteData、Route 與 RouteTable 的運作。
RouteData 封裝解析結果:
public class RouteData
{
public IDictionary<string, object> Values { get; private set; }
public IDictionary<string, object> DataTokens { get; private set; }
public IRouteHandler RouteHandler { get; set; }
public RouteBase Route { get; set; }
public string Controller { get { /* 從 Values["controller"] 取得 */ } }
public string ActionName { get { /* 從 Values["action"] 取得 */ } }
public IEnumerable<string> Namespaces { get { /* 從 DataTokens["namespaces"] 取得 */ } }
}
RouteBase 抽象類別定義 GetRouteData 方法。Route 類別實作 URL 模板比對邏輯:
public class Route : RouteBase
{
public string Url { get; set; }
public IDictionary<string, object> DataTokens { get; set; }
public IRouteHandler RouteHandler { get; set; }
public override RouteData GetRouteData(HttpContextBase httpContext)
{
IDictionary<string, object> variables;
if (this.Match(httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2), out variables))
{
RouteData routeData = new RouteData();
foreach (var item in variables) routeData.Values.Add(item.Key, item.Value);
foreach (var item in DataTokens) routeData.DataTokens.Add(item.Key, item.Value);
routeData.RouteHandler = this.RouteHandler;
return routeData;
}
return null;
}
protected bool Match(string requestUrl, out IDictionary<string, object> variables) { /* 分割比對邏輯 */ }
}
比對成功則建立 RouteData,失敗回傳 Null。