3

Заказ только, кажется, соблюдается внутри контроллера: когда следующие методы определены в одном контроллере, я получаю ожидаемое поведение, то есть Method1 имеет приоритет , Method2 никогда не вызывается.ASP.NET MVC 5: Определить порядок маршрута между контроллерами (RouteAttribute)

[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.

Можно ли определить порядок между контроллерами с использованием атрибута маршрутизации?

Edit 1: Кажется, что даже маршруты, которые имеют неявный порядок в пределах одного контроллера неоднозначны, когда распространяется на несколько контроллеров. Внутри одного контроллера (буквально перед подстановочным знаком) было бы нормально работать, но выбрасывает исключение, если оно помещается в разные контроллеры.

[Route("details/abc")] 
[Route("details/{product}")] 

Это делает меня, что дизайн держать контроллеры сфокусированные и заставить подобные маршруты, которые будут определены в том же контроллере.

Edit 2:

Эти маршруты я на самом деле хотите использовать. Я хочу поместить их в разные контроллеры, потому что они делают разные вещи. Они отличаются префиксом.

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

Ваша попытка решить проблему заказа на нескольких контроллерах является странной. Тот же маршрут может существовать в двух контроллерах и иметь два совершенно законных URI без какой-либо жалобы от .Net или потребителя услуги. Можете ли вы объяснить нам, какую проблему с кросс-контроллером вы пытаетесь исправить? –

ответ

0

У вас нет ограничений на параметры маршрута для вашего второго маршрута. Если бы вы определили маршрут как [Route("{tier:int}/monitor")], у вас может не быть двусмысленности. Кроме того, вы можете добавить регулярное выражение к маршрутам, чтобы сделать их эксклюзивными, что-то вроде {tier:regex(^(?!reactive))?} позволит вам решить эту проблему.

Смежные вопросы