2009-05-20 8 views
1

私はPhil Haack's WebFormsのURLルーティングを使用しています。私は「動的」なルートを定義したいと思います。のは、私はこのルートを持っているとしましょう:WebFormsのカスタム/ダイナミックルーティング

「{あらゆる} .aspxの」 - に行く - >「〜/ PageProcessor.aspx」

これはPageProcessorページに物理ページはありませんすべての要求を取ります。これは素晴らしいです。問題は、データベースからのデータに基づいて、DifferentPageProcessor.aspxと言いましょう。別のプロセッサにルーティングする特定のページが必要です。最初のものがすべてをキャッチするため、すべての.aspxファイルをキャッチする新しいルートを定義することはできません。

"ルータ"がPageProcessorに持ち込み、必要に応じてPageProcessorまたはDifferentPageProcessorのいずれかにフォークすることを決定する前に、リクエストを処理する方法が必要です。これは可能ですか?

ありがとうございました。

答えて

2

私の解決策 - 誰かがより優雅なものを思い付かない限り、WebFormRoutingプロジェクトのWebFormRouteHandlerクラスを変更してカスタム述部を受け入れることでした。

public WebFormRouteHandler(string virtualPath, bool checkPhysicalUrlAccess, Func<RequestContext, string> custom) 

はその後、クラス内で私は、プライベートCustomVirtualPathプロパティにカスタムパラメータを格納します。これを使用するには、私はこれにGetSubstitutedVirtualPathを変更しなければならなかった:コンパイルするためのプロジェクトのために

public string GetSubstitutedVirtualPath(RequestContext requestContext) 
{ 
    string path = VirtualPath; 

    if (CustomVirtualPath != null) 
    { 
    path = CustomVirtualPath(requestContext); 
    } 

    if (!path.Contains("{")) return path; 

    //Trim off ~/ 
    string virtualPath = path.Substring(2); 

    Route route = new Route(virtualPath, this); 
    VirtualPathData vpd = route.GetVirtualPath(requestContext, requestContext.RouteData.Values); 
    if (vpd == null) return path; 
    return "~/" + vpd.VirtualPath; 
} 

を我々はチェーンダウンカスタムパラメータの受け渡しを可能にしWebFormRouteとWebFormRouteExtensionsを変更する必要があります。すべてが終わったとき、私は、ラムダ式の本体は、いくつかの他の場所(データベースまたはキャッシュ)からURLを調べる必要がありますglobal.asax.csもちろん

routes.MapWebFormRoute("All", "{any}.aspx", "~/", false, 
         context => 
          { 
          return ((string)context.RouteData.Values["any"] == "test" 
             ? "~/PageProcessor.aspx" 
             : "~/DifferentPageProcessor.aspx"); 
          }); 

でこれを書くことができます。

0

それはVBでですが、これは、私はそれを行う方法です:

これはあなたと同じこと
Routes.Add("Root", New Route("{*URLRequest}", New myRootRouteHandler())) 

が、それは全体の要求をキャッチするが、それはその後、私自身のカスタムルートハンドラクラスにそれを渡します。

Imports System.Web.Routing 
Imports System.Security 
Imports System.Web.Compilation 
Imports System.Web 

Public Class myRootRouteHandler 
    Implements IRouteHandler 
    Implements IRequiresSessionState 

    Private Path As String 

    Public Function GetHttpHandler(ByVal requestContext As RequestContext) As IHttpHandler Implements IRouteHandler.GetHttpHandler 
    Dim url As String = Web.HttpContext.Current.Request.ServerVariables("SERVER_NAME") 
    Dim Key As String = requestContext.RouteData.Values("URLRequest") 
    Dim myConfig As New LoadMyConfig(url) 
    Dim aspxToLoad As String = myConfig.getPageVirtualPath(Key) 
    Dim page As myCustom_Page_Base = TryCast(BuildManager.CreateInstanceFromVirtualPath(aspxToLoad, GetType(myCustom_Page_Base)), myCustom_Page_Base) 

    page.RequestContext = requestContext 
    page.strRequestContext = Key 
    page.mySettings = myConfig 

    Return page 

End Function 

私の例では、私のプロジェクトのすべてのaspxページが自動的に特定のプロパティを継承するようにSystem.ui.pageをオーバーロードしています。たとえば、アプリケーション設定を含むmySettingsオブジェクト..これは私がmyCustom_Page_Base標準ページとして読み込むことができます。

重要なビットは次のようになります。これは、あなたがそれを指して何のaspxファイルをロードしますBuildManager.CreateInstanceFromVirtualPath方法..このことができます

・ホープ..

関連する問題