流畅验证的SetCollectionValidator的奇怪行为

时间:2017-11-01 12:57:32

标签: c# regex fluentvalidation

在我的项目中,我正在使用.net的FluentValidation。我应用此验证的类是这样的:

[Validation(typeof(InputValidator))]
public class Inputs
{
    public IEnumerable<string> MobileNos { get; set; }
}

InputValidator.cs文件就是这样的

public class InputValidator: AbstractValidator<Inputs>
{
    public BlockMobileInputsValidator()
    {
         RuleFor(x => x.MobileNos).Cascade(CascadeMode.StopOnFirstFailure).NotEmpty()
                .Must(x => x.Count() <= 100).WithMessage("List should not contain more than 100 mobile numbers.")
                .SetCollectionValidator(new MobileValidator());
    }
}

MobileValidator.cs

public class MobileValidator:AbstractValidator<string>
{
    public Mobilevalidator()
    {
        RuleFor(x => x).Matches("^[6789]\d{9}$").WithMessage("{PropertyValue} is not in correct mobile-number format");
    }
}

现在,当我将{null,"7897897897"}列表传递给MobileNos of Input类时,它没有给出任何错误,列表被接受以供进一步使用。 我无法理解这种奇怪的行为。 I also tried this

public class MobileValidator:AbstractValidator<string>
{
    public Mobilevalidator()
    {
        RuleFor(x => x).NotNull().Matches("^[6789]\d{9}$").WithMessage("{PropertyValue} is not in correct mobile-number format");
    }
}

但这也不适用于上面的输入。

有谁可以说明为什么它接受null值?

1 个答案:

答案 0 :(得分:2)

我不知道为什么您的代码不起作用,但是当您将InputValidator.cs更改为以下代码时,您可以获得所需的结果:

using FluentValidation;
using System.Linq;

public class InputsValidator : AbstractValidator<Inputs>
{
    public InputsValidator()
    {
        RuleFor(x => x.MobileNos).Cascade(CascadeMode.StopOnFirstFailure).NotEmpty()
                                 .Must(x => x.Count() <= 100).WithMessage("List should not contain more than 100 mobile numbers.");
        RuleForEach(x => x.MobileNos).NotNull().SetValidator(new MobileValidator());
    }
}

然后通过以下测试:

using FluentValidation;
using Xunit;
using System;
using System.Collections.Generic;

namespace test
{
    public class InputsValidatorTests
    {
        [Fact]
        public void WhenContainsNull_ThenIsNotValid()
        {
            var inputs = new Inputs();
            inputs.MobileNos = new List<string>() { null, "7897897897" };
            var inputsValidator = new InputsValidator();

            var result = inputsValidator.Validate(inputs);

            Assert.False(result.IsValid);
        }
    }
}