当控制器动作没有对应的参数时,如何在动作过滤器中获取参数?
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"];
}
我正在开发一个基于 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"];
}