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

时间:2010-04-24 11:50:21

标签: asp.net routing asp.net-4.0 wildcard-mapping

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

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

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

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:23)

您可以匹配所有剩余的路线:

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;
  }
}

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

答案 1 :(得分:0)

此外 - 请记住,如果您的网络应用中有验证控件,则需要为Global.asax文件中的.axd文件添加例外:

http://basgun.wordpress.com/2010/10/25/getting-syntax-error-in-asp-net-routing-due-to-webresource-axd/

否则,您将不断收到语法错误,因为路由选择.axd文件并且未正确加载验证控件所需的JavaScript文件。