#c# #asp.net-core-5.0 #asp.net-routing
Вопрос:
Давайте представим, что у меня есть «платформа» с некоторыми базовыми функциями. Он имеет свой собственный набор контроллеров с действиями, предоставляемыми в виде библиотеки классов. Например, давайте назовем его, как CartController
и в Order
действии, в результате URL API будет Cart/Order
.
По какой-то причине я хочу расширить логику процесса упорядочения, которую я добавил MyCartController
с Order
помощью действия в своем проекте, где я ссылаюсь на платформу. Теперь мне нужно настроить приложение, чтобы использовать мое пользовательское действие вместо оригинального.
В ASP MVC 5 (на основе .NET Framework) Я могу сделать это следующим образом
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
var route = new Route("Cart/Order", new RouteValueDictionary(new Dictionary<string, object>
{
{ "action", nameof(MyCartController.Order) },
{ "controller", nameof(MyCartController).Replace("Controller", "") }
}), new MvcRouteHandler());
routes.Insert(RouteTable.Routes.Count - 2, route);
}
}
а затем вызовите его при запуске как
public override void Configuration(IAppBuilder builder)
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
и это хорошо сработало.
Но после миграции в .Сетевое ядро 5, оно перестало работать. При запуске я добавил
public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("MyCartOrder", "Cart/Order", new { controller = nameof(MyCartController).Replace("Controller", ""), action = nameof(MyCartController.Order) });
});
}
безрезультатно. Похоже, они сломали здесь что-то полезное https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSource.cs#L100
Я попытался украсить свой контроллер Route("Cart")
атрибутом и HttpPost("Order")
AmbiguousMatchException: The request matched multiple endpoints
исключением.
Тогда я понятия не имею, как это отменить.
Итак, мой вопрос: как переопределить маршрут для использования моего действия на моем контроллере в .Net Core 5? Что эквивалентно маршрутам.Добавить из .Net 4.8, который работает для сопоставления URL-адресов, но не только для генерации ссылок?
Любые мысли и идеи будут оценены по достоинству.
Комментарии:
1. Я вижу только код конфигурации. Я не думаю, что вам вообще нужен этот код. Можете ли вы показать контроллеры, пожалуйста? Я имею в виду заголовки действий контроллера и то, как они связаны.
Ответ №1:
Вы можете отметить необходимое действие в контроллере «переопределить» Http{Method}Attribute
и задать Order
свойству некоторое значение (по умолчанию -1 должно сработать).:
[HttpPost("Order", Order = -1)]
HttpMethodAttribute.Order
Собственность:
Получает заказ маршрута. Порядок определяет порядок выполнения маршрута. Сначала пробуются маршруты с меньшим значением порядка. Когда маршрут не указывает значение, он получает значение Заказа или значение по умолчанию 0, если значение
RouteAttribute
не определено на контроллере.
Или установите свойство с тем же именем RouteAttribute
в контроллере:
[Route("Cart", Order = -1)]
Комментарии:
1. Это сделало свое дело. Спасибо, ты спас мне жизнь =) Хотя это было действительно просто
2. @AntonGelenava была рада помочь!