2016-08-09 2 views
2

Когда я реализую собственный атрибут, унаследованный от класса ValidationAttribute, я всегда переопределял метод bool IsValid(object value), который отбрасывает другой, прототип которого составляет ValidationResult IsValid(objet value, ValidationContext validationContext).Какой метод IsValid следует переопределить при реализации пользовательского ValidationAttribute

Возможно, я должен переопределить второй метод, даже если я не использую контекст проверки или результат (я использую проверку с EntityFramework и ModelState.IsValid). Или продолжайте игнорировать перегруженный метод. Если тогда, могу ли я иметь объект, действительный или недействительный, в зависимости от контекста, активируется проверка атрибута? Является ли ситуация, показанная в приведенном ниже кодексе проблематичным?

class StrictlyPreviousAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var dateTime = value as DateTime?; 
     return dateTime == null || dateTime <= DateTime.Today; 
    } 
} 

class PreviousAttribute : StrictlyPreviousAttribute 
{ 
    public override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var dateTime = value as DateTime?; 

     if(dateTime == DateTime.Today) 
     { 
      return ValidationResult.Success; 
     } 
     else 
     { 
      return base.IsValid(object); 
     } 
    } 
} 

Я не знаю, есть ли какие-либо объективные заблуждения или если мне не хватает какой-то точки. Есть ли метод, который я должен лучше переопределить, а не другой. Должен ли я переопределить оба.

+1

ValidationContext позволяет легко получить доступ к другим свойствам и был добавлен в .NET 4.0. Вот хорошее описание: http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2 –

+0

@SteveGreene Я разместил соответствующие часть из предоставленной вами ссылки. Кредит ответа должен быть вашим. Благодарю. –

ответ

0

Ссылка, предоставленная Стивом Грин в комментарии выше, просветляет разницу между методами и отвечает на вопрос.

Метод, возвращающий bool, по-прежнему существует для обратной совместимости, но не является абстрактным со времени .NET 4.0. Рекомендуется переопределить метод, который имеет доступ к ValidationContext.

Это (помимо всего прочего) дает нам доступ ко всей модели, даже если валидатор в собственности уровне. Массивным преимуществом использования валидатора уровня собственности является , что ошибка установлена ​​против самого свойства, а не класса , устраняющего требование использования Html.ValidationSummary. Так как ошибка проверки установлена ​​против свойства правильно, ваш нормальный Html.ValidationFor Html.ValidationMessageFor helpers будет отображать и отображать ошибку в отношении неправильного поля формы.

Это было написано некоторое время назад (с ASP.NET MVC 3), но остается в силе в среде .NET 4.6. Кроме того, я применил модульные тесты для метода bool IsValid(object value). Тесты продолжают проходить, даже если я переопределяю метод только с параметром ValidationContext.

+0

Метод отображения ошибки проверки свойства: Html.ValidationMessageFor not Html.ValidationFor, это ошибка – IcyBrk

+0

Исправлено! Это может быть путаница между методами расширения ValidationMessageFor и 'ValidateFor'. –

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