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

Dig*_*ift 2 .net c# fluentvalidation

使用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");
Run Code Online (Sandbox Code Playgroud)

我可能正在试图迫使FluentValidation做一些它不打算做的事情。而且我知道ValidateAndThrow()方法,但这会在任何失败时引发异常。

JBe*_*ert 9

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

只需将第二条规则更改为如下所示(已通过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));
    });
Run Code Online (Sandbox Code Playgroud)
  • 如果调用IValidator.Validate(...)并且第一个规则失败,那么它将简单地列在Errors结果列表中。
  • 如果第二条规则失败,则对的调用Validate将引发ArgumentException,显然不会返回任何结果。
  • 如果您要调用ValidateAndThrow扩展方法,则它将简单地返回,ArgumentException如果第二条规则失败则抛出,或者ValidationException如果其他规则之一失败则抛出。


小智 1

是的。尝试沿着这些思路做一些事情 -

将 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);
    }
Run Code Online (Sandbox Code Playgroud)