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

时间:2020-03-05 18:43:53  来源:igfitidea点击:

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

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

我还想添加如下内容:

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

但这似乎破坏了一些在我的程序中生成url的帮助程序。有什么想法吗?

解决方案

回答

这可能非常棘手。

当试图找出如何将路线数据映射到路线时,系统当前从上至下搜索,直到找到可以提供所有必需信息的地方,然后将其他所有内容填充到查询参数中。

由于始终完全满足路线" Content / {* pathInfo}"的必需信息(此路线中根本没有必需的数据),并且该信息位于路线列表的顶部附近,因此所有尝试映射到未命名路线的尝试都会匹配此模式,我们所有的URL都将基于此(" Content?action = foo&controller = bar")

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

海事组织,复杂的路线使行动路由系统基本上崩溃了。在应用程序中,除了默认路由以外,我几乎总是返回到基于命名路由的URL生成,以确保始终获得正确的路由。

回答

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

  • 向忽略路由添加约束,以确保仅应忽略的请求将与该路由匹配。有点麻烦,但应该可以。
RouteTable.Routes.IgnoreRoute("{folder}/{*pathInfo}", new {folder="content"});
  • 内容目录中有什么?默认情况下,"路由"不路由磁盘上存在的文件(实际上会检查VirtualPathProvider)。因此,如果要将静态内容放入Content目录中,则可能不需要忽略路由。