首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC 運作原理 [2]:URL 路由解析

     編輯:關於ASP.NET

ASP.NET MVC 透過 URL 路由機制,從 HTTP 請求解析出目標 Controller 與 Action 名稱。核心在於 RouteData、Route 與 RouteTable 的運作。

RouteData 結構

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"] 取得 */ } }
}

Route 與 RouteTable

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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved