ASP.NET Core ActionFilter中如何从ActionExecutedContext读取参数
在ActionExecutedContext中获取Action参数的方法
方法一:在OnActionExecuting中暂存参数
既然OnActionExecuting能直接拿到ActionArguments,可以先把参数存到当前请求的HttpContext.Items中,后续在OnActionExecuted里直接读取:
public override void OnActionExecuting(ActionExecutingContext context) { // 将参数存入HttpContext.Items context.HttpContext.Items["ActionArguments"] = context.ActionArguments; base.OnActionExecuting(context); } public override void OnActionExecuted(ActionExecutedContext context) { // 从HttpContext.Items中取出参数 if (context.HttpContext.Items.TryGetValue("ActionArguments", out var arguments) && arguments is IDictionary<string, object> actionArgs) { // 示例:获取指定参数值 var targetParam = actionArgs["paramName"]; } base.OnActionExecuted(context); }
方法二:通过ActionDescriptor和Controller实例获取
如果不想提前暂存,可通过ActionDescriptor拿到参数定义,再从控制器实例中提取对应值(适合参数绑定到控制器属性或模型的场景):
public override void OnActionExecuted(ActionExecutedContext context) { if (context.ActionDescriptor is ControllerActionDescriptor controllerActionDesc) { var controller = context.Controller; foreach (var param in controllerActionDesc.Parameters) { // 通过反射从控制器实例获取参数值 var paramValue = controller.GetType().GetProperty(param.Name)?.GetValue(controller); // 处理参数值逻辑 } } base.OnActionExecuted(context); }
方法三:从ModelState中提取
如果参数是通过模型绑定完成的,也可以直接从ModelState中获取已绑定的参数值:
public override void OnActionExecuted(ActionExecutedContext context) { foreach (var key in context.ModelState.Keys) { if (context.ModelState.TryGetValue(key, out var entry)) { var paramValue = entry.RawValue; // 处理参数值逻辑 } } base.OnActionExecuted(context); }
注意:方法二和方法三存在局限性——方法二更适配参数为控制器属性的场景,方法三只适用于已完成模型绑定且存在于ModelState中的参数。如果是简单类型参数且未绑定到模型/控制器属性,方法一的通用性最佳。
内容的提问来源于stack exchange,提问作者MutipleQA
相关产品推荐
相关产品推荐

