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);
}
}
}
在我的项目中,我使用的是.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);
}
}
}