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

C# Web API如何实现POST请求时可选字段可缺省并默认Null

问题解决:POST请求可选字段无需传递且默认设为Null

问题原因

你遇到的State字段必填报错来自ASP.NET Core的模型验证机制,和Newtonsoft.Json的NullValueHandling.Ignore特性无关。.NET 6+默认启用了可空引用类型,string这类非可空引用类型会被[ApiController]自动标记为必填项,即便请求中没传该字段,模型验证也会判定为无效。而[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]仅控制序列化/反序列化时是否忽略null值,不影响模型验证规则。

解决方法

方法1:将可选字段改为可空引用类型(推荐)

把State和City的类型改为string?,明确标记为可空,模型验证就不会将其视为必填项:

public class MyAddress
{
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string? State { get; set; }
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string? City { get; set; }
}

方法2:用特性禁用单个字段的必填验证

如果不想修改字段类型,给目标字段添加[AllowNull]特性,允许字段值为null:

public class MyAddress
{
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    
    [AllowNull]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string State { get; set; }
    [AllowNull]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string City { get; set; }
}

方法3:全局关闭非可空引用类型的必填验证

若希望所有非可空引用类型都不被默认标记为必填,可在Program.cs中配置模型验证选项:

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 保留你的Newtonsoft.Json自定义配置
    })
    .AddMvcOptions(options =>
    {
        options.ModelValidatorProviders.RemoveType<NonNullableReferenceTypeModelValidatorProvider>();
    });

验证测试

修改完成后重启API,提交不包含State或City的POST请求,即可正常通过验证,未提供的字段会自动设为null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:17:41