如何禁用ASP.NET Core不可空属性的默认模型属性验证?
解决方案
不需要为每个属性单独标注[ValidateNever],通过全局Mvc配置即可实现需求,且不会影响JSON语法错误的正常返回。
核心配置
在Program.cs中注册控制器和FluentValidation时,开启SuppressImplicitRequiredAttributeForNonNullableReferenceTypes开关即可:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() // 保留你原有的FluentValidation注册逻辑 .AddFluentValidation(config => { config.RegisterValidatorsFromAssemblyContaining<Program>(); // 其他你自定义的FluentValidation配置... }) .AddMvcOptions(options => { // 禁用ASP.NET Core为不可空引用类型自动添加隐式[Required]验证特性 options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true; }); // 其余中间件配置... var app = builder.Build(); // ... app.Run();
配置效果说明
- 仅禁用框架针对不可空引用类型自动注入的必填验证逻辑,这部分校验将完全交给FluentValidation按你定义的规则执行
- JSON请求的语法校验(比如JSON格式非法、字段类型不匹配等反序列化阶段错误)完全不受影响,依然会正常返回400 Bad Request结果,这部分逻辑属于输入格式化阶段,和模型验证阶段的隐式Required校验互不干扰
- 如果你手动给属性标注了显式
[Required]特性,这部分验证逻辑不会被该开关禁用,若要完全交由FluentValidation管理,手动移除这些显式特性,统一使用FluentValidation的NotNull()/NotEmpty()规则定义即可
前置条件
确保你的项目文件(.csproj)中开启了可空引用类型上下文,否则该配置不会生效:
<PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <!-- 其他配置... --> </PropertyGroup>
该方案全局生效,不需要修改任何DTO类定义,比逐个属性标注[ValidateNever]的方式维护成本低很多,也不会破坏原有验证流程的分工。
内容的提问来源于stack exchange,提问作者cremor
相关产品推荐
相关产品推荐

