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”");
});
我有一些表单字段,例如 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”");
});