簡體   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