繁体   English   中英

NET Core 5 如何覆盖控制器上的操作

[英]NET Core 5 How to override an action on a controller

假设我有一个具有一些基本功能的“平台”。 它有自己的一组控制器,其动作作为类库提供。 例如,我们将其命名为CartController并带有Order操作,因此 API URL 将是Cart/Order

出于某种原因,我想扩展订单流程中的逻辑,我在我引用平台的项目中添加MyCartController带有Order操作的MyCartController 现在我需要设置应用程序以使用我的自定义操作而不是原始操作。

在 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);
    }
}

然后从 Startup 调用它作为

public override void Configuration(IAppBuilder builder)
{
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

它运作良好。

但在迁移到 .Net Core 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 中的 routes.Add 的等价物是什么,它适用于 URL 匹配,但不仅适用于链接生成?

任何想法和想法将不胜感激。

您可以使用Http{Method}Attribute在“覆盖”控制器中标记所需的操作并将Order属性设置为某个值(默认情况下 -1 应该可以解决问题):

[HttpPost("Order", Order = -1)]

HttpMethodAttribute.Order属性:

获取路由顺序。 顺序决定了路由执行的顺序。 首先尝试具有较低阶值的路由。 当路由未指定值时,如果RouteAttribute未在控制器上定义值,则它获取 Order 的值或默认值 0。

或者在控制器上设置与RouteAttribute同名的属性:

[Route("Cart", Order = -1)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM