Fluent验证 - 可能为空值的条件验证

时间:2016-03-04 22:50:31

标签: asp.net-mvc asp.net-mvc-5 fluentvalidation fluentvalidation-2.0

我有许多表单字段,例如电话号码和邮政编码,可以留空。但是,当它们被填写时,我希望它们符合严格的格式规则。

我希望将Fluent验证用于此任务,但我还没有找到任何可以执行以下操作的内容:

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甚至不可能这样做?

1 个答案:

答案 0 :(得分:3)

我认为在尝试评估长度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”");           
 });