NET Core 5 Как переопределить действие на контроллере

#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 была рада помочь!