ASP.NET MVC 的URL路由介紹
在這個教程中,向你介紹每個ASP.NET MVC一個重要的特點叫做URL路由。URL路由模塊是負責(zé)映射從瀏覽器請求到特定的控制器動作。
在教程的第一部分,你將學(xué)習(xí)標準路由表如何映射到控制器的動作。在教程第二部分,你將學(xué)習(xí)如何修改默認路由表成為自定義路由。
使用默認路由表
當(dāng)你創(chuàng)建一個新的ASP.NET MVC 應(yīng)用程序,應(yīng)用程序已經(jīng)配置了默認的URL路由。URL路由在兩個地方設(shè)置。
第一,URL路由配置在你的應(yīng)用程序WEB配置文件中(Web.config文件)。文件中有四個有關(guān)路由的配置節(jié):system.web.httpModules節(jié),system.web.httpHandlers節(jié),system.webserver.modules節(jié),和system.webserver.handlers節(jié)。小心不要刪除這些配置節(jié),因為沒有這些配置節(jié)路由將不在工作。
第二,更為重要的是,一個路由表在應(yīng)用程序的Global.asax文件中創(chuàng)建。Global.asax文件是一個特別的文件,它包含了ASP.NET應(yīng)用程序生命周期事件處理。當(dāng)Application Start事件開始,路由被創(chuàng)建。
圖1是一個ASP.NET MVC應(yīng)用程序的默認Global.asax文件。
圖 1 – Global.asax.cs
當(dāng)一個ASP.NET MVC應(yīng)用程序第一次運行時, Application_Start()方法被調(diào)用。這個方法,又調(diào)用RegisterRoutes()方法,RegisterRoutes()方法創(chuàng)建了路由表。
默認的路由本包含一個路由(命名Default).默認路由第一段URL映射到一個控制器名字,第二段URL映射到一個動作,第三段映射到一個參數(shù)叫Id.
想象你在瀏覽器地址欄輸入以下URL:
/Home/Index/3
默認路由映射以下這些參數(shù):
controller = Home
action = Index
id = 3
當(dāng)你請求URL /Home/Index/3,以下代碼會被執(zhí)行:
HomeController.Index(3)
默認路由包括默認的三個參數(shù)。如果你提供一個控制器,那默認控制器參數(shù)值就是Home.如果你不提供一個動作,那默認動作參數(shù)的值就是Index.最后,如果你不提供一個id,那id參數(shù)默認是一個空字符串。
讓我們看一些默認路由如何映射URL到控制器動作的示例。想象你在瀏覽器地址欄輸入以下URL:
/Home
因為默認路由參數(shù),這個URL會引起HomeController 類的Index()方法如圖2被調(diào)用。
圖2 – HomeController.cs
在圖2中, HomeController類包含一個叫Index()的方法,它接受單個叫Id的參數(shù)。URL /Home 引起值為空字符串Id參數(shù)的 Index()被調(diào)用。
因為ASP.NET MVC框架調(diào)用控制器動作這個方式,the URL /Home 也匹配圖3中的HomeController類 Index()方法。
圖 3 – HomeController.cs (無參數(shù)的Index action)
圖3中這個Index()方法不接受任何參數(shù)。URL /Home 將引起Index()的方法被調(diào)用。URL /Home/Index/3 也調(diào)用這個方法。(Id是被忽略的)
URL /Home 也匹配圖4 中HomeController類Index()方法
圖 4 – HomeController.cs (可空參數(shù)Index action)
圖4中, Index()有一個整型方法. 因為參數(shù)是可空類型 (值能夠為空), Index() 調(diào)用不能產(chǎn)生錯誤。
最后,圖5中調(diào)用Index(),URL /Home引起一個異常從Id參數(shù)不是可空類型參數(shù),如果你嘗試調(diào)用Index()方法,你得來以一個錯誤頁面:
圖5 – HomeController.cs (Index action with)
URL /Home/Index/3, 另一方面, 圖5中控制器 Index 動作是可以工作的。The 請求 /Home/Index/3 引發(fā)帶一個值為3 Index() 方法被調(diào)用。
創(chuàng)建自定義路由
對于許多簡碟的ASP.NET MVC 應(yīng)用程序,默認路由表足夠了。但是,你可能發(fā)現(xiàn)你有特別路由的需要。在這個案例中,你能創(chuàng)建一個自定義路由。
想象下,例如,你寫一個BLOG應(yīng)用程序,你可能要處理像這樣的請求:
/Archive/12-25-2009
當(dāng)一個用戶發(fā)起這個請求,你要返回一個符合12/25/2009日期的BLOG。因此處理這樣的請求,你需要創(chuàng)建一個自定義路由。
圖6中Global.asax文件包含一個新的自定義路由,叫做Blog,處理像這樣/Archive/entry date的請求。
圖 6 – Global.asax (自定義路由)
路由表中你增加的路由順序是很重要的。我們自定義Blog路由是增加在默認路由之前的。假如你搞反了,那默認路由將永遠替代調(diào)用自定義路由。
自定義Blog路由匹配任何/Archive/開始請求,所以它匹配所有以下URLs:
/Archive/12-25-2009
/Archive/10-6-2004
/Archive/apple
這個自定義路由映射進來的請求到一個名叫Archive控制器同時調(diào)用Entry()方法,當(dāng)Entry()方法被調(diào)用時,進入日期轉(zhuǎn)成一個名叫entryDate參數(shù)。
在圖7中 你能使用控制器與BLOG自定義路由。
圖 7 – ArchiveController.cs
注意圖7中的Entry()方法接受一個DateTime 類型的參數(shù).ASP.NET MVC 框架是智能的,它能從URL的DateTime的值自動的轉(zhuǎn)換為entry date。如果entry date從URL不能轉(zhuǎn)換為DateTime,將引出錯誤。
總結(jié)
教程的目的提供你關(guān)于URL路由一段簡短的介紹。第一,我們檢驗了你拿到一個新的ASP.NET MVC 應(yīng)用程序的默認路由表。你學(xué)習(xí)到了默認路由表是如何把URL映到控制器動作的。
接下來,你學(xué)習(xí)了如何創(chuàng)建一個自定義路由表。你學(xué)習(xí)了如何在Global.asax文件中增加一個自定義路由表描述blog進入點。我們討論如何映射請求blog進入點到一個名叫ArchiveController的控制器名叫Entry()的動作。
|