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