2008-08-27 93 views
10

我想忽略多个通配符路由。随着asp.net的MVC预览4,它们附带:Asp.Net路由:如何忽略多个通配符路由?

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

我还想添加类似:

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

,但似乎打破一些,在生成URL佣工我程序。思考?

回答

13

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

  1. 向忽略路由添加一个约束,以确保只有被忽略的请求能够匹配该路由。有点kludgy,但它应该工作。

    RouteTable.Routes.IgnoreRoute("{folder}/{*pathInfo}", new {folder="content"}); 
    
  2. 什么是在您的内容目录中?默认情况下,路由不会路由存在于磁盘上的文件(实际上会检查VirtualPathProvider)。因此,如果您将静态内容放入Content目录中,则可能不需要忽略路由。

5

这可能是相当棘手。

当试图弄清楚如何路由数据映射到一个路径,系统直到找到一些地方提供所有所需的信息,然后充塞其他一切查询参数搜索目前自上而下的。由于路线“Content/{* pathInfo}”的所需信息始终完全满足(在此路线中根本不需要数据),并且它靠近路线列表的顶部,所以您尝试映射到未命名的路线将匹配此模式,并且您的所有网址都将基于此(“Content?action = foo & controller = bar”)

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

IMO,复杂的路由使路由动作系统基本翻倒。在除默认路由之外的其他应用中,我几乎总是最终恢复到基于命名路由的URL生成,以确保我始终获得正确的路由。