本文將重點(diǎn)討論ASP.NET在ASP.NET 4.0中的路由系統(tǒng)改進(jìn)支持。本文提供的演示程序是一個(gè)Web窗體應(yīng)用程序,這是一個(gè)羅斯文商貿(mào)網(wǎng)站的前端。它使用了ASP.NET路由支持來(lái)創(chuàng)造簡(jiǎn)潔且搜索引擎友好的網(wǎng)址。例如,/Categories/All將顯示所有類別,/Categories/Beverages將列出屬于飲料類的所有產(chǎn)品,而/Products/Chai將顯示有關(guān)產(chǎn)品Chai的細(xì)節(jié)信息。
請(qǐng)注意,為了在ASP.NET 3.5 SP1中使用ASP.NET路由支持,你需要明確地在你的項(xiàng)目中添加對(duì)System.Web.Routing程序集的引用,并需要添加一些標(biāo)記到Web.config配置文件中。這些步驟在使用ASP.NET 4.0時(shí)不再需要,而且,在Global.asax文件中用于定義路由規(guī)則的語(yǔ)法更為短小、簡(jiǎn)單和具有可讀性。
本文后面的內(nèi)容將給出在ASP.NET 4.0中使用ASP.NET路由的詳細(xì)步驟描述。
二、使用ASP.NET 4.0路由
下面給出在ASP.NET 4.0中使用ASP.NET路由的詳細(xì)描述。
0. 前提
本文提供的演示程序使用了新添加到ASP.NET 4.0中的ASP.NET路由功能。如果你使用Visual Studio 2010或Visual Web Developer 2010(或更高版本),那么你正好具備了這一前提。
1.在文件Global.asax中定義路由規(guī)則
要使用ASP.NET路由系統(tǒng),你需要在應(yīng)用程序啟動(dòng)時(shí)定義一個(gè)或多個(gè)路由。方法是,在你的項(xiàng)目中添加一個(gè)全局應(yīng)用程序類文件(Global.asax)。在這個(gè)文件中,我們將在Application_Start事件中注冊(cè)這些路由。
定義于Global.asax文件中的路由指示什么樣的路由處理程序負(fù)責(zé)處理什么樣的URL模式。在MVC應(yīng)用程序中,一種流行的模式是Controller/Action/ID;這意味著針對(duì)/Products/View/Aniseed Syrup或Categories/Edit/Beverages的請(qǐng)求將由配置的路由處理程序來(lái)處理。在應(yīng)用程序中定義什么樣的路由方面,你可以擁有足夠的靈活性。例如,你可以定義模式的多個(gè)部分,定義缺少部分的默認(rèn)值,甚至還要定義針對(duì)某些輸入類型的限制部分。
本文演示程序是一個(gè)簡(jiǎn)單的數(shù)據(jù)驅(qū)動(dòng)應(yīng)用程序,它使用了Northwind數(shù)據(jù)庫(kù),并接受下列模式的URL:
/Categories/All-列出數(shù)據(jù)庫(kù)中所有產(chǎn)品類型;
/Categories/CategoryName-列出相應(yīng)于特定類型的產(chǎn)品信息;
/Products/ProductName-顯示特定產(chǎn)品的信息。
因此,我在Global.asax文件的Application_Start事件處理程序中定義了三個(gè)路由,如以下代碼所示。(注:RouteTable對(duì)象和RouteCollection類位于System.Web.Routing命名空間。)
在Application_Start方法中,我們調(diào)用了RegisterRoutes,并傳遞進(jìn)RouteCollection類型的參數(shù)RouteTable.Routes.接下來(lái),在RegisterRoutes方法中,調(diào)用RouteCollection類的MapPageRoute方法,它定義了一個(gè)路由模式到ASP.NET頁(yè)面的路由映射。例如,在第一次調(diào)用MapPageRoute方法時(shí),我們創(chuàng)建了一個(gè)命名為"All Categories"的路由模式-它負(fù)責(zé)把路由模式Categories/All映射到ASP.NET頁(yè)面~/ AllCategories.aspx.
接下來(lái)的兩個(gè)MapPageRoute方法調(diào)用使用參數(shù)創(chuàng)建路由模式。其中,"View Product"路由把模式Products/{ProductName}映射到ASP.NET頁(yè)面~/ ViewProduct.aspx.這里,{ProductName}是一個(gè)參數(shù),意味著任何Products/ProductName形式的請(qǐng)求都將被路由到~/ViewProduct.aspx頁(yè)面。不久你就會(huì)看到,{ProductName}參數(shù)的值可以從頁(yè)面~/ViewProduct.aspx中通過(guò)Page.RouteData參數(shù)加以訪問(wèn)。
2.創(chuàng)建處理請(qǐng)求的ASP.NET頁(yè)面
使用ASP.NET 4.0,你不再需要?jiǎng)?chuàng)建一個(gè)自定義的路由處理程序類。當(dāng)你使用MapPageRoute方法時(shí),這一切都會(huì)由底層庫(kù)為你自動(dòng)完成。剩下的僅僅是,建立處理請(qǐng)求的ASP.NET頁(yè)面(AllCategories.aspx,CategoryProducts.aspx和ViewProduct.aspx)。當(dāng)然,本文示例中的這三個(gè)網(wǎng)頁(yè)相當(dāng)簡(jiǎn)單-它們都使用數(shù)據(jù)源控件,并以編程方式綁定到通過(guò)路由參數(shù)獲取的Categories或者Products表格的數(shù)據(jù)庫(kù)結(jié)果。
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" //處理路由的網(wǎng)頁(yè)
。;
//處理Categories/{CategoryName}的路由
routes.MapPageRoute(
"View Category", //路由名
"Categories/{*CategoryName}", //路由URL
"~/CategoryProducts.aspx" //處理路由的網(wǎng)頁(yè)
。;
// Register a route for Products/{ProductName}
routes.MapPageRoute(
"View Product", //路由名
"Products/{ProductName}", //路由URL
"~/ViewProduct.aspx" //處理路由的網(wǎng)頁(yè)
。;
}
本文演示程序使用LINQ-to-SQL工具實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)。你會(huì)在App_Code文件夾下發(fā)現(xiàn)一個(gè)Northwind.dbml文件,它創(chuàng)建了一個(gè)NorthwindDataContext類。ViewProduct.aspx頁(yè)面中包含一個(gè)DetailsView控件,其中的字段用于顯示產(chǎn)品的名稱,供應(yīng)商,單位數(shù)量,價(jià)格以及其他相關(guān)信息。頁(yè)面的代碼隱藏類具有以下(省略了部分)代碼:
![]() | ![]() .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書(shū)籍 |
![]() | ![]() .. 定價(jià):¥133 優(yōu)惠價(jià):¥133.0 更多書(shū)籍 |