私の解決策は、誰かがより洗練されたものを考え出さない限り、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 を検索する必要があります。