当控制器动作没有对应的参数时,如何在动作过滤器中获取参数?

How to get argument in action filter when the controller action has no corresponding argument?

我正在开发一个基于 ASP.NET Core 6 的 Web 应用程序。为了避免在我的控制器中编写大量冗余代码,我实现了一个 class BaseController ,我的所有控制器都继承自该代码。在那个 class 中,我将 OnActionExecutionAsync 方法覆盖为 运行 代码,否则在每个控制器中这些代码都是多余的。在这段代码中,我需要访问两个参数,否则我必须通过它的参数将它们传递给每个控制器操作,如下所示: public async Task<ActionResult> ExampleAction([FromQuery(Name = "argument1")] Guid? argument1, [FromQuery(Name = "argument2")] Guid? argument2)

只要我在每个操作中保留这些参数,我就可以在 OnActionExecutionAsync 方法中轻松访问它们。但是,我不想这样做,因为它需要我将参数添加到每个控制器操作,而我什至不需要它们。现在我遇到的问题是,当我从控制器操作中删除参数时,我无法再通过 OnActionExecutionAsync 方法中的 context.ActionArguments 访问它们。

有什么办法让我在这种情况下仍然可以访问参数?我已经在 SO 上找到了非常相似的 this 问题,但是使用 actionContext.ControllerContext.RouteData.Values["tenant"] 的建议解决方案在我的情况下不起作用。 ASP.NET Core 6 中根本没有 ControllerContext 并且 context.RouteData.Values 似乎不包含我正在寻找的参数。

您可以使用 HttpContext.Request.Query 访问查询字符串值。这是一个例子:

var tenantValues = context.HttpContext.Request.Query["tenant"];

这里tenantValues的类型是StringValues,代表一个或多个值。如果您知道只会提供一个值,则可以将其视为一个集合并使用 [0]First(),例如,或者将其大小写为 string.

您可以使用 HttpContext 属性 of ActionContext (which is ancestor of ActionExecutingContext) 访问请求查询字符串值:

public override Task OnActionExecutionAsync(ActionExecutingContext actionContext, ActionExecutionDelegate next)
{
    StringValues values = actionContext.HttpContext.Request.Query["tenant"];
}