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

Posted

技术标签:

【中文标题】ASP.NET MVC 5:跨控制器定义路由顺序(RouteAttribute)【英文标题】:ASP.NET MVC 5: Define route order across controllers (RouteAttribute) 【发布时间】:2015-11-02 18:59:37 【问题描述】:

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")]

【问题讨论】:

您尝试解决跨多个控制器的排序问题很奇怪。相同的路由可以存在于两个控制器中,并且有两个完全合法的 URI,而不会受到 .Net 或服务使用者的任何投诉。您能向我们解释一下您要解决的跨控制器问题吗? 【参考方案1】:

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

【讨论】:

以上是关于ASP.NET MVC 5:跨控制器定义路由顺序(RouteAttribute)的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 5 (vNext) MVC 6 中实现自定义路由器

ASP.NET MVC

asp.net 5 MVC6 中标签助手和路由属性之间的奇怪行为

ASP.NET MVC:在不影响性能的情况下路由自定义 slug

asp.net core 系列 5 MVC框架路由(上)

ASP.Net MVC 2 RC2:当所有可选参数为空时,自定义路由返回 404