ASP.NET MVC Framework體驗(5):路徑選擇(URL Routing)(轉)
概述
在傳統的ASP.NET應用程式中,發生一個請求之後將對映到一個.aspx檔案,且會對應到一個具體的物理aspx檔案。ASP.NET MVC Framework中,進入一個請求之後,不再是對映到.aspx檔案,而是由MVC Framework中提供的路徑選擇引擎,對映到正確的Controller和Action執行請求。ASP.NET MVC Framework中URL路徑對映規則定義在Global.asax中,這在一定程式上帶來了很多的靈活性,如果想要修改URL應用結構的話,只需要修改一下對映規則即可,並不需要修改Controller和View中的程式碼,但是這仍然不夠靈活。改變Global.asax程式碼仍然會導致應用程式的重新編譯,本篇文章末尾部分將會介紹如何通過HttpModule定義對映規則在Web.config中。
理解路徑選擇
先看一下下面這幅圖:
從上圖中可以看到,發生一個請求之後,第一步就是路徑選擇,而對映規則是通過在Routes集合中新增Route例項來註冊的,如:
RouteTable.Routes.Add( new Route { Url = "[controller]/[action]", Defaults = new { action = "Index"}, RouteHandler = typeof(MvcRouteHandler) });
Route中有四個屬性,它的定義如下:
public class Route { public Route(); public Route(stringurl, Type routeHandler); public Route(string url, object defaults, Type routeHandler); public object Defaults { get; set; } public Type RouteHandler { get; set; } public string Url { get; set; } public object Validation { get; set; } }
其中:
Url指定了請求的Url匹配規則,還定義了URL應該如何分割成(tokenized)不同的引數,URL中可替換的引數,是通過 [引數名稱] 的句法來定義的。
Defaults屬性定義了一個預設值的字典,可以在進來的URL並不包含某個指定的引數值的情形下使用。
RouteHandler屬性定義了在URL被分割成引數,適當的路徑選擇規則被確定之後,應該用來處理請求的 IRouteHandler 例項。
Validation屬性允許我們指定一個路徑選擇規則匹配需要滿足的先決條件,如對引數值使用正則表示式,來過濾一個路徑選擇規則是否匹配。
II6與II7的區別
在使用ASP.NET MVC Framework時,要注意一點II6和II7的區別,如果在II7下,不需要使用.mvc副檔名,路徑選擇規則可以如下所示:
RouteTable.Routes.Add( new Route { Url = "[controller]/[action]/[id]", Defaults = new { action = "Index", id = (string)null }, RouteHandler = typeof(MvcRouteHandler) });
而在II6下,控制器名後面必須要有.mvc副檔名:
RouteTable.Routes.Add( new Route { Url = "[controller].mvc/[action]/[id]", Defaults = new { action = "Index", id = (string)null }, RouteHandler = typeof(MvcRouteHandler) });
路徑選擇規則的驗證
在本文第二節我們提到過Route的一個Validation屬性,允許我們指定一個路徑選擇規則匹配需要滿足的先決條件。如下程式碼段所示,驗證Id必須為整數且長度在1到8之間:
RouteTable.Routes.Add( new Route { Url = "Blog.mvc/Detail/[id]", Defaults = new { controller = "Blog", action = "Detail" }, Validation = new { id=@"\d{1,8}" }, RouteHandler = typeof(MvcRouteHandler) });
自定義RouteHandler
在ASP.NET MVC Framework中,提供了很好的擴充套件功能,如我們可以自定義RouteHandler來實現在Web.config中配置ControllerFactory和ViewFactory。在ASP.NET MVC Framework中,自定義RouteHandler只需要實現IRouteHandler介面並實現GetHttpHandler方法,它的定義如下:
public interface IRouteHandler { IHttpHandler GetHttpHandler(RequestContext requestContext); }Fredrik在它的Blog上寫了一個完整的示例,有興趣的朋友可以參考一下。
在Web.config中定義路徑選擇規則
ASP.NET MVC Framework中路徑選擇規則定義在Global.asax中的Application_Start方法中,當對映規則發生改變時,如果修改了Application_Start中的程式碼,必將導致整個應用程式的重新編譯,我們完全可以通過HttpModule來實現把對映規則放在配置檔案中。如下示例程式碼所示:public class RouteBuilder : IHttpModule { public void Init(HttpApplication application) { RouteConfiguration routeConfig = (RouteConfiguration)System.Configuration.ConfigurationManager.GetSection("RouteTable"); foreach (RouteElement routeElement in routeConfig.Routes) { Route currentRoute = new Route(); currentRoute.Defaults = new DefaultsType(routeElement.Defaults); currentRoute.Url = routeElement.Url; currentRoute.RouteHandler = typeof(MvcRouteHandler); RouteTable.Routes.Add(currentRoute); } } public void Dispose() { } }在CodePlex上,已經有了做了這樣的開源專案,地址為:http://www.codeplex.com/RouteBuilder,有興趣的朋友參考一下。
結束語
關於ASP.NET MVC Framework中的路徑選擇就簡單的介紹到這兒了,其實本篇文章後兩節都是在推薦一些學習的資料,而關於路徑選擇的詳細內容,在ScottGu的文章裡已經寫的很仔細了。
最後,再次做個小廣告:我在部落格園社群中建立了一個Web技術聯盟小組,歡迎大家加入。同時,該小組將在近期會有一些活動,來提高社群的氛圍:)