定義
URL Routing
在一個route中,經過在大括號中放一個佔位符來定義( { and } )。當解析URL的時候,符號"/"和"."被做爲一個定義符來解析,而定義符之間的值則匹配到佔位符中。route定義中不在大括號中的信息則做爲常量值。
下面是一些示例URL:
Valid route definitions
Examples of matching URL
{controller}/{action}/{id}
/Products/show/beverages
{table}/Details.aspx
/Products/Details.aspx
blog/{action}/{entry}
/blog/show/123
{reporttype}/{year}/{month}/{day}
/sales/2008/1/5
一般,咱們在Global.asax文件中的Application_Start事件中添加routes,這確保routes在程序啓動的時候就可用,並且也容許在你進行單元測試的時候直接調用該方法。若是你想在單元測試的時候直接調用它,註冊該routes的方法必需是靜態的同時有一個RouteCollection
參數。
下面的示例是Global.asax中的代碼,演示了添加一個包含兩個URL參數action 和 categoryName的Route對象:
protectedvoid Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
publicstaticvoid RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{action}/{categoryName}"
, new CategoryRouteHandler()
));
}
設置Route參數的默認值
當你定義個一route的時候,你能夠分配一個默認值給route的參數。默認值是當URL中沒有包含參數的值的時候使用的。你能夠在Route類中經過dictionary來設置Default屬性來設置route的默認值:
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
publicstaticvoid RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{action}/{categoryName}"
new CategoryRouteHandler()
)
{
Defaults =new RouteValueDictionary
{
{"categoryName", "food"},
{"action", "show"}}
}
);
}
當URL Routing處理URL Request的時候,上面route定義產生的結果以下表所示:
URL
Parameter values
/Category
action
= "show"
categoryName
= "food"
/Category/add
action
= "add"
categoryName
= "food"
/Category/add/beverages
action
= "add"
categoryName
= "beverages"
處理不肯定個數的參數
有時候你須要處理一個URL包含的參數是不肯定的URL請求。在你定義route的時候,你能夠設置最後一個參數包含一個星號,使最後一個參數匹配URL中剩下的參數。例如:
query/{queryname}/{*queryvalues}
當URL Routing處理URL Request的時候,上面route定義產生的結果以下表所示:
URL
queryvalues parameter
/query/select/bikes/onsale
"bikes/onsale"
/query/select/bikes
"bikes"
/query/select
Empty string
在匹配URL的時候添加約束
經過添加約束使URL參數在咱們的程序中能更好的工做。廢話很少說了,直接看代碼:
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
publicstaticvoid RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"{locale}/{year}"
, new ReportRouteHandler()
)
{
Constraints =new RouteValueDictionary
{
{"locale", "{a-z}{2}-{A-Z}{2}"},
{year, @"\d{4}"}}
});
}
當URL Routing處理URL Request的時候,上面route定義產生的結果以下表所示:
URL
Result
/en-US
No match. Both locale
and year
are required.
/en-us/2008
No match. The constraint on locale
requires the fourth and fifth characters to be uppercase.
/en-US/08
No match. The constraint on year
requires 4 digits.
/en-US/2008
locale
= "en-US"
year
= "2008"
從Routes中建立URL
當你想集中控制邏輯來構造URL時,你能夠使用routes來產生URLs。經過傳遞一個dictionary的參數值給RouteCollection對象的GetVirtualPath方法來建立一個URL。GetVirtualPath方法查找RouteCollection對象中第一個route中跟dictionary匹配的參數,匹配的route被用來產生URL。仍是看下面的示例:
publicstaticvoid RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{action}/{categoryName}"
new CategoryRouteHandler()
)
{
Defaults =new RouteValueDictionary
{
{"categoryName", "food"},
{"action", "show"}}
}
);
} 下面的示例演示了基於上面的route建立的URL: HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath (context, new RouteValueDictionary { { "categoryName", "beverages" }, {"action", "summarize" }} ).VirtualPath; 當代碼運行的時候,HyperLink1控件將會包含值"Category/summarize/beverages"在NavigateUrl屬性中。 注:以上參考自 http://quickstarts.asp.net/3-5-extensions/mvc/URLRouting.aspx