HOW TO:定義路由

更新:2007 年 11 月

您可以使用 ASP.NET 路由處理沒有對應到網站中實體檔案的 URL 要求。定義 URL 的規則,並且指定要叫用做為要求回應的處理常式,即可建立路由。

定義路由時,可以指定在 URL 要求中遺失參數時,能夠使用的預設值。您也可以指定條件約束,確保參數包含有效的值。

您可以使用在應用程式中路由產生 URL,例如動態建立超連結的 URL。建構一個 URL 時,可能同時會有多個路由定義符合您所提供的參數。這時候,您可以提供於註冊路由時指定的路由名稱,指定要使用哪一個路由建立 URL。

建立路由

您可以建立符合 URL 規則的路由,並且指定要如何處理該 URL 規則的要求。

若要建立路由

  1. 將會建立 Route 類別的方法,加入到 Global.asax 檔案。在類別建構函式中,將 url 參數設為用於比對 URL 要求的 URL 規則,並且將 routeHandler 參數設為會處理該要求的類別執行個體。

    如果某個 URL 要求包含的參數比路由中定義的還要多,但是您仍然想要某一個路由能夠符合該要求,可以在 URL 規則中加入一個 catch-all 參數。若要加入 catch-all 參數,請在最後一個參數名稱的前面,加上一個星號 (*)。

  2. 如果想要指定路由參數的預設值,請設定 Defaults 屬性。

  3. 如果想要驗證參數值,請將 Constraints 屬性設定為下列其中一項:

    • 會定義規則運算式的字串。規則運算式會區分大小寫。

    • 實作 IRouteConstaint 介面與包含 Match 方法的物件。

  4. Route 物件加入到 RouteTable 物件的 Routes 屬性。如果想要指定路由名稱,請呼叫 Add 方法,否則呼叫 Add 方法。

  5. 在 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()}}
       });
}

請參閱

工作

HOW TO:從路由建構 URL

概念

ASP.NET 路由