NET Core 5 如何覆盖控制器上的操作
NET Core 5 How to override an action on a controller
假设我有一个具有一些基本功能的“平台”。它有自己的一组控制器,其动作作为 class 库提供。例如,我们将其命名为 CartController
并执行 Order
操作,结果 API URL 将是 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);
}
而且效果很好。
但是在迁移到 .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 适用于 URL 匹配但不仅适用于链接生成?
我们将不胜感激任何想法。
您可以在“覆盖”控制器中使用 Http{Method}Attribute
标记所需的操作并将 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.
或者在控制器上设置与RouteAttribute
同名的属性:
[Route("Cart", Order = -1)]
假设我有一个具有一些基本功能的“平台”。它有自己的一组控制器,其动作作为 class 库提供。例如,我们将其命名为 CartController
并执行 Order
操作,结果 API URL 将是 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);
}
而且效果很好。
但是在迁移到 .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 适用于 URL 匹配但不仅适用于链接生成?
我们将不胜感激任何想法。
您可以在“覆盖”控制器中使用 Http{Method}Attribute
标记所需的操作并将 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.
或者在控制器上设置与RouteAttribute
同名的属性:
[Route("Cart", Order = -1)]