在单个FluentValidation规则失败时引发异常

本文关键字:异常 失败 单个 FluentValidation 规则 | 更新日期: 2023-09-27 17:59:41

使用FluentValidation,是否可以在单个规则失败时引发异常?例如,我想调用Validate(),并让下面的第一条规则简单地进行验证,但如果为false,则第二条规则抛出异常。

RuleFor(x => x.Title)
    .NotEmpty()
    .WithMessage("Please add a title for the project");
RuleFor(x => x.UserId)
    .NotEmpty()
    .WithMessage("User not supplied");

我可能试图强迫FluentValidation做一些它没有设计好做的事情。我知道ValidateAndThrow()方法,但这会在任何失败时引发异常。

在单个FluentValidation规则失败时引发异常

通常情况下,最好验证所有属性,然后报告结果,尽管有时继续验证没有意义(在我的情况下,是在请求中缺少"租户"标识符时)。

只需将第二条规则更改为这样(使用Automapper 5.2,C#6测试):

RuleFor(x => x.Title)
    .NotEmpty()
    .WithMessage("Please add a title for the project");
RuleFor(x => x.UserId)
    .NotEmpty()
    .OnAnyFailure(x =>
    {
        throw new ArgumentException(nameof(x.UserId));
    });
  • 如果调用IValidator.Validate(...),而第一条规则失败,那么它将简单地列在结果的Errors列表中
  • 如果第二条规则失败,对Validate的调用将引发ArgumentException,显然不会返回任何结果
  • 如果您要调用ValidateAndThrow扩展方法,那么它要么简单地返回,如果第二个规则失败则抛出ArgumentException,要么如果其他规则之一失败则抛出ValidationException

是。试试这些东西-

将FluentValidation和FluentValidation.TestHelper添加到指令中。

    private readonly IValidator<ItemViewModel> validator = new ItemValidator(); 
    //Assumes your fluent validation is in ItemValidator and your view model is ItemViewModel
    [Test]
    public void Headline_ShouldNotBeEmpty()
    {
        validator.ShouldHaveValidationErrorFor(f => f.message, string.Empty);
    }