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
相关产品推荐
相关产品推荐

