FluentValidation IRuleBuilderOptions扩展如何仅在值存在时运行正则校验
实现方案
完全可以把判断逻辑封装到扩展方法内部,无需每次调用时手动追加When条件,改造后的扩展方法代码如下:
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") .When((_, phoneNumber) => !string.IsNullOrEmpty(phoneNumber));
说明
- 上述代码使用了FluentValidation中
When方法的重载,可直接获取当前待校验的属性值,不需要从根模型中重复读取手机号字段,扩展方法的通用性不受影响,可直接复用到其他模型的手机号字段校验场景 - 改造后原有调用逻辑无需任何改动,直接使用
RuleFor(contact => contact.PhoneNumber).MatchPhoneNumber()即可:当手机号为null或空字符串时,规则会自动跳过,仅当字段有值时才执行格式校验 - 如果你需要同时要求手机号为必填项,只需要在调用时额外追加
.NotEmpty()规则即可,和当前扩展方法的逻辑互不冲突
内容的提问来源于stack exchange,提问作者Ryan Buening
相关产品推荐
相关产品推荐

