從.NET架構3.5 SP1開始,微軟推出了ASP.NET路由支援,從而實現了特定資源的URL與其對應的Web伺服器上的物理檔案之間的徹底解耦。藉助於ASP.NET路由支援,開發人員可以定義一組路由規則,從而實現把路由模式映射到一個產生相應內容的類。例如,你可以把URL“Categories/CategoryName”映射到一個類,該類接收CategoryName而最終產生對應於此種類的產品資訊顯示於一個網格中的一組HTML標記。有了這樣的映射,使用者便可以通過訪問www.yoursite.com/Categories/Beverages">www.yoursite.com/Categories/Beverages來查看飲料種類對應的所有產品資訊。
在.NET 3.5 SP1中,ASP.NET路由主要是為ASP.NET MVC應用而設計的,雖然在非ASP.NET MVC架構支援的Web表單應用程式中也有可能實現ASP.NET路由支援。然而,在Web表單應用程式中實現ASP.NET路由會涉及大量額外的工作。
在Web表單中,通常情況下,我們都要把路由模式映射到一個實際的ASP.NET頁面。為此,我們需要建立一個路由處理類以便在請求路由URL時調用之,並且在一定意義上實現了把請求調度到適當的ASP.NET頁面。例如,為了把一個路由映射到一個物理檔案,比如把Categories/CategoryName映射到ShowProductsByCategory.aspx,我們需要如下三個步驟:
(1)在Global.asax檔案中定義映射,用於把路由模式映射到一個路由處理類;
(2)建立路由處理類,它負責解析網址,把所有路由參數儲存到一些目標頁面可以訪問到的位置(如HttpContext.Items),並返回一個目標頁面或處理請求路由的HTTP處理器的執行個體;
(3)在目標頁面中編寫代碼來擷取路由參數,並使用他們產生頁面內容。
且不說花費了多大的代價僅僅讀取前面的語句(更不用擔編寫之),你完全能夠想象到—在Web表單應用程式中執行ASP.NET路由不一定是開發人員最直接的任務。
值得慶幸的是,ASP.NET 4.0通過添加一組類和助理方法極大地簡化了ASP.NET路由在Web表單應用程式中的使用。使用ASP.NET 4.0,你會更容易地定義路由規則,而不再需要建立一個自訂路由處理類。本文將詳細探討這方面的改進支援。
一、ASP.NET路由技術概述
ASP.NET路由能夠乾淨地實現URL與網頁檔案名稱之間的解耦,從而可用於建立乾淨、簡潔且搜尋引擎友好的網址。有關為什麼應該在Web應用程式中使用ASP.NET路由的詳細討論,在此不作詳細討論,請參考其他有關文章。
概括地說,ASP.NET路由允許開發人員定義路由規則,從而實現把一個路由模式(如Categories/CategoryName)映射到一個處理請求的類。這些路由規則在應用程式啟動時就已經定義在檔案Global.asax中的Application_Start事件處理常式中。
在Web表單應用程式中,我們可能已經擁有了產生我們感興趣內容的ASP.NET網頁,我們只需要通過路由規則把路由模式映射到這些ASP.NET頁面—通過把任何路由參數(例如CategoryName)映射到該ASP.NET頁面來實現。當在ASP.NET 3.5 SP1中使用ASP.NET路由時,沒有方法直接把路由模式映射到ASP.NET頁。相反,我們必須建立一個路由處理類,它負責傳遞有關傳入請求的資訊,並且必須返回一個HTTP處理常式來處理此請求。通常,在Web表單應用程式中一個路由處理類執行以下步驟:
(1)根據需要解析網址,或許研究某些路由參數,並以這些值為基礎作出決定。
(2)從需要被傳遞到ASP.NET頁面或HTTP處理常式(它們將處理這一請求)的URL載入任何路由參數。總之,我們要確保ASP.NET頁面會產生實際內容,因為此請求知道所有路由參數(如CategoryName)的值。一個傳達這樣的資訊的辦法是,把它們放在HttpContext.Items集合中—此集合擔當儲存特定長度的請求資訊的資料存放區資訊庫的作用。
(3)返回執行上述處理的ASP.NET頁面或HTTP處理常式的執行個體。
通常,這些路由處理常式類具有差不多相似的特徵。你把路由參數儲存到HttpContext.Items集合中,然後建立並返回一個負責產生該網址對應內容的ASP.NET頁面的執行個體。儘管路由處理類具有相似特徵,但是編寫這些類是一項冗長的任務,因為每個新路由都需要一個新的處理常式類,而此類需要實現幾乎與前一個類同樣的任務。
在ASP.NET 3.5 SP1中使用ASP.NET路由的另一種挑戰主要與負責產生最終內容的ASP.NET頁面相關。此頁面必須從HttpContext.Items集合((或其它其他儲存它們的路由處理常式類)中讀出路由參數。此外,為一個超連結或Response.Redirect調用產生路由友好的URL(如Categories/CategoryName)的文法也有點冗長和混亂。
在ASP.NET 4.0中,路由支援得到了增強,包括一些新的路由相關的方法,從而使定義映射到實際ASP.NET頁面的路由規則更加簡單。在ASP.NET 4.0中,你不再需要建立自訂路由處理常式類作為中介,而只需要從Global.asax檔案中的路由規則中直接引用ASP.NET頁面即可。當從路由規則中指定一個ASP.NET頁面時,路由參數被自動儲存在一個新的RouteData集合中,此集合可以從ASP.NET頁面中通過Page.RouteData結構進行訪問。更重要的是,在.NET架構4.0中包括一個自訂參數控制項,這樣一來,你可以使用聲明的方式從ASP.NET的資料來源控制項(如SqlDataSource和LinqDataSource等)中使用RouteData中的值,而且也提供了一些方法來產生路由友好的URL,以及重新導向到路由友好的網址。
本文將重點討論ASP.NET在ASP.NET 4.0中的路由系統改進支援。本文提供的示範程式是一個Web表單應用程式,這是一個羅斯文商貿網站的前端。它使用了ASP.NET路由支援來創造簡潔且搜尋引擎友好的網址。例如,/Categories/All將顯示所有類別,Categories/Beverages將列出屬於飲料類的所有產品,而/Products/Chai將顯示有關產品Chai的細節資訊。
請注意,為了在ASP.NET 3.5 SP1中使用ASP.NET路由支援,你需要明確地在你的項目中添加對System.Web.Routing程式集的引用,並需要添加一些標記到Web.config設定檔中。這些步驟在使用ASP.NET 4.0時不再需要,而且,在Global.asax檔案中用於定義路由規則的文法更為短小、簡單和具有可讀性。