共用方式為


HOW TO:以 Web Form 進行路由

更新:2007 年 11 月

ASP.NET 路由可以讓處理沒有對應到 Web 應用程式中實體檔案的 URL 要求。根據預設,會在 ASP.NET 應用程式中啟用 ASP.NET 路由以配合動態資料或 MVC 架構,但是不會在 ASP.NET 網站專案中啟用路由。因此,若要在 ASP.NET 網站中使用路由,必須完成啟用步驟。

若要啟用路由,必須變更應用程式的組態檔,以註冊路由組件並且將 UrlRoutingModule 類別以模組加入。同時,必須建立路由的自訂路由處理常式。處理常式會實作 IRouteHandler 介面,並且建立會做為要求實際端點之 Web Form (.aspx 檔案) 的執行個體。最後,必須定義會由該處理常式處理的路由。本主題將說明如何執行這些步驟。

觀賞影片 (英文) 認識這項功能。

若要設定使用路由的 ASP.NET 網站專案

  1. 在應用程式的 Web.config 檔中,將 ASP.NET 路由組件加入到 assemblies 項目,如下範例所示:

    <add assembly="System.Web.Routing, Version=3.5.0.0, 
      Culture=neutral, 
      PublicKeyToken=31BF3856AD364E35"/>
    
  2. 如果應用程式是在 IIS 6.0 或 IIS 7.0 傳統模式下執行,請將 UrlRoutingModule 類別加入到 httpModules 項目,如下範例所示:

    <httpModules>
      <add name="UrlRoutingModule" 
           type="System.Web.Routing.UrlRoutingModule, 
                 System.Web.Routing, 
                 Version=3.5.0.0, 
                 Culture=neutral, 
                 PublicKeyToken=31BF3856AD364E35"/>
    </httpModules>
    
  3. 如果應用程式是在 IIS 7.0 整合模式下執行,請將 UrlRoutingModule 類別加入到 modules 項目,如下範例所示:

    <system.webServer>
      <modules>
        <remove name="UrlRoutingModule" />
        <add name="UrlRoutingModule" 
             type="System.Web.Routing.UrlRoutingModule, 
                   System.Web.Routing, 
                   Version=3.5.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=31BF3856AD364E35"/>
      </modules>
    </system.webServer>
    
  4. 如果應用程式是在 IIS 7.0 整合模式下執行,請將 UrlRoutingHandler 類別加入到 handlers 項目,如下範例所示:

    <system.webServer>
      <handlers>
        <add name="UrlRoutingHandler" 
             preCondition="integratedMode" 
             verb="*" 
             path="UrlRouting.axd" 
             type="System.Web.HttpForbiddenHandler, 
                   System.Web, Version=2.0.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=b03f5f7f11d50a3a" />
      </handlers>
    </system.webServer>
    

若要建立處理常式

  1. 建立實作 IRouteHandler 介面的類別。

  2. 實作 GetHttpHandler 方法。若要指定做為要求端點的特定 Web Form (.aspx 檔案),請從 GetHttpHandler 方法傳回該 Web Form 的執行個體。

    下列範例會示範實作 IRouteHandler 介面的 CustomRouteHandler 類別。GetHttpHandler 方法會呼叫 CreateInstanceFromVirtualPath 方法,以建立特定 Web Form 的執行個體。該執行個體會以要求的端點傳回。

    Public Class CustomRouteHandler
        Implements IRouteHandler
    
        Private _virtualPath As String
    
        Public Sub New(ByVal vPath As String)
            _virtualPath = vPath
        End Sub
    
        Public Property VirtualPath() As String
            Get
                Return _virtualPath
            End Get
            Private Set(ByVal value As String)
                _virtualPath = value
            End Set
        End Property
    
        Public Function GetHttpHandler(ByVal requestContext _
              As System.Web.Routing.RequestContext) _
              As System.Web.IHttpHandler _
              Implements System.Web.Routing.IRouteHandler.GetHttpHandler
            Dim redirectPage As IHttpHandler
            redirectPage = _
              BuildManager.CreateInstanceFromVirtualPath(VirtualPath, _
              GetType(Page))
            Return redirectPage
        End Function
    End Class
    
    public class CustomRouteHandler : IRouteHandler
    {
        public CustomRouteHandler(string virtualPath)
        {
            this.VirtualPath = virtualPath;
        }
    
        public string VirtualPath { get; private set; }
    
        public IHttpHandler GetHttpHandler(RequestContext 
              requestContext)
        {
            var page = BuildManager.CreateInstanceFromVirtualPath
                 (VirtualPath, typeof(Page)) as IHttpHandler;
            return page;
        }
    }
    

若要註冊自訂處理常式

  1. 如果 Web 應用程式還沒有 Global.asax 檔案,請加入這個檔案。

  2. 將指示詞加入到會匯入 System.Web.Routing 命名空間的 Global.asax 檔案,如下範例所示:

    <%@ Import Namespace="System.Web.Routing" %>
    
  3. 在 Global.asax 檔案中建立方法,這個方法能夠將路由定義加入到 RouteTable 類別的 Routes 屬性。

  4. 從 Application_Start 事件處理常式呼叫該方法。

    在下列程式碼範例中,方法會將名為 CustomRouteHandler 的類別註冊為符合 bikes/sale 之要求的處理常式。

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        RegisterRoutes(RouteTable.Routes)
    End Sub
    
    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.Add("BikeSaleRoute", New Route _
        ( _
           "bikes/sale", New CustomRouteHandler("~/Contoso/Products/Details.aspx") _
        ))
    End Sub
    
    void Application_Start(object sender, EventArgs e) 
    {
        RegisterRoutes(RouteTable.Routes);
    }
    
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.Add("BikeSaleRoute", new Route
        (
           "bikes/sale", 
           new CustomRouteHandler("~/Contoso/Products/Details.aspx")
        ));
    }
    

請參閱

概念

ASP.NET 路由

HTTP 處理常式和 HTTP 模組概觀