FluentValidation IRuleBuilderOptions 扩展方法 - 如果值存在,仅 运行 正则表达式验证器

FluentValidation IRuleBuilderOptions extension method - only run regex validator if value exists

我有以下 FluentValidation 扩展方法来验证 phone 个数字:

public static IRuleBuilderOptions<T, string> MatchPhoneNumber<T>(this IRuleBuilder<T, string> rule)
    => rule.Matches(@"^(1-)?\d{3}-\d{3}-\d{4}$").WithMessage("Invalid phone number");

我称之为:

RuleFor(contact => contact.PhoneNumber).MatchPhoneNumber()

但是,我只希望扩展方法在 phone 数字字符串不是 null/empty 时验证 phone 数字。我可以通过执行以下操作来做到这一点:

RuleFor(contact => contact.PhoneNumber)
    .MatchPhoneNumber()
    .When(contact => !string.IsNullOrEmpty(contact.PhoneNumber));

但是我可以在扩展方法本身中做到这一点吗?

您可以更改正则表达式以接受空字符串,如下所示: ^$|^(1-)?\d{3}-\d{3}-\d{4}$

但是,我已经尝试了最新版本的 FluentValidation (10.3.3),如果您将 null 或空字符串传递给 Matches 规则,它不会给出任何错误。在我的示例代码中,尽管 PhoneNumber 为 Null:

,但我没有在结果中得到任何错误
class Program
{
    static void Main(string[] args)
    {
        var contact = new Contact();
        var contactValidator = new ContactValidator();
        var result = contactValidator.Validate(contact);
        Console.WriteLine(result.IsValid); // This returns true with null phone number
    }
}

public class Contact
{
    public string PhoneNumber { get; set; }
}

public class ContactValidator : AbstractValidator<Contact>
{
    public ContactValidator()
    {
        RuleFor(contact => contact.PhoneNumber)
            .MatchPhoneNumber();
    }
}

public static class Extensions
{
    public static IRuleBuilderOptions<T, string> MatchPhoneNumber<T>(this IRuleBuilder<T, string> rule)
        => rule.Matches(@"^(1-)?\d{3}-\d{3}-\d{4}$").WithMessage("Invalid phone number");
}

您是否使用不同的方式来定义您的验证器?