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”");           
 });
Другие вопросы по тегам