1

Phil Haack のWebForms 用 URL ルーティングを使用しており、「動的」なルートを定義したいと考えています。このルートがあるとしましょう:

"{any}.aspx" -- 移動先 --> "~/PageProcessor.aspx"

これにより、物理ページではないすべてのリクエストが PageProcessor ページに送られます。これはうまくいきます。問題は、データベースから取得した一部のデータに基づいて、特定のページを別のプロセッサ (たとえば、DifferentPageProcessor.aspx など) にルーティングする必要があることです。最初のルートがすべてをキャッチするため、すべての .aspx ファイルをキャッチする新しいルートを定義できません。

したがって、「ルーター」が要求を PageProcessor に渡し、必要に応じて PageProcessor または DifferentPageProcessor にフォークすることを決定する前に、要求を処理する方法が必要です。これは可能ですか?

ありがとう。

4

2 に答える 2

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 を変更して、カスタム パラメーターをチェーンに渡すことができるようにする必要があります。すべてが完了したら、これを global.asax.cs に書き込むことができます

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

もちろん、ラムダ式の本体は、他の場所 (データベースまたはキャッシュ) から URL を検索する必要があります。

于 2009-05-20T21:58:42.747 に答える
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

私の例では、System.ui.page をオーバーロードして、プロジェクト内のすべての aspx ページが特定のプロパティを自動的に継承できるようにしました。たとえば、アプリの設定を含む mySettings オブジェクトなどです。通常のページとして。

重要な点は次のとおりです。BuildManager.CreateInstanceFromVirtualPath メソッドは、指定した aspx ファイルをロードします。

お役に立てれば..

于 2010-06-04T08:37:04.893 に答える