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