0

У меня есть несколько полей формы, таких как номера телефонов и почтовые индексы, которые можно оставить пустыми. Однако, когда они заполняются, я хочу, чтобы они соответствовали строгим правилам форматирования.Fluent Validation - условная проверка потенциально нулевого значения

Ищу использовать 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?

+0

Ваш '. Length() 'и связанные' .When() 'даже не нужны - его уже покрывает регулярное выражение, которое требует 12 символов. И я думаю, что '.When()', связанный с '.Matches()', также не требуется, поскольку регулярное выражение не вычисляется, если значение пусто. –

ответ

2

Я думаю, что вы получаете «Ссылка на объект, не установленную на экземпляр объекта», при попытке оценить длину свойства PhoneNumber, когда оно равно null. Сначала вам нужно проверить, что это не null, и только затем применить все другие правила. В дополнение к этому регулярному выражению, которое вы использовали в 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”");   
}); 
+0

Как конфликтуют два правила? Они оба имеют дело с 12 символами. Регулярное выражение проверяет шаблон ### - ### - ####, а длина просто проверяет точную длину 12 символов. –

+0

Вы правы, я пропустил тире в регулярном выражении. обновлен ответ –

+0

Не было ли мое решение работать? –

 Смежные вопросы

  • Нет связанных вопросов^_^