You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC中ActionExecutingContext的ActionArguments始终为空的原因

问题原因及解决办法

1. 异步过滤器方法写法错误

你在LoggedInAttribute里用了async override void OnActionExecuting,这是ASP.NET Core过滤器的错误用法。OnActionExecuting是同步生命周期方法,不能标记为async void——异步逻辑要改用OnActionExecutionAsync方法。用async void会导致框架无法正确等待异步操作,可能参数绑定还没完成,过滤器就提前读取了ActionArguments,结果自然为空。

正确写法:

public class LoggedInAttribute : ActionFilterAttribute
{
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // 这里可以正常读取ActionArguments
        var argCount = context.ActionArguments.Keys.Count;
        
        await next();
    }
}

2. 参数绑定规则不匹配

你的ChangeBio方法参数是string UserId和string Bio,ASP.NET Core默认会把这类简单类型参数从URL查询串绑定。如果你的请求是把参数放在请求Body里(比如JSON格式),但没给参数加[FromBody]标记,就会绑定失败,导致ActionArguments为空。

解决办法分两种情况:

  • 若参数通过Body传递:把UserId和Bio封装成DTO类,再加[FromBody]标记(注意一个Action只能有一个[FromBody]参数):
public class BioUpdateRequest
{
    public string UserId { get; set; }
    public string Bio { get; set; }
}

[ServiceFilter(typeof(LoggedInAttribute))]
[HttpPut("bio")]
public ActionResult<string> ChangeBio([FromBody] BioUpdateRequest request)
{ 
    // 使用request.UserId和request.Bio
}
  • 若参数通过URL查询串传递:确保请求URL是/bio?UserId=xxx&Bio=xxx,此时无需额外标记,框架会自动完成绑定。

3. 过滤器注册问题(概率较低)

用ServiceFilter时,要确保LoggedInAttribute已经在DI容器中注册,比如在Program.cs里加builder.Services.AddScoped<LoggedInAttribute>()。不过你提到有其他场景能识别参数,这个可能性不大,但可以核对一下。


内容的提问来源于stack exchange,提问作者Enormax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:42:40