ASP.NET MVC 5: определение порядка маршрутов между контроллерами (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 ответ

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

Другие вопросы по тегам