Хотя атрибут IgnoreNulls
может быть добавлен, он приводит к запутанному ValidationResults
при возвращении результатов проверки. Это связано с тем, что блок валидации неявно заключает валидаторы в OrCompositeValidator
- свойство может иметь значение null ИЛИ может быть целым числом в указанном диапазоне.
При сбое проверки результат проверки верхнего уровня относится к OrCompositeValidator
. Чтобы получить реальный результат проверки RangeValidator
, теперь вам нужно детализировать свойство NestedValidationResults
объекта ValidationResult
.
Это похоже на большую работу по обработке сообщений с результатами проверки, поэтому мне казалось, что должен быть лучший способ.
Вот что я сделал.
- Я создал класс с именем
IgnoreNullStringLengthValidator
, который наследуется от StringLengthValidator
(здесь вы бы унаследовали RangeValidator
).
- Создайте все конструкторы, необходимые для поддержки базовых конструкторов.
Переопределите метод DoValidate
и проверьте нулевое значение - здесь вы должны написать:
if (!objectToValidate.HasValue) return;
- Убедитесь, что ваша следующая строка кода вызывает
base.DoValidate(...)
.
- Создан класс атрибута с именем
IgnoreNullStringLengthValidatorAttribute
, который возвращает новый IgnoreNullStringLengthValidator
. Здесь вы должны создать класс IgnoreNullRangeValidatorAttribute
.
Полученный результат проверки намного больше того, что вы ожидаете, потому что он не встраивает ваши валидаторы неявным образом.