Fluent Validation - 潜在空值的条件验证

Fluent Validation - conditional validation of a potentially null value

我有一些表单字段,例如 phone 数字和邮政编码,可以留空。但是,当他们填写时,我希望他们符合严格的格式规则。

我希望为此任务使用 Fluent Validation,但我还没有找到可以执行以下操作的任何东西:

RuleFor(x => x.PhoneNumber)
  .Matches(@"^\d{3}-\d{3}-\d{4}$")
  .When(x => x.PhoneNumber.Length != 0)
  .WithMessage("Phone number must be a valid 10-digit phone number with dashes, in the form of “123-456-7890”")
  .Length(12, 12).When(x => x.PhoneNumber.Length >= 1).WithMessage("Phone number must be in the form of “123-456-7890”");

现在这两个都抛出“对象引用未设置到对象的实例”。错误。

我说的有道理吗,或者这甚至不能用 FluentValidation 实现?

我认为您得到的是“对象引用未设置到对象的实例”。当尝试评估长度 PhoneNumber 属性 时,它为空。首先,您需要检查它是否不为空,然后才应用所有其他规则。除了您在 Matches(@"^\d{3}-\d{3}-\d{4}$") 中使用的正则表达式之外,还包含长度验证,因此您可以安全地删除

.Length(12, 12).When(x => x.PhoneNumber.Length >= 1).WithMessage("Phone number must be in the form of “123-456-7890”");

如果删除长度规则,类似的东西应该可以工作:

When(x =>  x.PhoneNumber != null, 
   () => {
      RuleFor(x => x.PhoneNumber).Matches(@"^\d{3}-\d{3}-\d{4}$")
      .WithMessage("Phone number must be a valid 10-digit phone number with dashes, in the form of “123-456-7890”");           
 });