ASP.NET MVC Routing概述
ASP.NET Routing模塊的責任是將傳入的瀏覽器請求映射為特有的MVC controller actions。
使用默認的Route Table
當你創建一個新的ASP.NET MVC應用程序,這個應用程序已經被配置用來使用ASP.NET Routing。 ASP.NET Routing 在2個地方設置。第一個,ASP.NET Routing 在你的應用程序中的Web配置文件(Web.config文件)是有效的。在配置文件中有4個與routing相關的代碼片段:system.web.httpModules代碼段,system.web.httpHandlers 代碼段,system.webserver.modules代碼段以及 system.webserver.handlers代碼段。千萬注意不要刪除這些代碼段,如果沒有這些代碼段,routing將不再運行。第二個,更重要的,route table在應用程序的Global.asax文件中創建。這個Global.asax文件是一個特殊的文件,它包含ASP.NET 應用程序生命周期events的event handlers。這個route table在應用程序的起始event中創將。
在Listing 1中包含ASP.NET MVC應用程序的默認Global.asax:
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名稱
"{controller}/{action}/{id}", // 帶有參數的 URL
new { controller = "Home", action = "Index",
id = UrlParameter.Optional } // 參數默認值
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
}
當一個MVC應用程序第一個啟動,Application_Start() 方法被調用,這個方法反過來調用RegisterRoutes() 方法。
這個默認的route table包含一個單一的route。這個默認的route將url的第一個段映射為一個controller名稱,url的第二個段映射為一個controller action,第三個段映射為命名為id的參數。
假如,你在網頁瀏覽器的地址欄中鍵入下面的url:/Home/Index/3,這個默認的route將這個url映射為下面的參數:
controller = Home controller名稱
action = Index controller action
id = 3 id的參數
當你請求/Home/Index/3這樣的url,下面的代碼將執行。HomeController.Index(3)
這個默認的route包含3個默認的參數。如果你沒有提供一個 controller,那么 controller默認為Home。同樣,action默認為Index,id參數默認為空字符串。
讓我們來看一些關于默認的route怎么映射urls為controller actions的例子。假如你在你的瀏覽器地址欄中輸入如下的url:/Home, 由于這些默認的route參數有一些相關的默認值,鍵入這樣的URL,將導致HomeController類的Index()方法(如Listing 2)被調用。
2 {
3 [HandleError]
4 public class HomeController : Controller
5 {
6 public ActionResult Index(string id)
7 {
8 ViewData["Message"] = " 歡迎使用 ASP.NET MVC!";
9
10 return View();
11 }
12
13 public ActionResult About()
14 {
15 return View();
16 }
17 }
18 }
19
20
在Listing 2中,這個HomeController 類包含一個名為Index()的方法。這個URL /Home導致Index()方法被調用,一個空的字符串將作為id參數的值。由于mvc框架調用controller actions的這種方式,這個URL /Home同樣匹配HomeController類中的Index()方法(如Listing 3)。
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
在Listing 3中,這個Index()方法不接收任何參數。這個URL /Home將導致Index()方法被調用。URL /Home/Index/3同樣調用這個方法(ID被忽略)。
public class HomeController : Controller
{
public ActionResult Index(int? id)
{
return View();
}
}
Listing 4 - HomeController.cs (Index action with nullable parameter)
public class HomeController : Controller
{
public ActionResult Index(int? id)
{
return View();
}
}
在Listing 4中, Index() 方法有一個整數參數. 由于這個參數是可空參數 , Index() 將被調用而不引起錯誤.
最后, 使用 URL /Home 來調用如Listing 5中的Index() 方法 將導致異常,因為這個ID參數不是一個可空的參數。如果你試圖去調用這個Index()方法,你將獲得如下圖所示的錯誤。
Listing 5 - HomeController.cs (Index action with Id parameter)
public class HomeController : Controller
{
public ActionResult Index(int id)
{
return View();
}
}
另一方面,使用如Listing 5中的Index controller action,URL /Home/Index/3運行正常。Index controller action in Listing 5. /Home/Index/3請求將導致Index()方法被調用,ID參數擁有一個3的值。
總結::這是一個關于ASP.NET Routing的簡要介紹. 應該了解了這個默認的route如何將URLs映射為controller actions。
創建自定義的Routes (C#)
這個教程,你將學會怎樣添加一個自定義的route到一個asp.net mvc應用程序。你將學會在Global.asax文件中,怎樣使用一個自定義的route來修改這個默認的route table。對于許多簡單的ASP.NET MVC 應用程序,這個默認的route table將運行得很好。然而,你可能發現,你可能特定的routing 需求。那樣的話,你可能需要創建一個自定義的route。
設想一下,例如,你正在建立一個博客應用程序,你可能想要去處理像/Archive/12-25-2009的輸入請求。當一個用戶鍵入這個請求,你想要返回與日期為12/25/2009相符的博客實體。為了處理這種類型的請求,你需要去創建一個自定義的route。
在 Listing 1中,這個Global.asax文件中包含一個新的名為Blog的自定義route,它處理類似于/Archive/entry date的請求。
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6 using System.Web.Routing;
7
8 namespace MvcRoutingApp
9 {
10 // 注意: 有關啟用 IIS6 或 IIS7 經典模式的說明,
11 // 請訪問 http://go.microsoft.com /?LinkId=9394801
12
13 public class MvcApplication : System.Web.HttpApplication
14 {
15 public static void RegisterRoutes(RouteCollection routes)
16 {
17 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
18 routes.MapRoute(
19 "Blog", // 路由名稱
20 "Archive/{entryDate}/{id}", // 帶有參數的 URL
21 new { controller = "Archive", action = "Entry", id = UrlParameter.Optional } // 參數默認值
22 );
23 routes.MapRoute(
24 "Default", // 路由名稱
25 "{controller}/{action}/{id}", // 帶有參數的 URL
26 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值
27 );
28
29 }
30
31 protected void Application_Start()
32 {
33 AreaRegistration.RegisterAllAreas();
34
35 RegisterRoutes(RouteTable.Routes);
36 }
37 }
38 }
你添加到route table的routes的順序是很重要的。我們新自定義的blog route在現存的默認route之前添加。如果你顛倒了順序,那么這個默認的route總是先調用而不是這個自定義的route。
這個自定義的blog toute匹配任何以 /Archive/ 開頭的請求。所以,它匹配所有下列URLs:
/Archive/12-25-2009
/Archive/10-6-2004
/Archive/apple
這個自定義的route將輸入的請求映射至名為Archive的controller,并且調用 Entry() action。當 Entry() action被調用的時候,這個輸入的日期被當作名為entryDate的參數。
Listing 2 - ArchiveController.cs
{
public string Entry(DateTime entryDate)
{
return "You requested the date:" + entryDate.ToString();
}
}
注意,在Listing 2中這個Entry()方法接收一個類型為DateTime的參數。MVC框架是足夠智能的,它自動將URL中輸入的date轉換為一個DateTime值。如果URL中輸入的date不能轉換為DateTime,錯誤將被引發。
總結:這個教程演示怎樣來創建一個自定義的route。你學會了怎樣在Global.asax 文件中添加一個自定義的route到route table。我們討論了怎樣為blog實體將請求映射為名為ArchiveController的controller,名為Entry()的controller action。
留言列表