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

时间:2015-08-10 18:36:33

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

RouteAttribute("abc", Order = 2)排序似乎只在控制器中受到尊重:当在同一个控制器中定义了以下方法时,我得到了预期的行为,即Method1优先,Method2永远不会被援引。

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

[Route("abc", Order = 2)]
public ActionResult Method2() { ... }

如果我在两个独立的控制器中定义这些方法,我会得到一个模糊的路由异常: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}")]

这使我认为控制器集中在一起并强制在同一个控制器中定义相似的路径。

编辑2

这些是我实际想要使用的路线。我想把它们放到不同的控制器中,因为它们做了不同的事情。它们的前缀不同。

[Route("reactive/monitor")]
[Route("{tier}/monitor")]

1 个答案:

答案 0 :(得分:0)

对于第二条路线,路线参数没有限制。如果您要将路线定义为[Route("{tier:int}/monitor")],则可能没有歧义。或者,您可以向路线添加正则表达式,使它们成为独占的,{tier:regex(^(?!reactive))?}之类的东西可以解决这个问题。