ASP.NET MVC的生命周期与网址路由
網址路由(Routing)在ASP.NET MVC中有兩個主要用途,一個用途是匹配通過瀏覽器傳來的HTTP請求,另一個用途則是將適當的網址返回瀏覽器。
首先我們來看下第一個用途,也就是匹配通過瀏覽器傳來的HTTP請求。
客戶端對ASP.NET網站發出請求時,能夠通過Routing找到合適的HttpHandler來處理網頁,大致的處理流程為:
圖一 客戶端對ASP.NET 網站發出請求的流程
如果HttpHandler是由MvcHandler來處理的,那么,此時就會進入ASP.NET MVC的執行生命周期,并且會找到適當的Controller與Action來對其進行處理,并將信息反饋到客戶端。
其次是將適當的網址返回瀏覽器。
網址路由的另一個用途是決定ASP.NET MVC應該輸出什么樣的網址并將其返回給瀏覽器,一般來說,跳轉地址或者在View中顯示超鏈接時,都需要參考網址路由的定義,因為這樣才能動態決定ASP.NET MVC輸出的網址應該是什么。我們接下來看個例子,假如首先默認網址路由。
| Public static void RegisterRoutes(RouteCollection routes) {routes.IgnoreRoute(“{resource}.axd/{*pathInfo} ”);routes.MapRoute( “Default”,“{controller}/{action}/{id}”,new {controller =”home”,action =”Index”,id =UrlParameter.Optional } );} protected void Application_Start() {AreaRegistration.RegisterAllAreas();RegisterRoutes(RouteTable.Routes); } |
在這里我們定義了如下兩個默認的網址路由:
設定*.axd等格式的網址路徑不通過ASP.NET MVC執行。例如,ASP.NET內置的Trace.axd文件或其他默認的HttpHandler對象都不通過ASP.NET MVC進行處理。
MapRoute()方法是定義ASP.NET MVC網址路由最主要的方式,每一個路由都定義了以下3個參數:
- 路由名稱。
- 對網址路徑如何對應到控制器、動作與路由值的設定。
- 控制器、動作和其他路由值的默認值。
通過這個默認的MapRoute()方法可以得知,在瀏覽器的地址欄輸入“http://localhost/Home/About”時,通過Routing的對應,由于網址路徑的一部分為“Home/About”,所以會對應出“{controller}”為“Home”,“{action}”為“About”。因此,ASP.NET MVC會先進入“Controllers”目錄,找到Home控制器(也就是HomeController.cs文件),然后再找到這個控制器內的About公開方法啊(Public Method)。這個公開方法就是MVC的Action,也就是實際執行網頁主要程序的入口。
當我們在瀏覽器的地址欄中輸入“http://localhost”來訪問網站首頁時,通過Routing的對應,由于網址路徑部分沒有任何內容,所以會使用MapRoute()方法的第三個參數所設定的默認值來代替。因此,會先進入“Controllers”目錄,找到Home控制器,然后再找到Index公開方法,并進一步執行ASP.NET MVC的所有過程。
由于我們默認定義了兩個網址路由,按照ASP.NET Routing的規則,當HTTP提出請求后,URL會進行網址路由的對比,而且是由上而下地一條一條匹配,直到符合HTTP請求的網址為止。
1、例如:http://localhost/Trace.axd/a/b/c/d/e
匹配的順序:
(1) 匹配 routes.IgnoreRoute命名空間的“{resource}.axd/{*pathInfo} ”網址格式。
(2) {resource}.axd匹配到“Trace.axd”,因此繼續匹配下一個RouteValue表達式。
(3) 匹配“{*pathInfo}”,得到“a/b/c/d/e”。
(4) 因為所有的RouteValue表達式都匹配成功,所有該HTTP請求會由此網址路由提供服務。
匹配結果:
該網址使用routes.IgnoreRoute命名空間進行處理,也就是說,ASP.NET MVC為忽略此請求,改以ASP.NET 架構本身繼續處理。
2、例如:http://localhost/Member/Detail?id=123
匹配的順序:
(1) 匹配routes.IgnoreRoute命名空間的“{resource}.axd/{*pathInfo} ”網址格式。
(2) 匹配請求的URL的第1個部分,即“Member”,由于沒有匹配到“{resource}.axd”,所以匹配失敗。
(3) 跳轉到routes.MapRoute命名空間的“{controller}/{action}/{id}”網址格式。
(4) 匹配請求的URL的第1個部分,即“Member”,并且匹配到{controller}參數。
(5) 匹配請求的URL的第2個部分,即“Detail”,并且匹配到{ action }參數。
(6) 接下來的“?id=123”就不算是網址的一部分了,所以它不會被算進到RouteValue表達式中,因此不會再對它進行匹配。
(7) “{id}”部分因為沒有匹配到,所以會讀取默認值,也就是“UrlParameter.Optional”部分。由于存在默認值,所以也算匹配成功。
(8) 因為所有的RouteValue表達式都匹配成功,所以這次的HTTP請求會由此網址路由提供服務。
匹配結果:
該網址使用routes.MapRoute命名空間進行處理,并通過MvcHandler將值賦予適當的Controller和Action程序。在這里會對應MemberController的Detail動作。
為網址路由加上限制條件:
?MapRoute()是最常用來定義Routing規則的輔助方法,它其實還有許多應用方式(重載)。最常見的應用方式為“樣式比對規則(正則表達式)+限制條件”,下面舉例說明:
?routes.MapRoute(
??????????????? "Default", // 路由名稱
??????????????? "{controller}/{action}/{id}", // 帶有參數的 URL
??????????????? new { controller = "Guestbook", action = "Index", id = UrlParameter.Optional }, // 參數默認值
??????????????? new { id = @"\d+" }
??????????? );
?我們在輔助方法中設置了第四個參數,這些參數指定了一個匿名對象,其中ID屬性就是我們對比{id}路由值的限制條件,其限制條件使用正則表達式來表示,“\d+”表示路由值必須為
數字的時候才算比對成功,比如你的網址“http://localhost/Order/Member/Index/123abc”就會對比失敗。
總結
以上是生活随笔為你收集整理的ASP.NET MVC的生命周期与网址路由的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十步让你成为一名优秀的 Web开发人员
- 下一篇: 京东苏宁大战的背后