在单个FluentValidation规则失败时抛出异常

时间:2011-06-19 20:34:46

标签: c# .net 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");

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

2 个答案:

答案 0 :(得分:7)

通常情况下,验证所有属性然后报告结果会更好,尽管可能存在继续验证没有意义的情况(在我的情况下,这是一个"租户"请求中缺少标识符。

只需将第二条规则更改为类似的内容(使用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

答案 1 :(得分:0)

是。尝试这些方法 -

将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);
    }