我的解决方案——除非有人提出更优雅的解决方案——是修改 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");
});
当然,lambda 表达式的主体应该从其他地方(数据库或缓存)查找 URL。