Проверка на уровне класса - PullRequest
       30

Проверка на уровне класса

3 голосов
/ 07 октября 2010

Я проверяю класс с DataAnnotations utils.

У меня есть класс, который имеет свойство Title и свойство Item.Я хочу применить RequiredAttribute к свойству Title, но оно должно быть недействительным, только если свойство Item имеет значение null;если свойство Item установлено для объекта, Title не требуется.

Короче говоря, я хочу, чтобы RequiredAttribute проверял только если условие вкласс удовлетворен.

Как это можно сделать.

Обновление

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

Обновление 2
Я хочу, чтобы валидатор уровня класса суммировал по полю.Например, у меня есть поля Cost и SalesPrice, я хочу убедиться, что SalesPrice> Cost, и в противном случае аннулировать SalesPrice, я не хочу, чтобы глобальная ошибка проверки была на уровне класса.xamly путь.

Ответы [ 2 ]

6 голосов
/ 07 октября 2010

Вы можете сделать это, создав собственный атрибут проверки для класса.К сожалению, атрибуты DataAnnotation, назначенные свойствам, не могут получить доступ к другим свойствам родительского класса, насколько мне известно, поэтому возникает необходимость создания валидатора класса.
Используя пространство имен System.ComponentModel.DataAnnotations, вам потребуется создать свой собственный класс атрибутов, наследующийиз ValidationAttribute и переопределите метод IsValid (я не проверял приведенный ниже код, но он должен помочь вам):

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
sealed public class CustomAttribute: ValidationAttribute
{
  public CustomAttribute()
  {
  }

  public override bool IsValid(object value)
  {
     if(value is myClass)
     {
       return ((myClass)value).Item != null &&
         string.IsNullOrEmpty(((myClass)value).Title) ? false : true;
     }
     else return true;
  }
}

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

0 голосов
/ 07 октября 2010

хорошо, на уровне свойств в MVC трудно добиться условных проверок. но вы можете расширить фреймворк или использовать другую библиотеку для достижения цели. Я успешно использую проверку достоверности по нику для условных проверок в моем проекте. Вы можете взглянуть на это здесь

...