Подтвердить что ты не робот

Проверка DataAnnotations с помощью класса Validator

Я пытаюсь проверить класс, украшенный аннотацией данных, с помощью класса Validator.

Он отлично работает, когда атрибуты применяются к одному классу. Но когда я пытаюсь использовать класс метаданных, он не работает. Есть ли что-то, что я должен делать с Validator, чтобы он использовал класс метаданных? Вот какой код..

это работает:

public class Persona
    {
        [Required(AllowEmptyStrings = false, ErrorMessage = "El nombre es obligatorio")]
        public string Nombre { get; set; }

        [Range(0, int.MaxValue, ErrorMessage="La edad no puede ser negativa")]
        public int Edad { get; set; }
}

это не работает:

[MetadataType(typeof(Persona_Validation))]
    public class Persona
    {        
        public string Nombre { get; set; }

        public int Edad { get; set; }        

    }

    public class Persona_Validation
    {
        [Required(AllowEmptyStrings = false, ErrorMessage = "El nombre es obligatorio")]
        public string Nombre { get; set; }

        [Range(0, int.MaxValue, ErrorMessage = "La edad no puede ser negativa")]
        public int Edad { get; set; }
    }

Вот как я проверяю экземпляры:

ValidationContext context = new ValidationContext(p, null, null);
            List<ValidationResult> results = new List<ValidationResult>();

            bool valid = Validator.TryValidateObject(p, context, results, true);

спасибо.

4b9b3361

Ответ 1

Я нашел ответ здесь: http://forums.silverlight.net/forums/p/149264/377212.aspx

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

TypeDescriptor.AddProviderTransparent(
            new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Persona), typeof(Persona_Validation)), typeof(Persona));

ValidationContext context = new ValidationContext(p, null, null);
List<ValidationResult> results = new List<ValidationResult>();

bool valid = Validator.TryValidateObject(p, context, results, true);

Ответ 2

Попробуйте переместить класс метаданных в те же пространства имен, что и класс Persona, если он еще не был. У меня были схожие проблемы и перемещение моего класса метаданных в те же пространства имен, что и класс модели L2S для меня.