Fluent Validation - условная проверка потенциально нулевого значения
У меня есть несколько полей формы, таких как номера телефонов и почтовые индексы, которые можно оставить пустыми. Однако, когда они будут заполнены, я хочу, чтобы они соответствовали строгим правилам форматирования.
Я собираюсь использовать Fluid 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?
1 ответ
Я думаю, что вы получаете "Ссылка на объект не установлена на экземпляр объекта." При попытке оценить длину 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”");
});