從這一章開始,咱們即將進入MVC的世界,在學習MVC的過程當中在網上搜索了一下,資料仍是蠻多的,只不過對於我這樣的初學者來看仍是有點難度,本身就想看到有一篇引導性的資料能夠幫助我初步的瞭解一下這部分知識,而後再去學習大神們寫的資料。並非說看完文章就會能夠開發、能夠怎麼怎麼樣,沒有!這些都沒有,只是讓你在腦海中把這部份內容記住它們的模型圖以及一個大概的在MVC框架中的位置或者是整個系統中的位置,說了這麼多的目的就是讓你們更好的瞭解基礎知識,有了它之後的進階會更輕鬆。服務器
能夠把路由提供的功能當作是一個組件,既然是組件在哪均可能會用到的,而它所提供的功能就是URL的映射,和URL輸出。在傳統的Web Form開發中可能路由映射到的處理程序是一個aspx文件,而在MVC中大多數狀況下是映射的控制器和控制器行爲,傳統的模式咱們先無論,咱們是來學習MVC的。框架
先打開VS環境,新建一個MVC的項目,在項目中會看到一個名字叫Global.asax的文件,打開它,會看到是一個MvcApplication類型而且繼承自HttpApplication,在這個MvcApplication類型中有個RegisterRoutes公共的靜態函數,如圖1-1函數
圖1-1學習
這裏要關注的是routes.MapRoute()這個方法,這個方法不是RouteCollection類型自己的方法,而是一個擴展方法,看一下擴展類型的定義:this
1 //} 2 // 摘要: 3 // 擴展 System.Web.Routing.RouteCollection 對象以進行 MVC 路由。 4 public static class RouteCollectionExtensions 5 { 6 7 public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, RouteValueDictionary values); 8 public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, string name, RouteValueDictionary values); 9 public static void IgnoreRoute(this RouteCollection routes, string url); 10 public static void IgnoreRoute(this RouteCollection routes, string url, object constraints); 11 public static Route MapRoute(this RouteCollection routes, string name, string url); 12 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults); 13 public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces); 14 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints); 15 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces); 16 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces); 17 }
能夠在上述的類型中看到許多MapRoute()方法的重載,而且方法的參數又有這麼多,這個系列方法的意義在於向路由系統中添加你自定義的一個URL映射規則。怎麼添加的呢?這是根據系統上下文中的RouteTable對象中的RouteCollection類型的屬性Routes,而在MapRoute()方法中的實現說白了就是根據參數生成Route對象,而且添加Route對象到服務器中,而URL規則則是在Route對象的內部構造了。url
看一下示意圖2:spa
圖1-2code
從上圖中能夠看到,一個個的Route對象被註冊到服務器端中,每一個Route對象自身攜帶着一則URL規則,暫時咱們只須要理解這麼多,對於RouteData對象會在後續講解。orm
既然上面說到了Route對象咱們就先來看一下路由Route對象的基礎構造,如圖1-3對象
圖1-3
(ps:這個圖不是結構圖不是什麼正規的畫法,至關於一個思惟導圖,讓人看了能明白就行)
先從圖1-3的MapRoute()方法開始提及吧,在這個方法的內部會生成一個Route對象,而且添加到當前的RouteCollection類型的對象中。
圖1-4
在圖1-4中MapRoute方法中的」Default」參數表示着Route對象的內部是有着Name這個屬性值的,只是沒有公開使用而已,能夠經過這樣的方式來對路由進行名稱賦值。
」{controller}/{action}/{id}」參數對應的Route對象的Url屬性,只不過在MapRoute內部作賦值操做的時候,Route對象Url屬性的Set訪問器也在作着額外的操做,對Url進行解析生成成Url的規則,這個內容在後面的篇幅會有講到。
參數new {controller=」Home」,action=」Index」,id=UrlParameter.Optional}則會編譯成一個動態類型,此類型中包含參數中定義的controller、action和id三個屬性,在MapRoute()方法中會先判斷類型是不是RouteValueDictionary類型,若是是的話會直接賦值到Defaults屬性,不然會使用其它的方法把根據這個動態類型生成一個RouteValueDictionary類型實例。
這裏捎帶一句RouteValueDictionary類型出現頻率較高,主要是由於Route對象的的幾個屬性都是這個類型,把它做爲鍵值隊來想就好了。
圖1-5
這種思惟圖沒有重複,只是但願做爲初學者閱讀完本篇事後能留下的總體印象就是最後的這幅圖。
Route對象的屬性和函數一篇是說不完的,文章的目的只是一個基礎性的掃盲,鋪設基礎而已,會在後續的篇幅中說到Route對象的Url規則定義和RouteData的由來,以及RouteCollection對象的一些基礎概念。
做者:金源
出處:http://www.cnblogs.com/jin-yuan/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面