在這篇教程中,你會學習到如何為ASP.NET MVC應用程式添加自訂路由。你會學習如何將Global.asax檔案中的預設路由表修改為自訂路由。
對於簡單的ASP.NET MVC應用程式,預設的路由表已經可以很好的完成工作了。然而,你可能發現會存在特定的路由需求。在這種情況下,你可以建立一個自訂路由。
設想一下,舉個例子,你正在建立一個部落格應用程式。你可能想要像這樣處理即將到來的請求:
/LingLing/10-28-1987
當使用者輸入這一請求,你想要返回對應於日期10/28/1987的部落格條目。為了處理這種類型的請求,你需要建立一個自訂路由。
以下代碼中的Global.asax包含了一個新的自訂路由,命名為了Blog,它處理了類似/LingLing/條目日期 這樣的請求。
using System.Web.Mvc;using System.Web.Routing;namespace MvcApplication1{ public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Blog", // Route name "LingLing/{entryDate}", // URL with parameters new { controller = "LingLing", action = "Entry" } // Parameter defaults ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } }}
添加到路由表中的路由順序非常重要。我們的新自訂Blog路由在現有的Default路由前面。如果你將這個順序顛倒過來,那麼Default路由將總是被調用,而不是自訂路由。
自訂Blog路由匹配任何以/Archive/作為開始的請求。因此,它匹配所有下面的URL:
/LingLing/12-25-2009
/LingLing/10-6-2004
/LingLing/apple
自訂路由將即將到來的請求映射到名為Archive的控制器,並且調用了Entry()動作。當調用Entry()方法時,條目日期作為entryDate參數進行了傳遞。
using System;using System.Web.Mvc;namespace MvcApplication1.Controllers{ public class ArchiveController : Controller { public string Entry(DateTime entryDate) { return "You requested the entry from " + entryDate.ToString(); } }}
注意到代碼 中的Entry()方法接受一個DateTime類型的參數。MVC架構非常的聰明,足以自動地將URL中的條目日期轉換為DateTime值。如果URL中的條目日期參數不能轉換為DateTime,將會引發錯誤