迁移至.NET 6后反序列化JSON非可空字段必填问题求解
解决.NET 6迁移后非可空字段必填验证问题
方案1:将非必填字段改为可空引用类型
.NET 6默认启用了可空引用类型(Nullable Reference Types),未标记为string?的string属性会被自动视为必填项。只需把不需要强制传入的字段改为可空类型即可:
public class Person { public string? FirstName { get; set; } public string? LastName { get; set; } public string? CustomerType { get; set; } }
这种方式能明确字段的可空性,是.NET 6推荐的最佳实践。
方案2:全局关闭可空引用类型检查
如果不想修改现有实体类,可以在项目的.csproj文件中添加配置,关闭全局可空检查:
<PropertyGroup> <!-- 其他配置 --> <Nullable>disable</Nullable> </PropertyGroup>
这样会回到.NET Standard时代的行为,引用类型默认视为可空,不会触发必填验证。
方案3:禁用自动添加的必填验证规则
如果需要保留可空引用类型的其他特性,仅想取消自动生成的必填验证,可以在配置控制器时添加如下设置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.UseMemberCasing(); }) .AddMvcOptions(options => { // 禁止为非可空引用类型自动添加[Required]特性 options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true; }); builder.Services.AddControllersWithViews() .AddNewtonsoftJson(options => { options.UseMemberCasing(); }) .AddMvcOptions(options => { options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true; });
方案4:为单个字段标记允许空值
如果仅个别字段不需要必填验证,可以在属性上添加[AllowNull]特性:
public class Person { [AllowNull] public string FirstName { get; set; } [AllowNull] public string LastName { get; set; } [AllowNull] public string CustomerType { get; set; } }
这样模型验证会忽略该字段的必填要求。
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

