【问题标题】:ASP.NET MVC routing conflictASP.NET MVC 路由冲突
【发布时间】:2016-04-17 14:32:51
【问题描述】:

我的应用程序中有两条路由,每条路由在不同的Controller 中,如下所示:

[Route("forgot-password", Order = 1)]
[Route("{variable}", Order = 2)]

当我运行应用程序时出现异常:

找到多个与 URL 匹配的控制器类型。这个可以 如果多个控制器上的属性路由与请求的匹配,则会发生 网址。

记住这些操作在不同的Controllers 中。 Order 属性似乎不适用于 Controllers!。

我怎样才能让这个场景在asp.net mvc routing 中工作?我想使用基于属性的路由,我不想更改我的网址。

【问题讨论】:

  • 是否可以配置第二条路由以实际包含令牌?例如:[Route("some-action/{variable}")]?
  • 没有。我希望我的网址是我想要的。

标签: c# asp.net asp.net-mvc asp.net-mvc-routing


【解决方案1】:

解释了错误背后的机制here(我猜你正在使用Web API)。简而言之,优先级仅在控制器内部得到尊重。

另外,我不清楚你为什么想要这样的通用路线:

[Route("{variable}")]

【讨论】:

  • 我使用的是 MVC,而不是 WebApi。如果您有一个销售汽车的网站怎么办? mywebsite.com/ford 和 mywebsite.com/toyota 似乎是明智的 url。我了解错误背后的机制,但我完全不相信 asp.net 路由无法处理这种情况。其他基于属性的路由库只允许您指定 Order 参数来解决冲突。
  • @BowserKingKoopa - 支持此方案。使用 .NET 路由时,路由属性并不是最灵活的机制。相反,您可以subclass RouteBase 来处理诸如此类的更复杂的场景。您甚至可以基于上下文的其他部分而不是仅基于 URL(例如 cookie、会话或表单值)进行路由。另一种选择(更简单)就是使用MapRoute 将您的路线放入RouteConfig.cs 文件中。
  • 这是一个复杂的场景吗?我使用过的所有其他基于属性的路由库都可以轻松支持这一点。
【解决方案2】:

问题是应用程序中的所有路由都存储在一起。即使它位于不同的控制器中,也是同一类型的,因此它们可以“看到”彼此。在您的情况下, "forgot-password""{variable}" 具有相同的格式,这就是显示有关多条路线的错误的原因。正如@NightOwl888 所说,您可以使用 RouteConfig 创建路由,但在这种情况下,您必须更改路由值。

【讨论】:

  • Order 值应该可以解决冲突。 Order 值在 Controller 中不起作用的想法太愚蠢了,我仍然否认这一点。
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多