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

person Julian Lettner    schedule 10.08.2015    source источник
comment
Ваша попытка решить проблему заказа на нескольких контроллерах выглядит странно. Один и тот же маршрут может существовать в двух контроллерах и иметь два совершенно законных URI без каких-либо жалоб со стороны .Net или потребителя услуги. Можете ли вы объяснить нам, какую проблему с кросс-контроллером вы пытаетесь решить?   -  person Colorado Matt    schedule 10.08.2015


Ответы (1)


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

person David T. Macknet    schedule 19.10.2015