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
抽象類別兩個方法
GetRouteData
GetVirtualPath
其中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 許可協議。轉載請註明出處!