1

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

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

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

4

2 回答 2

1

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

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

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

于 2022-01-12T11:36:44.927 回答
1

您可以使用( 的祖先 ) 的HttpContext属性来访问请求查询字符串值:ActionContextActionExecutingContext

public override Task OnActionExecutionAsync(ActionExecutingContext actionContext, ActionExecutionDelegate next)
{
    StringValues values = actionContext.HttpContext.Request.Query["tenant"];
}
于 2022-01-12T11:37:42.940 回答