|
從.NET框架3.5 SP1開始,微軟推出了ASP.NET路由支持,從而實現了特定資源的URL與其對應的Web服務器上的物理文件之間的徹底解耦。借助于ASP.NET路由支持,開發人員可以定義一組路由規則,從而實現把路由模式映射到一個生成相應內容的類。例如,你可以把URLCategories/CategoryName映射到一個類,該類接收CategoryName而最終生成對應于此種類的產品信息顯示于一個網格中的一組HTML標記。有了這樣的映射,用戶便可以通過訪問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路由能夠干凈地實現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文件中用于定義路由規則的語法更為短小、簡單和具有可讀性。
本文后面的內容將給出在ASP.NET 4.0中使用ASP.NET路由的詳細步驟描述。
下面給出在ASP.NET 4.0中使用ASP.NET路由的詳細描述。
0. 前提
本文提供的演示程序使用了新添加到ASP.NET 4.0中的ASP.NET路由功能。如果你使用Visual Studio 2010或Visual Web Developer 2010(或更高版本),那么你正好具備了這一前提。
1.在文件Global.asax中定義路由規則
要使用ASP.NET路由系統,你需要在應用程序啟動時定義一個或多個路由。方法是,在你的項目中添加一個全局應用程序類文件(Global.asax)。在這個文件中,我們將在Application_Start事件中注冊這些路由。
定義于Global.asax文件中的路由指示什么樣的路由處理程序負責處理什么樣的URL模式。在MVC應用程序中,一種流行的模式是Controller/Action/ID;這意味著針對/Products/View/Aniseed Syrup或Categories/Edit/Beverages的請求將由配置的路由處理程序來處理。在應用程序中定義什么樣的路由方面,你可以擁有足夠的靈活性。例如,你可以定義模式的多個部分,定義缺少部分的默認值,甚至還要定義針對某些輸入類型的限制部分。
本文演示程序是一個簡單的數據驅動應用程序,它使用了Northwind數據庫,并接受下列模式的URL:
/Categories/All列出數據庫中所有產品類型;
/Categories/CategoryName列出相應于特定類型的產品信息;
/Products/ProductName顯示特定產品的信息。
因此,我在Global.asax文件的Application_Start事件處理程序中定義了三個路由,如以下代碼所示。(注:RouteTable對象和RouteCollection類位于System.Web.Routing命名空間。)
在Application_Start方法中,我們調用了RegisterRoutes,并傳遞進RouteCollection類型的參數RouteTable.Routes。接下來,在RegisterRoutes方法中,調用RouteCollection類的MapPageRoute方法,它定義了一個路由模式到ASP.NET頁面的路由映射。例如,在第一次調用MapPageRoute方法時,我們創建了一個命名為All Categories的路由模式它負責把路由模式Categories/All映射到ASP.NET頁面~/ AllCategories.ASPx。
接下來的兩個MapPageRoute方法調用使用參數創建路由模式。其中,View Product路由把模式Products/{ProductName}映射到ASP.NET頁面~/ ViewProduct.ASPx。這里,{ProductName}是一個參數,意味著任何Products/ProductName形式的請求都將被路由到~/ViewProduct.ASPx頁面。不久你就會看到,{ProductName}參數的值可以從頁面~/ViewProduct.ASPx中通過Page.RouteData參數加以訪問。
使用ASP.NET 4.0,你不再需要創建一個自定義的路由處理程序類。當你使用MapPageRoute方法時,這一切都會由底層庫為你自動完成。剩下的僅僅是,建立處理請求的ASP.NET頁面(AllCategories.ASPx,CategoryProducts.ASPx和ViewProduct.ASPx)。當然,本文示例中的這三個網頁相當簡單它們都使用數據源控件,并以編程方式綁定到通過路由參數獲取的Categories或者Products表格的數據庫結果。
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
void RegisterRoutes(RouteCollection routes)
{
// Register a route for Categories/All
routes.MapPageRoute(
"All Categories", //路由名
"Categories/All", //路由URL
"~/AllCategories.ASPx" //處理路由的網頁
);
//處理Categories/{CategoryName}的路由
//更多信息,請參考http://forums.ASP.NET/p/1417546/3131024.ASPx
routes.MapPageRoute(
"View Category", //路由名
"Categories/{*CategoryName}", //路由URL
"~/CategoryProducts.ASPx" //處理路由的網頁
);
// Register a route for Products/{ProductName}
routes.MapPageRoute(
"View Product", //路由名
"Products/{ProductName}", //路由URL
"~/ViewProduct.ASPx" //處理路由的網頁
);
}
NET技術:ASP.NET 4的Demo實踐:URL路由改進支持,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。