在我的项目中,我正在使用.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
值?
答案 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);
}
}
}