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

Rya*_*ing 2 c# fluentvalidation

我有以下 FluentValidation 扩展方法来验证电话号码:

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");
Run Code Online (Sandbox Code Playgroud)

我称之为:

RuleFor(contact => contact.PhoneNumber).MatchPhoneNumber()
Run Code Online (Sandbox Code Playgroud)

但是,我只希望扩展方法在电话号码字符串不为空/空时验证电话号码。我可以通过执行以下操作来做到这一点:

RuleFor(contact => contact.PhoneNumber)
    .MatchPhoneNumber()
    .When(contact => !string.IsNullOrEmpty(contact.PhoneNumber));
Run Code Online (Sandbox Code Playgroud)

但有没有办法可以在扩展方法本身中做到这一点?

小智 5

您可以更改正则表达式以接受空字符串,如下所示: ^$|^(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");
}

Run Code Online (Sandbox Code Playgroud)

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