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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:50:35