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

