Блок валидации корпоративной библиотеки - проверять обнуляемые свойства? - PullRequest
4 голосов
/ 20 января 2009

Я пытаюсь найти подтверждение для обнуляемого свойства, например int.

Пример

[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }

Однако, если я установлю Age на пустое значение, проверка завершится неудачей, поскольку она не попадает в диапазон, я знаю, что мне также нужен [ValidatorComposition(CompositionType.Or)], но что еще мне следует использовать?

Ответы [ 3 ]

6 голосов
/ 16 июня 2010

Хотя атрибут IgnoreNulls может быть добавлен, он приводит к запутанному ValidationResults при возвращении результатов проверки. Это связано с тем, что блок валидации неявно заключает валидаторы в OrCompositeValidator - свойство может иметь значение null ИЛИ может быть целым числом в указанном диапазоне.

При сбое проверки результат проверки верхнего уровня относится к OrCompositeValidator. Чтобы получить реальный результат проверки RangeValidator, теперь вам нужно детализировать свойство NestedValidationResults объекта ValidationResult.

Это похоже на большую работу по обработке сообщений с результатами проверки, поэтому мне казалось, что должен быть лучший способ.

Вот что я сделал.

  1. Я создал класс с именем IgnoreNullStringLengthValidator, который наследуется от StringLengthValidator (здесь вы бы унаследовали RangeValidator).
  2. Создайте все конструкторы, необходимые для поддержки базовых конструкторов.
  3. Переопределите метод DoValidate и проверьте нулевое значение - здесь вы должны написать:

    if (!objectToValidate.HasValue) return;
    
  4. Убедитесь, что ваша следующая строка кода вызывает base.DoValidate(...).
  5. Создан класс атрибута с именем IgnoreNullStringLengthValidatorAttribute, который возвращает новый IgnoreNullStringLengthValidator. Здесь вы должны создать класс IgnoreNullRangeValidatorAttribute.

Полученный результат проверки намного больше того, что вы ожидаете, потому что он не встраивает ваши валидаторы неявным образом.

5 голосов
/ 20 января 2009

Вы можете добавить атрибут IgnoreNulls:

[IgnoreNulls()]
[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }
1 голос
/ 09 ноября 2009

Да, но тогда, если RangeValidator вызывает ValidationResult, то по какой-то причине я получаю два ValidationResults ... одного правильно для проблемы проверки диапазона, но потом еще одно загадочное, которое говорит:

Значение не равно нулю и не выполнено все правила проверки для ключа Age.

Это глупо, я НИКОГДА не хочу, чтобы IgnoreNulls валидатор вызывал результат валидации! Его действительно нужно изменить, не так ли? Добавьте это к отсутствию реального наследования и функциональности Validation при использовании полиморфизма и многого другого, и есть так много «небольших» проблем с атрибутами VAB, что я считаю его непригодным для чего-либо, кроме тривиального.

...