当使用带有 Web 窗体的 ASP.NET 4.0 路由来生成将充当某种通配符的路由时,我有一种简单的方法吗?
在我看来,在 WebForms 中,您必须为每个页面指定一个路由 - 我正在寻找某种通用路由,可以在不需要任何特定内容的情况下使用,也许直接从路径映射到路径,所以......
http://somedomain.com/folder1/folder2/page可能会映射到 folder1/folder2/page.aspx
有什么建议么?
谢谢
当使用带有 Web 窗体的 ASP.NET 4.0 路由来生成将充当某种通配符的路由时,我有一种简单的方法吗?
在我看来,在 WebForms 中,您必须为每个页面指定一个路由 - 我正在寻找某种通用路由,可以在不需要任何特定内容的情况下使用,也许直接从路径映射到路径,所以......
http://somedomain.com/folder1/folder2/page可能会映射到 folder1/folder2/page.aspx
有什么建议么?
谢谢
您可以像这样匹配所有剩余的路线:
routes.MapPageRoute("defaultRoute", "{*value}", "~/Missing.aspx");
在这种情况下,我们知道所有路由,并希望将任何其他内容发送到“缺失”/404 页面。请务必将此作为最后一条路线,因为它是通配符并且会捕获所有内容。
或者,您可以以相同的方式注册路由,但在内部会映射到页面,如下所示:
routes.Add(new Route("{*value}", new DefaultRouteHandler()));
该处理程序类将执行您的通配符映射,如下所示:
public class DefaultRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
//Url mapping however you want here:
var pageUrl = requestContext.RouteData.Route.Url + ".aspx";
var page = BuildManager.CreateInstanceFromVirtualPath(pageUrl, typeof(Page))
as IHttpHandler;
if (page != null)
{
//Set the <form>'s postback url to the route
var webForm = page as Page;
if (webForm != null)
webForm.Load += delegate { webForm.Form.Action =
requestContext.HttpContext.Request.RawUrl; };
}
return page;
}
}
这在奇怪的地方被打破了一点,以防止水平滚动,但你得到了整体观点。同样,确保这是最后一条路线,否则它将处理 您的所有路线。
此外 - 请记住,如果您的 Web 应用程序中有验证控件,您需要为 Global.asax 文件中的 .axd 文件添加一个例外:
否则,您将不断收到语法错误,因为路由选择了 .axd 文件并且没有正确加载验证控件所需的 JavaScript 文件。