URL路由()
對於一個ASPNET MVC應用來說針對HTTP請求的處理實現在某個Controller類型的某個Action方法中每個HTTP請求不再像ASP NET Web Forms應用一樣是對應著一個物理文件而是對應著某個Controller的某個Action目標Controller和Action的名稱包含在HTTP請求的URL中而ASPNET MVC的首要任務就是通過當前HTTP請求的解析得到正確的Controller和Action的名稱這個過程是通過ASPNET MVC的URL路由機制來實現的
RouteData
ASPNET定義了一個全局的路由表路由表中的每個路由對象包含一個URL模板目標Controller和Action的名稱可以通過路由變量以占位符(比如{controller}和{action})定義在URL模板中也可以作為路由對象的默認值對於每一個抵達的HTTP請求ASPNET MVC會遍歷路由表找到一個具有與當前請求URL模式相匹配的路由對象並最終解析出以Controller和Action名稱為核心的路由數據在我們自定義的ASPNET MVC框架中路由數據通過具有如下定義的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 RouteData()
{
thisValues = new Dictionary<string object>()
thisDataTokens = new Dictionary<string object>()
thisDataTokensAdd(namespaces new List<string>())
}
public string Controller
{
get
{
object controllerName = stringEmpty;
thisValuesTryGetValue(controller out controllerName)
return controllerNameToString()
}
}
public string ActionName
{
get
{
object actionName = stringEmpty;
thisValuesTryGetValue(action out actionName)
return actionNameToString()
}
}
}
如上面的代碼片段所示RouteData定義了兩個字典類型的屬性Values和DataTokens前者代表直接從請求地址解析出來的變量列表後者代表具有其他來源的變量列表表示Controller和Action名稱的同名屬性直接從Values字典中提取對應的Key分別為controller和action
我們之前已經提到過ASPNET MVC本質上是由兩個自定義的ASPNET組件來實現的一個是自定義的HttpModule另一個是自定義的HttpHandler而後者從RouteData的RouteHandler屬性獲得RouteData的RouteHandler屬性類型為IRouteHandler接口如下面的代碼片段所示該接口具有一個唯一的GetHttpHandler用於返回真正用於處理HTTP請求的HttpHandler對象
public interface IRouteHandler
{
IHttpHandler GetHttpHandler(RequestContext requestContext)
}
IRouteHandler接口的GetHttpHandler方法接受一個類型為RequestContext的參數顧名思義RequestContext表示當前(HTTP)請求的上下文其核心就是對當前HttpContext和RouteData的封裝這可以通過如下的代碼片段看出來
public class RequestContext
{
public virtual HttpContextBase HttpContext { get; set; }
public virtual RouteData RouteData { get; set; }
}
Route和RouteTable
RouteData具有一個類型為RouteBase的Route屬性表示生成路由數據對應的路由對象如下面的代碼片段所示RouteBase是一個抽象類它僅僅包含一個GetRouteData方法該方法判斷是否與當前請求相匹配並在匹配的情況下返回用於封裝路由數據的RouteData對象該方法接受一個表示當前HTTP上下文的HttpContextBase對象如果與當前請求不匹配則返回Null
public abstract class RouteBase
{
public abstract RouteData GetRouteData(HttpContextBase httpContext)
}
返回目錄ASPNET MVC 框架揭秘
編輯推薦
ASP NET開發培訓視頻教程
Microsoft NET框架程序設計視頻教程
Java程序性能優化讓你的Java程序更快更穩定
Visual C++音頻/視頻技術開發與實戰
From:http://tw.wingwit.com/Article/program/net/201311/16112.html