MVC 5 нескольких маршрутов к одному контроллеру - PullRequest
0 голосов
/ 18 января 2019

В нашем файле RouteConfig.cs есть следующий маршрут по умолчанию:

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Original", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "Path.To.Controllers" }
            );

Наше приложение разбито на несколько разных «областей». Этот конкретный маршрут работает отлично.

Нас попросили изменить один из наших URL, однако базовая кодовая база та же самая. Чтобы избежать разрыва существующих ссылок, я бы хотел настроить свой контроллер для поддержки двух разных маршрутов:

Вот пример того, как выглядит оригинальный URL:

website.com/MyArea/Original

При наличии вышеупомянутого маршрута «По умолчанию» он будет направлен на OriginalController в области MyArea и выполнит действие по умолчанию Index, поскольку ни один из них не был указан.

Моя цель - настроить другой URL, который также будет перенаправлен на OriginalController. То есть

website.com/MyArea/Other

Следует направиться к OriginalController в области MyArea и выполнить действие по умолчанию Index.

Я добавил в файл RouteConfig.cs следующее:

            routes.MapRoute(
                name: "Other",
                url: "Other/{action}/{id}",
                defaults: new { controller = "Original", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "Path.To.Controllers" }
            );

Я обнаружил, что конфигурация маршрута Default всегда используется в пользу конфигурации маршрута Other, что приводит к проблеме привязки, в которой говорится, что "OtherController не найден" , Я подозреваю, что это потому, что они имеют очень похожую подпись в шаблоне url, но я не совсем уверен, как обойти это.

Я знаю, что есть также атрибут Route, который я не против использовать. Мне, к сожалению, не удалось правильно настроить эту настройку.

После исследования и попыток нескольких различных комбинаций я все еще не могу получить оба URL для маршрутизации на один контроллер.

Что я делаю не так?

1 Ответ

0 голосов
/ 18 января 2019

Я смог получить ожидаемый результат, используя 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) {
    ...
}

Теперь сначала определяются мои атрибуты маршрута, , а затем используется обычный маршрут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...