11.30 ASP.NET實戰008:MVC路由實現詳解

URL定義

URL是Uniform Resource Locator的首字母縮寫,名為統一資源定位符,主要負責定位查找Internet中的信息資源,是Internet上標準的資源地址。資源是個抽象的概念,既可以指某個文件也可以指某方法調用的結果,所以URL不僅可以包含了文件的信息,也可以攜帶參數。

ASP.NET實戰008:MVC路由實現詳解

URL組成

URL主要由四部分組成,他們分別是傳輸協議、服務器地址、端口號、路徑名,中間用“/”符號拼接:

傳輸協議指的是要訪問的服務器的傳輸類型,如FTP(文件傳輸協議)、SMTP(電子郵件協議)、HTTP(超文本傳輸協議)、HTTPS(超文本傳輸安全協議)、DNS(域名系統協議)、TELNET(會話協議)等等,當然這裡我們WEB指的是一般都是HTTP或者HTTPS。

服務器地址用來定位資源所存在的機器,在公網中每臺服務器會分配一個唯一的IP地址,我們可以通過IP找到對應的服務器。

端口號連接時所使用的通信端口號,這是Internet用來辨別信息服務用的一種軟件標識。因為一臺服務器上可能部署多個服務,為了能更精準的當問到指定的服務我們就可以通過指定端口來區分。

路徑名指的是指定資源的具體文件路徑或者方法調用,由於資源不一定是文件,所以路徑中常常會攜帶參數,在方法調用的時候進行傳參。

ASP.NET實戰008:MVC路由實現詳解

ASP.NET MVC 路由

ASP.NET MVC 路由是建立在Asp.NetFramework之上的組件,路由機制同樣也可以應用在WebForms應用中,對於ASP.NET Web Forms來說,路由定位的是一個有效的文件。這個文件可以是靜態的圖片、視頻等文件,也可以是.aspx動態頁面。而對於ASP.NET MVC來說,路由則是指向了某個Controller類型中的Action方法,同時支持URL參數傳遞,這讓路由屬性更加靈活多變,可控性也強。

ASP.NET實戰008:MVC路由實現詳解

MVC路由特點

1,安全性高,避免直接訪問物理資源,提高了系統的安全性;

2,靈活性強,URL不會因為物流資源的改變而改變;

3,可讀性好,通過定義URL可以直觀的知道訪問的資源類型;

4,SEO優化,良好的URL規範容易被搜索引擎識別收錄;

5,易重寫,可以在不同的路由模式的操作上重寫默認路由。


Global.asax.cs

在創建一個新的ASP.NET MVC項目時在項目的根目錄中生成一個Global.asax文件,它是一個全局文件也是項目運行時的初始函數,它的作用是全局註冊組件,比如申明全局註冊、Filters註冊、 Route註冊、Bundle註冊等。項目啟動時會自動調用Global.asax文件中的Application_Start方法,該方法中默認申明瞭全局註冊及路由註冊。

ASP.NET實戰008:MVC路由實現詳解

RouteCOnfig.cs

Application_Start方法則調用了RegisterRoutes的方法(這個方法在~/App_Start/RouteCOnfig.cs中被定義),用來向ASP.NET MVC 註冊了路由規則,通過RouteCollection 的MapRoute方法(MVC提供MapRoute、MapPageRoute、IgnoreRoute三種方式)向系統增加一條路由規則,這個路由規則適用於所有的控制器。

name:路由的名稱;

url:這是個路由匹配規則,告訴系統請求資源的路徑,也就是我們URL中的路徑名,這裡每個部分用{}括起來,相當於佔位符,是變量,用來申明URL中的每個組成部分;

defaults:這是個默認的對象,{}中的變量指向了固定的參數表示執行匹配,這裡是告訴系統去Home Controller控制器中找Index方法並且傳入id這個參數,因此我們必須保證在項目的Controllers文件夾中必須有一個叫做HomeController的對象且對象中必須有Index這個方法,否則在訪問該路由時就會提示資源不存在,而Optional 是可選沒有也可以。

ASP.NET實戰008:MVC路由實現詳解

有了以上配置就可以滿足大部分的路由配置了,我們可以把更多的時間用在Model、View和Controller模塊開發上,MVC 會自動去匹配每一個路由,直到找到匹配的路由並將請求映射到對應的action上,如果沒有找到指定的路由就會彈出404錯誤提示。比如RouteCOnfig.cs中的defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }就告訴我們當我們啟動程序時默認執行HomeController控制器中的Index方法,向用戶展示index.cshtml頁面。如果Controller中不存在對應的控制器和方法時就會報“/”應用程序中的服務器錯誤。

ASP.NET實戰008:MVC路由實現詳解

​路由特性

特性路由就是利用特性去定義路由讓你在應用程序中能更好的控制URL,特性路由可以簡化URL和Action之間的映射關係。添加了特性路由後只能通過特性路由設置的路徑訪問,一般我們可以在一個項目中同時使用特性路由和傳統路由兩種技術。要啟用特性路由只需要在RouteConfig.cs路由配置中調用方法:MapMvcAttributeRoutes()即可。

ASP.NET實戰008:MVC路由實現詳解

如何定義特性路由

特性路由可以通過[Route]和[RoutePrefix]特性來自定義路由,[RoutePrefix]只作用於Controller,當定義了[RoutePrefix]特性時必須定義[Route]特性,此時的接口路由是“協議+IP+Port+RoutePrefix特性+Route特性”,如圖:http://localhost:54639/Test/TestView

注意:當Action定義了Router特性時Controller中定義的Route特性中的action指向的是Action中的Route特性,而不是Action方法名,也就是說下圖中通過http://localhost:54639/Test/index路由是訪問不到資源的。

ASP.NET實戰008:MVC路由實現詳解

[Route]主要作用於Action路由重寫,當在Action前定義了Route特性時,路由只能通過Route特性中的路由進行資源訪問,如果希望當前Action支持多路由訪問則可以定義多個Route特性。如下圖該方法即可以通過http://localhost:54639/home/test訪問,也可以通過http://localhost:54639/test訪問。

ASP.NET實戰008:MVC路由實現詳解

​ 當[Route]作用於Controller時RouteData 必須包含名為“action”且值為非空的字符串,此時Acion中就可以不用再單獨定義Route特性了。如[Route("Home/{action}")],當我們請求http://localhost:54639/Home/index時系統會自動去尋找符合特性路由[Route("Home/{action}")]下的index方法。

ASP.NET實戰008:MVC路由實現詳解

路由約束

通過前面的路由配置我們可以實現大部分路由配置了,但仔細查看還是會發現問題,作為路由參數匹配時路由參數會匹配任何非空字符,所以不管是int類型還是string類型都能匹配到當前路由。此時系統發現滿足路由的Acion方法有兩個,這時系統就會將參數作為方法參數傳遞給Action並試圖執行兩個Action方法,此時系統會報錯:當前請求在以下操作方法之間不明確。

ASP.NET實戰008:MVC路由實現詳解

​ 這時我們就可以通過路由約束來進行控制,當路由參數滿足路由約束條件時才匹配該路由並執行相應的Acion方法,當路由參數為int類型時則執行第一條路徑,否則則選擇第二條路線。通過在參數約束後面添加一個問號表示URI參數是可選的,也可以添加等號為其指定默認值。 當然也可以將多個約束應用於一個參數,只要用冒號分隔開即可。

ASP.NET實戰008:MVC路由實現詳解

​ .Net提供了大量的路由約束且默認加載了這些路由約束,當我們使用約束時會去驗證路由參數,通過TryParse()方法對參數嘗試轉換變量並提取參數字符串,返回ture則通過,false則跳過。除了通過使用類型和值約束來約束也可以用正則表達式來約束路由,只有與正則指定的類型匹配才能通過該路由。​

ASP.NET實戰008:MVC路由實現詳解

更多ASP.NET MVC實戰技巧可以參考專欄:ASP.NET MVC實戰系列


分享到:


相關文章: