ASP.NET MVC4 - Различная маршрутизация для 2 контроллеров с actionLinks
Хорошо, у меня есть этот случай, когда у меня есть два контроллера:
HomeController
MathController
Я хочу, чтобы маршрутизация для моего HomeController оставалась по умолчанию:{controller}/{action}/{id}
, Но я хочу получить доступ к действиям в MathController с http://myurl/Task/Math/{action}
,
Итак, я сделал так, чтобы написать свой RouteConfig так:
routes.MapRoute(
name: "Math",
url: "Task/{controller}/{action}",
defaults: new { controller = "Math", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Hem", id = UrlParameter.Optional }
);
При использовании вышеуказанной конфигурации и ручном вводе URL-адресов в браузере оба метода маршрутизации работают. Хотя при попытке добавить "actionLink" он всегда использует Task/{Controller}/{Action}
маршрут. Даже если я создаю ссылку для контроллера Home следующим образом: @Html.ActionLink("Hem", "Hem", "Home", null, new { @class = "navbar-brand" })
Как настроить маршрутизацию или ссылки для действий, чтобы получить желаемую функциональность?
1 ответ
Маршруты совпадают сверху вниз в RouteConfig.cs
, Ваша проблема в том, что оба конфига маршрутов являются "перехватить все" маршруты, что означает, что оба работают для любого контроллера / действия. Когда вы используете @Html.ActionLink
MVC отобразит URL на основе первого найденного маршрута, который соответствует вашему пути "Задачи". Есть несколько способов изменить это, чтобы получить то, что вы хотите.
Если вы хотите использовать только путь "Задача" для контроллера Math, я бы изменил ваш маршрут на этот:
routes.MapRoute(
name: "Math",
url: "Task/Math/{action}",
defaults: new { controller = "Math", action = "Index" }
);
Если вы хотите использовать несколько контроллеров для пути "Задача", вы можете добавить ограничение маршрута. Вы можете использовать его, как показано ниже, и указать список контроллеров (регулярное выражение), или вы можете создать свой собственный класс Route Constraint и реализовать любую функциональность, какую захотите.
routes.MapRoute(
name: "Math",
url: "Task/{controller}/{action}",
defaults: new { controller = "Math", action = "Index" },
constraints: new { controller = "Math|OtherController" }
);
Или, если вы хотите, чтобы все контроллеры / действия соответствовали обоим URL-адресам, вам нужно перевернуть маршруты, чтобы сначала отобразить маршрут по умолчанию, или вы можете использовать @Html.RouteLink
вот так:
@Html.RouteLink("Hem", "Default", new { controller = "Home", action = "Hem" }, new { @class = "navbar-brand" })