如何让ASP.NET Core 8 Web API支持可空非原始类型参数
如何让ASP.NET Core的/test路由正常工作?
控制器代码
[ApiController] [Route("[controller]")] public class TestController : ControllerBase { public string Get([FromQuery]TestInput? testInput) { return "OK"; } } public class TestInput { public string Value { get; set; } }
问题现象
请求/test路由时返回400验证错误,错误信息如下:
{ "type": "https://tools.ietf.org/html/rfc9110#section-15.5.1", "title": "One or more validation errors occurred.", "status": 400, "errors": { "Value": [ "The Value field is required." ] }, "traceId": "00-a6893dc23be5689c4b2219faf6f0e705-5fa0968422975595-00" }
给TestInput添加的可空标记?并未生效,且不想通过把Value设为可空字符串、或使用QueryStringValueProvider这类复杂方式解决,希望找到尽量简单的无代码/少代码方案。
问题原因
[ApiController]特性会自动启用模型验证,对于非可空引用类型(比如TestInput里的string Value),ASP.NET Core会隐式将其标记为必填项。即使给TestInput?加了可空标记,当请求中没有查询参数时,框架仍会自动实例化TestInput对象,进而触发Value字段的必填验证,导致400错误。
简单解决方案
在项目的Program.cs中配置API行为,禁用非可空引用类型的隐式必填验证:
builder.Services.AddControllers() .ConfigureApiBehaviorOptions(options => { options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true; });
配置后效果:
- 无查询参数时,
testInput会被设为null,不会触发验证 - 传递查询参数但未指定
Value时,testInput实例化后Value为null,也不会触发必填验证(若手动给Value加了[Required]特性则例外)
内容的提问来源于stack exchange,提问作者vladimir_1969_2
相关产品推荐
相关产品推荐

