fluentvalidation 的 SetCollectionValidator 的奇怪行为

Strange behaviour of fluentvalidation's SetCollectionValidator

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

[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 class 时,它没有给出任何错误,列表被接受以供进一步使用。 我无法理解这种奇怪的行为。 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 值?

我不知道为什么您的代码不起作用,但是当您将 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);
        }
    }
}