Agenda
前言
UrlRoutingModule對於OnPostResolveRequestCache事件添加一個對於MVC很重要的動作,透過RouteCollection取得此次請求匹配RouteData物件.
利用此RouteData取得要使用的IHttpHandler來執行它.
1 | RouteData routeData = RouteCollection.GetRouteData(context); |
RouteCollection是全域路由註冊表.我們在一開始使用MapRoute註冊與之匹配Controller和Action
RouteCollection是基於RouteBase物件集合,所以它可以存放所有繼承RouteBase物件,RouteBase這個類別有一個重要的方法來取得RouteData,RouteData封裝此次Http請求的Controller,Action…等資訊
對於每個Http請求依序找尋第一個匹配路由規則
1 | routes.MapRoute( |
RouteData
在RouteData類別中有幾個重要屬性.
RouteHandler:存放IRouteHandler物件(提供IHttpHander並呼叫執行物件)Values: 一個字典集合,存放Key為Controller和Action,Value是URL參數值相對位置參數GetRequiredString:利用傳入string參數對於Values字典取匹配名稱.
1 | public class RouteData |
RouteData主要把Client傳送Http請求資訊經解析後存放在Values中.
RouteBase中有個GetRouteData方法,藉由我們的路由設定去解析當前是否匹配到路由規則,如果有就回傳一個RouteData物件,否則回傳Null
建立自己Route機制
一般使用Route這個物件是使用/當作註冊對應的規則
{Controller}/{Action}在Domian後用/當作分隔
第一個區塊字串被當作ControllerName
第二個區塊字串被當作ActionName
因為在Asp.net MVC透過
RouteData.GetRequiredString傳入ControllerName或ActionName取得相對應的值.
這次例子我們希望可以透過QueryString來製作Route對應規則
{domain}?controller=home&action=about
透過上面URL期望呼叫HomeController.About方法
廢話不多說我們來看一下這個QueryStringRoute是如何被實現
1 | public class QueryStringRoute : RouteBase |
我們實現RouteBase抽象類別兩個方法
GetRouteDataGetVirtualPath
其中GetRouteData是我們主要要實作方法
Request.QueryString這個集合封裝Http QueryString的資訊.
首先我們先判斷此次請求QueryString是否由傳Controller,Action資料過來,如果有把值填入RouteData.Values字典集合中,反之不匹配此Route規則就回傳NULL.
MVC從
RouteData.Values取得對應的資料.
使用上就可透過RouteCollection.Add將Route添加到集合中
1 | public static void RegisterRoutes(RouteCollection routes) |
Http請求就會依序找尋第一個匹配Route來執行.
小結:
透過繼承RouteBase抽象類別並實現GetRouteData方法透過返回RouteData物件對於Http請求資訊封裝到RouteData.Values字典集合.(在MVC框架中會對於Values字典中取Key為Controller和Action的值.)
最後再把新建立RouteBase物件加入到全域RouteCollection中.
希望大家看完這篇後可以了解並自行擴充自己Route機制.
本次範例程式碼Git Sample(CustomerRoute Branch)
__此文作者__:Daniel Shih(石頭)
__此文地址__: https://isdaniel.github.io/ithelp-day26/
__版權聲明__:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!