ASP.NET MVC 路由(三)


 ASP.NET MVC路由(三)

前言

通過前兩篇的學習會對路由系統會有一個初步的了解,並且對路由系統中的Url規則有個簡單的了解,在大家的腦海中也有個印象了,那么路由系統在ASP.NETMVC中所處的位置在哪呢?

RouteData

路由系統在ASP.NETMVC框架中的默認的實現位置是在RulRoutingModule中。對於Module下個篇幅會有所講解。

本篇主題在於說明RouteData對象,因為MVC框架在根據服務器端注冊好的Route對象集合和請求的Url匹配所得一個Route對象,而在后面的框架使用中是不會對Route對象去操作的,而是封裝成了RouteData對象。

我們看一下RouteData對象的構造函數定義:

1         public RouteData (RouteBase route, IRouteHandler routeHandler)
2         {
3             
4             Route = route;
5             RouteHandler = routeHandler;
6 
7             DataTokens = new RouteValueDictionary ();
8             Values = new RouteValueDictionary ();
9         }

RouteBase類型的對象就是Route對象的基類,下面說明。

IRouteHandler類型的則是會使用系統默認的類型MvcRouteHandler類型,而MvcRouteHandler類型則會根據請求上下文參數對象默認的生成實現了IHttpHandler接口的MvcHandler類型,MvcHandler類型則是跟控制器部分連接的關鍵處,后續的篇幅會有講解這里扯多了。

現在我們來看一下RulRoutingModule對象中獲得RouteData對象的默認實現,如圖1

圖1

RouteData對象是要根據請求的Url來進行匹配所得到的,從圖1中也可以看出,請求包含在Context參數中,而參數的對象模型也在圖中有所顯示,看似由RouteCollection對象來調用的GetRouteData()方法,實際是由RouteCollection對象中的(在服務器端先注冊的一些Route對象)每個Route對象都來執行一遍GetRouteData()方法,如果有匹配的則會返回,沒有則繼續往下匹配。

 

RouteData對象包含着控制器名稱、RouteHander對象(路由請求處理對象),有着承上啟下的作用,如圖2所示對象模型

圖2

我們只需要關注Values屬性和RouteHandler屬性即可,圖1中藍色線條的箭頭表示屬性的類型,Values屬性表示着的是請求Url通過匹配解析后的對應值,假使Route中的Url規則定義為”{controller}/{action}”,而請求的Url為”Home/Index”,這樣的話Values中的Keys值集合為controller、action兩項分別對應的值為Home、Index,而RouteHandler屬性則是獲取匹配成功的那個Route對象的RouteHandler屬性。

 

總結:

粗略的概括路由的執行過程

  1. 向當前系統注冊路由(路由名稱、自定義Url規則、命名空間、以及一些Url約束等信息)
  2. 每個路由對象在注冊到系統路由集合中的時候則會自動的解析完成Url規則,並由路由對象對象(Route)保存
  3. 根據請求到達服務器的時候,請求Url在服務器的路由集合(RouteCollection)中匹配(匹配的規則就是按照集合中的順序,每個Route對象會依次的根據請求Url來根據自己的Url規則進行匹配,如果發現合適的則會結束匹配,請大家記住路由是最先匹配不是最優匹配),根據匹配好的Route對象進行封裝最后返回RouteData對象實例。

下面上圖兩張便於大家理解記憶,有不妥的地方請大家指正。

圖3

圖4

Ps:

這部分的知識不會給你帶來多大的提升應該是可以給你留下一點關於路由的印象。

看完這幾篇並不會對路由有多么的熟悉只要是能讓你有一點的收獲我就心滿意足了,對於路由其它的部分會在后續篇章中繼續講解。

 

 

 

 

作者:金源

出處:http://www.cnblogs.com/jin-yuan/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM