Итак, я переключаю область с помощью AreaRegistration на использование Routing Attribute. Я столкнулся с проблемой, которая, по-видимому, вызвана порядком загрузки маршрутов в таблицу маршрутизации. Я решил проблему в AreaRegistration, загрузив ее в проблемный маршрут последним, так что только если все остальные маршруты не совпадают, этот маршрут будет согласован. При использовании маршрутизации атрибутов это не представляется возможным. У меня есть параметр Order при создании маршрута, но это не влияет на то, как вещи попадают в таблицу маршрутизации, но очень узко.
Здесь маршрут, который у меня есть в файле AreaRegistration:
context.MapRoute(
name: "ActionItems_home",
url: "ActionItems/{group}/{statuses}/{overdueOnly}",
defaults: new { controller = "Home", action = "Index", group = "All", statuses = "New,Open", overdueOnly = false },
namespaces: new string[] { "IssueTracker.Areas.ActionItems.Controllers" }
);
Теперь, когда я пытаюсь переключить это на Маршрутизацию атрибутов, единственное, что подходит для работы, это:
[Route("", Order = 4)]
[Route("{group:regex(^(?!Item|DecisionLogs))?}", Order = 3)]
[Route("{group:regex(^(?!Item|DecisionLogs))}/{statuses=New,Open?}", Order = 2)]
[Route("{group:regex(^(?!Item|DecisionLogs))}/{statuses=New,Open}/{overdueOnly:bool=false?}", Order = 1)]
Обратите внимание, что мне нужно добавить регулярное выражение, потому что иначе контроллер элемента не будет вызван - вместо этого я получаю строку "Item", которая передается как параметр group
. Но регулярное выражение не особенно помогает в том, как отображаться URL-адрес.
Я хотел бы, чтобы необязательные параметры были подавлены в URL-адресе, если они не являются стандартными. Я попытался указать параметры как необязательные, со значениями по умолчанию, и как необязательные, так и со значениями по умолчанию. Ни один из них, похоже, действительно не делает трюк.
Текущее решение по крайней мере представляет URL-адрес без запроса, но они включают в себя необязательные параметры и делают вещи уродливыми. На данный момент я просто оставил вопиющие маршруты, которые будут определены в файлах AreaRegistration
, и не украсил их фрагментами [Route()]
.