溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET MVC路由(一)

發(fā)布時間:2020-07-26 15:47:58 來源:網(wǎng)絡(luò) 閱讀:920 作者:jinyuan0829 欄目:編程語言

 ASP.NET MVC路由()

前言

從這一章開始,我們即將進(jìn)入MVC的世界,在學(xué)習(xí)MVC的過程***諭纖閹髁艘幌攏柿匣故鍬嗟?;策€雜諼藝庋某躚д呃純椿故怯械隳訊齲約壕拖肟吹接幸黃***的資料可以幫助我初步的了解一下這部分知識,然后再去學(xué)習(xí)大神們寫的資料。并不是說看完文章就會可以開發(fā)、可以怎么怎么樣,沒有!這些都沒有,只是讓你在腦海中把這部分內(nèi)容記住它們的模型圖以及一個大概的在MVC框架中的位置或者是整個系統(tǒng)中的位置,說了這么多的目的就是讓大家更好的了解基礎(chǔ)知識,有了它以后的進(jìn)階會更輕松。

什么是路由?

可以把路由提供的功能看成是一個組件,既然是組件在哪都可能會用到的,而它所提供的功能就是URL的映射,和URL輸出。在傳統(tǒng)的Web Form開發(fā)中可能路由映射到的處理程序是一個aspx文件,而在MVC中大多數(shù)情況下是映射的控制器和控制器行為,傳統(tǒng)的模式我們先不管,我們是來學(xué)習(xí)MVC的。

 

路由的對象結(jié)構(gòu)

先打開VS環(huán)境,新建一個MVC的項(xiàng)目,在項(xiàng)目中會看到一個名字叫Global.asax的文件,打開它,會看到是一個MvcApplication類型并且繼承自HttpApplication,在這個MvcApplication類型中有個RegisterRoutes公共的靜態(tài)函數(shù),如圖1-1

圖1-1

ASP.NET MVC路由(一)

這里要關(guān)注的是routes.MapRoute()這個方法,這個方法不是RouteCollection類型本身的方法,而是一個擴(kuò)展方法,看一下擴(kuò)展類型的定義:

 1     //}
 2     // 摘要:
 3     //     擴(kuò)展 System.Web.Routing.RouteCollection 對象以進(jìn)行 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()方法的重載,并且方法的參數(shù)又有這么多,這個系列方法的意義在于向路由系統(tǒng)中添加你自定義的一個URL映射規(guī)則。怎么添加的呢?這是根據(jù)系統(tǒng)上下文中的RouteTable對象中的RouteCollection類型的屬***Routes,而在MapRoute()方法中的實(shí)現(xiàn)說白了就是根據(jù)參數(shù)生成Route對象,并且添加Route對象到服務(wù)器中,而URL規(guī)則則是在Route對象的內(nèi)部構(gòu)造了。

看一下示意圖2:

圖1-2

ASP.NET MVC路由(一)

從上圖中可以看到,一個個的Route對象被注冊到服務(wù)器端中,每個Route對象自身攜帶著一則URL規(guī)則,暫時我們只需要理解這么多,對于RouteData對象會在后續(xù)講解。

既然上面說到了Route對象我們就先來看一下路由Route對象的基礎(chǔ)構(gòu)造,如圖1-3

圖1-3

ASP.NET MVC路由(一)

(ps:這個圖不是結(jié)構(gòu)圖不是什么正規(guī)的畫法,相當(dāng)于一個思維導(dǎo)圖,讓人看了能明白就行)

先從圖1-3的MapRoute()方法開始說起吧,在這個方法的內(nèi)部會生成一個Route對象,并且添加到當(dāng)前的RouteCollection類型的對象中。

圖1-4

ASP.NET MVC路由(一)

在圖1-4中MapRoute方法中的”Default”參數(shù)表示著Route對象的內(nèi)部是有著Name這個屬***值的,只是沒有公開使用而已,可以通過這樣的方式來對路由進(jìn)行名稱賦值。

”{controller}/{action}/{id}”參數(shù)對應(yīng)的Route對象的Url屬***,只不過在MapRoute內(nèi)部做賦值操作的時候,Route對象Url屬***的Set訪問器也在做著額外的操作,對Url進(jìn)行解析生成成Url的規(guī)則,這個內(nèi)容在后面的篇幅會有講到。

參數(shù)new {controller="Home",action="Index",id=UrlParameter.Optional}則會編譯成一個動態(tài)類型,此類型中包含參數(shù)中定義的controller、action和id三個屬***,在MapRoute()方法中會先判斷類型是否是RouteValueDictionary類型,如果是的話會直接賦值到Defaults屬***,否則會使用其它的方法把根據(jù)這個動態(tài)類型生成一個RouteValueDictionary類型實(shí)例。

這里捎帶一句RouteValueDictionary類型出現(xiàn)頻率較高,主要是因?yàn)镽oute對象的的幾個屬***都是這個類型,把它作為鍵值隊來想就行了。

圖1-5

ASP.NET MVC路由(一)

這種思維圖沒有重復(fù),只是希望作為初學(xué)者閱讀完本篇過后能留下的整體印象就是最后的這幅圖。

Route對象的屬***和函數(shù)一篇是說不完的,文章的目的只是一個基礎(chǔ)***的掃盲,鋪設(shè)基礎(chǔ)而已,會在后續(xù)的篇幅中說到Route對象的Url規(guī)則定義和RouteData的由來,以及RouteCollection對象的一些基礎(chǔ)概念。

 

 

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI