FluentValidation.AspNetCore 在 Web API 项目中不工作

FluentValidation.AspNetCore is not working in Web API project

我正在使用 nuget 包 FluentValidation.AspNetCore 11.0.1。我想根据端点的条件验证我的模型。根据 Fluent 验证文档添加了所需的代码块,但我的验证仍然不起作用。

当我的模型 属性 包含验证器 class 中的字母“a”时,我想 return 验证错误。请检查添加到我的项目中的以下代码块以进行验证。

验证者class

public class TestModelValidate : AbstractValidator<TestModel>
{
    public TestModelValidate()
    {
        RuleFor(t => t.Summary.ToString()).NotEmpty().NotNull().When(x => x.Summary.Contains("a")).WithMessage("Cannot be null");

    }

}

启动class

将下面的代码块添加到 Startup class 中的 ConfigureServices() 方法。

 services.AddControllers().AddFluentValidation(fvc => fvc.RegisterValidatorsFromAssemblyContaining<TestModelValidate>());

型号class

public class TestModel
{
   public string Summary { get; set; }
}

控制器class

 [HttpPost]
 public IActionResult Test(TestModel model)
 {
     if (!ModelState.IsValid) 
     {
          return new BadRequestObjectResult(ModelState);
     }

     return Ok("SUCCESS");
 }

我正在使用 Postman 将以下 JSON 对象传递到端点。

{
  "summary": "a"
}

实际结果 - SUCCESS

预期结果 - Validation Error

感谢您的帮助!

如果您想使用ModelState.IsValid,我们可以尝试将ApiBehaviorOptions.SuppressModelStateInvalidFilter设置为true

builder.Services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressModelStateInvalidFilter = true;
});

我觉得你可以试试用Must加上条件!x.Contains("a")来判断你的逻辑。

public class TestModelValidate : AbstractValidator<TestModel>
{
    public TestModelValidate()
    {
        RuleFor(t => t.Summary).NotEmpty().NotNull().WithMessage("Cannot be null")
                               .Must(x => !x.Contains("a")).WithMessage("Can't contain a");
    }
}