Я смог получить ожидаемый результат, используя RouteAttribute
на самом контроллере (спасибо @Michael за ресурсы и за то, что я еще раз посмотрел на атрибут RouteAttribute), а не на обычную MapConfig
маршрутизацию. Как я описал в моем вопросе выше, у меня были трудности при попытке подхода Route
, так как я получал 404 ошибки, в которых говорилось, что «ресурс не найден».
Оказывается, что вышеуказанные ошибки были связаны с тем, что моя маршрутизация атрибута не была подключена в правильном порядке, что заставило использовать обычный маршрут (например, MapConfig по умолчанию) над моими атрибутами Route.
Я наткнулся на этот пост , в котором говорится:
Вы, вероятно, комбинируете маршрутизацию на основе соглашения с атрибутом
маршрутизации, и вы должны зарегистрировать свои районы после сопоставления
атрибуты маршрутов.
Линия
AreaRegistration.RegisterAllAreas();
следует вызывать ПОСЛЕ этой строки:
routes.MapMvcAttributeRoutes();
При работе с областями вы должны зарегистрировать эти области после регистрации атрибута маршрутизации. Первоначально я регистрировал свои области в методе Application_Start
Globas.asax.cs
, который вызывается до RouteConfig.RegisterRoutes
. Я перенес эту регистрацию прямо под моим MapMvcAttributeRoutes
вызовом в файле RouteConfig.cs
, что позволило следующему атрибуту маршрута на контроллере работать должным образом:
[RouteArea("MyArea")]
[Route("Original/{action=index}", Order = 1)]
[Route("Other/{action=index}", Order = 0)]
public class OriginalController : Controller {
...
...
public async Task<ActionResult> Index() { ... }
}
Теперь, когда все вышеперечисленное установлено, я могу перейти к любому из приведенных ниже URL-адресов, которые будут правильно перенаправлены на действие «Индекс» моего OriginalController
:
website.com/MyArea/Original
website.com/MyArea/Other
Это работает. Тем не менее, у меня есть другое определенное действие, которое душит маршрутизацию атрибута и вызывает использование обычного маршрута по умолчанию (определенного через функцию MapConfig). Моя подпись действия:
public async Task<ActionResult> Details(int id) {
...
}
Маршрут к этому действию: website.com/MyArea/Original/Details/123
, который также удовлетворяет стандартному маршруту по умолчанию {area}/{controller}/{action}/{id}
.
Обходным путем было пойти еще дальше с определением атрибутов маршрута на уровне действия:
[Route("Original/Details/{id:int}")]
[Route("Other/Details/{id:int}")]
public async Task<ActionResult> Details(int id) {
...
}
Теперь сначала определяются мои атрибуты маршрута, , а затем используется обычный маршрут.