您好,登錄后才能下訂單哦!
從這一章開始,我們即將進入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類型本身的方法,而是一個擴展方法,看一下擴展類型的定義:
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對象的內部構造了。
看一下示意圖2:
圖1-2
從上圖中可以看到,一個個的Route對象被注冊到服務器端中,每個Route對象自身攜帶著一則URL規則,暫時我們只需要理解這么多,對于RouteData對象會在后續講解。
既然上面說到了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對象的一些基礎概念。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。