我想忽略多个通配符路由。使用asp.net mvc预览版4,它们附带:
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
我还想添加以下内容:
RouteTable.Routes.IgnoreRoute("Content/{*pathInfo}");
但这似乎打破了我的程序中生成网址的一些助手。想法?
答案 0 :(得分:13)
这里有两种可能的解决方案。
向忽略路由添加约束,以确保只有应忽略的请求才会匹配该路由。有点kludgy,但它应该工作。
RouteTable.Routes.IgnoreRoute("{folder}/{*pathInfo}", new {folder="content"});
您的内容目录中包含哪些内容?默认情况下,路由不会路由磁盘上存在的文件(实际上会检查VirtualPathProvider)。因此,如果要将静态内容放在Content目录中,则可能不需要忽略路由。
答案 1 :(得分:5)
这可能非常棘手。
当试图找出如何将路线数据映射到路线时,系统当前自上而下搜索,直到找到提供所有必需信息的内容,然后将其他所有信息填入查询参数。
由于路径“Content / {* pathInfo}”的所需信息始终完全满足(此路线中根本没有所需数据),并且它位于路线列表的顶部附近,因此您尝试映射到未命名的路线将匹配此模式,您的所有网址都将基于此(“内容?action = foo& controller = bar”)
不幸的是,行动路线无法解决这个问题。如果使用命名路由(例如,选择Html.RouteLink而不是Html.ActionLink),则可以指定要匹配的路由的名称。它不太方便,但更精确。
IMO,复杂的路线使行动路线系统基本上落空了。在我有默认路由以外的应用程序的应用程序中,我几乎总是最终恢复到基于命名路由的URL生成,以确保我始终获得正确的路由。