ASP.NET Web API中FluentValidation验证未触发问题求助
问题:FluentValidation在ASP.NET Web API中未触发验证
我有一个包含DTO的类库,想用FluentValidation确保用户输入正确。类库中的代码如下:
namespace MYCoolProjApi.Model.DTOs.Validation { public class AddWstValidationDTO { public string? Name { get; set; } public string? Regex { get; set; } public string? AddedOrEditedBy { get; set; } } public class AddValidationDTOValidator : AbstractValidator<AddValidationDTO> { public WstAddValidationDTOValidator() { RuleFor(x => x.Name).NotNull().NotEmpty().WithMessage("Validation Name can't be null"); RuleFor(x => x.Regex).NotNull().NotEmpty().WithMessage("Regex can't be null"); } } }
在ASP.NET Web API主项目中,我已安装FluentValidation NuGet包,并在Program.cs中添加了以下配置:
builder.Services.AddFluentValidationAutoValidation(); builder.Services.AddFluentValidationClientsideAdapters(); builder.Services.AddValidatorsFromAssemblyContaining<AddValidationDTOValidator>();
当我向创建新验证项的端点发送错误的DTO请求时,没有收到任何错误提示,数据直接存入了数据库。发送的JSON内容:
{ "Name": "", "AddedOrEditedBy": "MyUser" }
ValidationController的代码:
[HttpPost("Add")] public async Task<IActionResult> AddValidation([FromBody] AddValidationDTO validationDTO) { await _validationService.AddValidation(validationDTO); return Ok(); }
请问为什么FluentValidation没有触发验证?
原因及解决方案
你的代码存在几个关键错误,导致FluentValidation未正常工作:
1. DTO与验证器的类名/泛型参数不匹配
- DTO类名为
AddWstValidationDTO,但验证器的泛型参数是AddValidationDTO,构造函数名又写成了WstAddValidationDTOValidator,三者完全不对应,FluentValidation无法关联到正确的DTO。 - 修正:确保验证器的泛型参数、类名、构造函数名与目标DTO完全一致。比如统一调整为:
public class AddValidationDTO { public string? Name { get; set; } public string? Regex { get; set; } public string? AddedOrEditedBy { get; set; } } public class AddValidationDTOValidator : AbstractValidator<AddValidationDTO> { public AddValidationDTOValidator() // 构造函数名必须和验证器类名一致 { RuleFor(x => x.Name).NotNull().NotEmpty().WithMessage("Validation Name can't be null or empty"); RuleFor(x => x.Regex).NotNull().NotEmpty().WithMessage("Regex can't be null or empty"); } }
2. 控制器未检查验证状态
ASP.NET Web API不会自动拦截无效请求,必须手动检查ModelState.IsValid来触发验证结果返回:
修正后的控制器代码:
[HttpPost("Add")] public async Task<IActionResult> AddValidation([FromBody] AddValidationDTO validationDTO) { if (!ModelState.IsValid) { return BadRequest(ModelState); // 返回具体的验证错误信息 } await _validationService.AddValidation(validationDTO); return Ok(); }
3. 验证器注册的程序集引用问题
确保AddValidatorsFromAssemblyContaining<AddValidationDTOValidator>指定的类型确实在类库项目中,且主项目已正确添加该类库的引用,避免程序集扫描不到验证器。
额外注意事项
- 主项目和类库的FluentValidation、FluentValidation.AspNetCore NuGet包版本需保持一致,避免版本兼容问题。
- 若使用.NET 6+,确认
AddFluentValidationAutoValidation()配置未被其他代码覆盖。
内容的提问来源于stack exchange,提问作者user20291208
相关产品推荐
相关产品推荐

