Asp.Net Routing:如何忽略多个通配符路由?

Posted

技术标签:

【中文标题】Asp.Net Routing:如何忽略多个通配符路由?【英文标题】:Asp.Net Routing: How do I ignore multiple wildcard routes? 【发布时间】:2008-08-27 14:38:39 【问题描述】:

我想忽略多个通配符路由。使用 asp.net mvc preview 4,它们附带:

RouteTable.Routes.IgnoreRoute("resource.axd/*pathInfo");

我还想添加以下内容:

RouteTable.Routes.IgnoreRoute("Content/*pathInfo");

但这似乎破坏了在我的程序中生成 url 的一些助手。想法?

【问题讨论】:

【参考方案1】:

这里有两种可能的解决方案。

    为忽略路由添加一个约束,以确保只有应该被忽略的请求才会匹配该路由。有点笨拙,但应该可以。

    RouteTable.Routes.IgnoreRoute("folder/*pathInfo", new folder="content");
    

    您的内容目录中有什么?默认情况下,Routing 不会路由磁盘上存在的文件(实际上是检查 VirtualPathProvider)。因此,如果您将静态内容放在 Content 目录中,则可能不需要忽略路由。

【讨论】:

【参考方案2】:

这可能相当棘手。

当试图弄清楚如何将路线数据映射到路线时,系统当前会自上而下搜索,直到找到提供所有必需信息的内容,然后将其他所有内容填充到查询参数中。

由于“Content/*pathInfo”路由所需的信息总是完全满足(此路由中根本不需要数据),并且它位于路由列表的顶部附近,因此您所有尝试映射到未命名的路由将匹配此模式,并且您的所有 URL 都将基于此 ("Content?action=foo&controller=bar")

不幸的是,行动路线无法解决这个问题。如果您使用命名路由(例如,选择 html.RouteLink 而不是 Html.ActionLink),那么您可以指定要匹配的路由的名称。它不太方便,但更精确。

IMO,复杂的路线使行动路线系统基本上崩溃。在我有默认路由以外的其他东西的应用程序中,我几乎总是最终恢复到基于命名路由的 URL 生成,以确保我总是得到正确的路由。

【讨论】:

以上是关于Asp.Net Routing:如何忽略多个通配符路由?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net Routing 用法

.NET/ASP.NET Routing路由(深入解析路由系统架构原理)

ASP.NET MVC2.0的Controller层如何接收多个参数?

NET/ASP.NET Routing路由(深入解析路由系统架构原理)(转载)

.NET/ASP.NET Routing路由(深入解析路由系统架构原理)

使 ASP.net MVC 5 Routing Ignore Async Suffix on Action 方法