gpt4 book ai didi

c# - NET Core 5 如何覆盖 Controller 上的操作

转载 作者:行者123 更新时间:2023-12-05 04:47:21 25 4
gpt4 key购买 nike

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

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

在 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") 装饰我的 Controller AmbiguousMatchException: The request matched multiple endpoints异常。

那时我不知道如何覆盖它。

所以我的问题是:如何覆盖路由以在 .Net Core 5 中对我的 Controller 使用我的操作?什么是 routes.Add from .Net 4.8 的等价物,它适用于 URL 匹配但不仅仅用于链接生成?

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

最佳答案

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

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

HttpMethodAttribute.Order 属性:

Gets the route order. The order determines the order of route execution. Routes with a lower order value are tried first. When a route doesn't specify a value, it gets the value of the Order or a default value of 0 if the RouteAttribute doesn't define a value on the controller.

或者在 Controller 上设置与RouteAttribute同名的属性:

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

关于c# - NET Core 5 如何覆盖 Controller 上的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68514176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com