asp.net 4.0 Web表单路由 - 默认/通配符路由

Mar*_*ins 12 asp.net routing wildcard-mapping asp.net-4.0

我有一个简单的方法,当使用ASP.NET 4.0路由与Web窗体生成一个将充当某种通配符的路由?

在我看来,在WebForms中,你必须为每个页面指定一个路由 - 我正在寻找某种通用路由,可以在没有特定需要的地方使用,也许直接从路径映射到路径所以......

http://somedomain.com/folder1/folder2/page可能会映射到folder1/folder2/page.aspx

有什么建议?

谢谢

Nic*_*ver 24

您可以匹配所有剩余的路线,如下所示:

routes.MapPageRoute("defaultRoute", "{*value}", "~/Missing.aspx");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们知道所有路线,并希望将其他任何内容发送到"缺失"/ 404页面.请务必将此作为最后一条路线,因为它是一张通配符,可以捕捉所有内容.

或者,您可以以相同的方式注册路由,但在内部映射到页面,如下所示:

routes.Add(new Route("{*value}", new DefaultRouteHandler()));
Run Code Online (Sandbox Code Playgroud)

那个处理程序类会做你的通配符映射,如下所示:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这在奇怪的地方有点破坏,以防止水平滚动,但你得到整体点.再次确保这是最后一条路线,否则它将处理 所有路线.