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

ASP.NET Core运行时如何判断参数是否为程序员设置的默认值?

实现方案

核心逻辑是通过读取Action方法的元数据,判断参数是否在定义时设置了默认值,仅对无默认值的参数执行非空校验。


1. 过滤器核心实现代码

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;

public class RequireNonNullWithoutDefaultAttribute : ActionFilterAttribute
{
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // 仅处理Controller类的Action请求
        if (context.ActionDescriptor is not ControllerActionDescriptor controllerAction)
        {
            await next();
            return;
        }

        // 获取Action方法的所有参数定义元数据
        var methodParams = controllerAction.MethodInfo.GetParameters();
        var invalidParams = new List<string>();

        foreach (var param in methodParams)
        {
            // 跳过已设置默认值的参数
            if (param.HasDefaultValue)
                continue;

            // 读取当前请求传入的参数值
            context.ActionArguments.TryGetValue(param.Name, out var paramValue);
            
            // 非空校验规则:引用类型为null、可空值类型为null均判定为非法
            if (paramValue is null || (Nullable.GetUnderlyingType(param.ParameterType) != null && paramValue == null))
            {
                invalidParams.Add(param.Name);
            }
            // 若需要额外校验字符串非空/非空白,可新增以下逻辑
            // if (paramValue is string str && string.IsNullOrWhiteSpace(str))
            // {
            //     invalidParams.Add(param.Name);
            // }
        }

        // 存在非法参数时直接返回400错误
        if (invalidParams.Any())
        {
            context.Result = new BadRequestObjectResult(new
            {
                Message = "以下必填参数不可为空",
                Parameters = invalidParams
            });
            return;
        }

        await next();
    }
}

2. 使用方式

  • 全局生效:在Program.cs中注册过滤器,所有接口都会自动应用校验规则
builder.Services.AddControllers(options =>
{
    options.Filters.Add<RequireNonNullWithoutDefaultAttribute>();
});
  • 按需生效:不需要全局注册,直接在指定Controller或单个Action上标记[RequireNonNullWithoutDefault]特性即可。

3. 常见问题说明

如果之前通过反射读取不到参数默认值标识,是因为没有从ControllerActionDescriptor.MethodInfo中读取方法元数据,从该属性获取的参数定义可以准确拿到HasDefaultValue状态,符合你示例中的需求:仅校验informativeMessagesHeadingId,自动跳过有默认值的page、quantity参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:15:03