2010-04-24 112 views
12

我有一个简单的方法,当使用ASP.NET 4.0路由与Web窗体产生一个路径,将作为某种通配符?asp.net 4.0 web窗体路由 - 默认/通配符路由

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

http://somedomain.com/folder1/folder2/page将可能映射到文件夹1 /文件夹2/page.aspx

有什么建议?

感谢

回答

22

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

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

这在有些奇怪的地方被打破了,以防止水平滚动,但是您可以获得整体观点。再次确认这是最后路线,否则它会处理全部您的路线。

+0

是否有可能然后做这样的事情: Dim prospect As String = Page.RouteData.Values(“* value”) 我知道它是当它不是通配符,但通配符呢? – davemackey 2012-05-10 14:57:17

+1

我收到以下错误。我错过了什么? (.Net 4.5) System.Web.Routing.RouteBase'不包含'Url'的定义,并且没有找到接受'System.Web.Routing.RouteBase'类型的第一个参数的扩展方法'Url'你错过了一个使用指令或程序集引用?) – HGMamaci 2014-02-16 21:38:38

0

另外 - 请记住,你需要添加一个异常的个.axd文件在Global.asax文件中是否有验证控件在你的web应用程序:

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

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

+0

链接是私人的,或博客是私人的。 – GoldBishop 2017-10-08 17:15:37