ASP.NET MVC 5:定义跨控制器的路由顺序 (RouteAttribute)

Jul*_*ner 5 c# asp.net-mvc asp.net-mvc-routing routeattribute asp.net-mvc-5

RouteAttribute("abc", Order = 2)排序仅似乎在控制器内推崇:当在同一个控制器定义以下方法,我得到预期的行为,即Method1优先级,Method2则永远不会调用。

[Route("abc", Order = 1)]
public ActionResult Method1() { ... }

[Route("abc", Order = 2)]
public ActionResult Method2() { ... }
Run Code Online (Sandbox Code Playgroud)

如果我在两个单独的控制器中定义这些方法,我会得到一个不明确的路由异常: InvalidOperationException: Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL.

是否可以使用属性路由定义跨控制器的顺序?

编辑 1:当分布在多个控制器上时,似乎即使在一个控制器内具有隐式排序的路由也是模棱两可的。以下在一个控制器中是可以的(通配符之前的文字),但如果放入不同的控制器中会引发异常。

[Route("details/abc")]
[Route("details/{product}")]
Run Code Online (Sandbox Code Playgroud)

这让我认为它是设计使控制器保持专注并强制在同一控制器中定义类似的路由。

编辑2

这些是我真正想要使用的路线。我想把它们放到不同的控制器中,因为它们做不同的事情。它们的区别在于前缀。

[Route("reactive/monitor")]
[Route("{tier}/monitor")]
Run Code Online (Sandbox Code Playgroud)

Dav*_*net 0

对于第二条路线,您对路线参数没有任何限制。如果您要定义路线,则[Route("{tier:int}/monitor")]可能不会有歧义。或者,您可以向路由添加正则表达式,以使它们具有独占性,例如{tier:regex(^(?!reactive))?}可以让您解决此问题。