HOW TO:定義路由
更新:2007 年 11 月
您可以使用 ASP.NET 路由處理沒有對應到網站中實體檔案的 URL 要求。定義 URL 的規則,並且指定要叫用做為要求回應的處理常式,即可建立路由。
定義路由時,可以指定在 URL 要求中遺失參數時,能夠使用的預設值。您也可以指定條件約束,確保參數包含有效的值。
您可以使用在應用程式中路由產生 URL,例如動態建立超連結的 URL。建構一個 URL 時,可能同時會有多個路由定義符合您所提供的參數。這時候,您可以提供於註冊路由時指定的路由名稱,指定要使用哪一個路由建立 URL。
建立路由
您可以建立符合 URL 規則的路由,並且指定要如何處理該 URL 規則的要求。
若要建立路由
將會建立 Route 類別的方法,加入到 Global.asax 檔案。在類別建構函式中,將 url 參數設為用於比對 URL 要求的 URL 規則,並且將 routeHandler 參數設為會處理該要求的類別執行個體。
如果某個 URL 要求包含的參數比路由中定義的還要多,但是您仍然想要某一個路由能夠符合該要求,可以在 URL 規則中加入一個 catch-all 參數。若要加入 catch-all 參數,請在最後一個參數名稱的前面,加上一個星號 (*)。
如果想要指定路由參數的預設值,請設定 Defaults 屬性。
如果想要驗證參數值,請將 Constraints 屬性設定為下列其中一項:
會定義規則運算式的字串。規則運算式會區分大小寫。
實作 IRouteConstaint 介面與包含 Match 方法的物件。
將 Route 物件加入到 RouteTable 物件的 Routes 屬性。如果想要指定路由名稱,請呼叫 Add 方法,否則呼叫 Add 方法。
在 Global.asax 檔案的 Application_Start 處理常式中,呼叫在第一個步驟中加入的方法。
範例
以下範例示範名為 RegisterRoutes 的方法,這個方法在 Global.asax 檔案中由 Application_Start 呼叫。這個方法會加入兩個同時有年份及地區設定參數的 Route 物件。產生 URL 時,路由可以由名稱進行區分。範例中會示範如何以具名路由的方式,加入這些路由。此外,這些路由也有條件約束、預設值以及 catch-all 參數。
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RegisterRoutes(RouteTable.Routes)
End Sub
Shared Sub RegisterRoutes(routes As RouteCollection)
Dim salesUrlPattern As String
Dim expensesUrlPattern As String
Dim salesRoute As Route
Dim expensesRoute As Route
salesUrlPattern = "SalesReport/{locale}/{year}/{*queryvalues}"
salesRoute = New Route(salesUrlPattern, New SalesRouteHandler)
salesRoute.Constraints = New RouteValueDictionary(New With _
{.locale = "[a-z]{2}-[a-z]{2}", .year = "\d{4}"})
salesRoute.Defaults = New RouteValueDictionary(New With _
{.locale = "en-US", .year = DateTime.Now.Year.ToString()})
routes.Add("SalesRoute", salesRoute)
expensesUrlPattern = "ExpensesReport/{locale}/{year}/{*queryvalues}"
expensesRoute = New Route(expensesUrlPattern, New ExpensesRouteHandler)
expensesRoute.Constraints = New RouteValueDictionary(New With _
{.locale = "[a-z]{2}-[a-z]{2}", .year = "\d{4}"})
expensesRoute.Defaults = New RouteValueDictionary(New With _
{.locale = "en-US", .year = DateTime.Now.Year.ToString()})
routes.Add("ExpensesRoute", expensesRoute)
End Sub
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add("SalesRoute", new Route
(
"SalesReport/{locale}/{year}/{*queryvalues}"
, new SalesRouteHandler()
)
{
Constraints = new RouteValueDictionary
{{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}},
Defaults = new RouteValueDictionary
{{"locale", "en-US"}, {"year", DateTime.Now.Year.ToString()}}
});
routes.Add("ExpensesRoute", new Route
(
"ExpensesReport/{locale}/{year}/{*queryvalues}"
, new ExpensesRouteHandler()
)
{
Constraints = new RouteValueDictionary
{{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}},
Defaults = new RouteValueDictionary
{{"locale", "en-US"}, {"year", DateTime.Now.Year.ToString()}}
});
}