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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:14