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