Как вызвать ValidationAttributes вручную?(DataAnnotations и ModelState) - PullRequest
5 голосов
/ 13 декабря 2010

Нам необходимо в рамках нашей логики перебирать свойства модели для автоматического связывания свойств, и мы хотим расширить функциональность, включив новые аннотации данных в C # 4.0.

На данный моментЯ в основном перебираю каждую загрузку свойства во всех экземплярах ValidationAttribute и пытаюсь проверить с помощью функции Validate / IsValid, но мне кажется, что это не работает.

В качестве примера у меня есть такая модель:

public class HobbyModel
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "Do not allow empty strings")]
    [DisplayName("Hobby")]
    [DataType(DataType.Text)]
    public string Hobby
    {
        get;
        set;
    }
}

И код для проверки атрибутов:

object[] attributes = propertyInfo.GetCustomAttributes(true);
TypeConverter typeConverter =
TypeDescriptor.GetConverter(typeof(ValidationAttribute));

bool isValid = false;
foreach (object attr in attributes)
{
   ValidationAttribute attrib = attr as ValidationAttribute;

   if (attrib != null)
   {
     attrib.Validate(obj, propertyInfo.Name);
   }
}

Я отладил код, и модель имеет 3 атрибута, 2 из которых получены из ValidationAttribute, нокогда код проходит через функцию Validate (с пустым или нулевым значением), он генерирует исключение, как и ожидалось.

Я ожидаю, что делаю что-то глупое, поэтому мне интересно, использовал ли кто-нибудь эту функциюи может помочь.

Заранее спасибо, Джейми

Ответы [ 2 ]

4 голосов
/ 13 декабря 2010

Вы используете класс System.ComponentModel.DataAnnotations.Validator для проверки объектов.

3 голосов
/ 27 апреля 2012

Это потому, что вы передаете исходный объект методу Validate вместо значения свойства. Следующее, скорее всего, будет работать должным образом (хотя, очевидно, не для индексированных свойств):

attrib.Validate(propertyInfo.GetValue(obj, null), propertyInfo.Name);

Вам, конечно, будет легче , если использовать класс Validator , как Стивен предложил , хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...