Проверка не работает, когда я использую Блок проверки допустимости. TryValidateObject

DataAnnotations не работает с классом приятеля. Следующий код всегда проверяет верный. Почему?

var isValid = Блок проверки допустимости. TryValidateObject (новый Клиент (), Контекст, результаты, верные);

и вот класс приятеля.

public partial class Customer 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
}

[MetadataType(typeof(CustomerMetaData))]
public partial class Customer 
{ 
    public class CustomerMetaData 
    { 
        [Required(ErrorMessage = "You must supply a name for a customer.")]        
        public string Name { get; set; } 
    } 
}

Вот другой поток с тем же вопросом., но никакой ответ. текст ссылки

9
задан Community 23 May 2017 в 12:17
поделиться

3 ответа

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

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

TypeDescriptor.AddProviderTransparent(
            new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Customer), typeof(CustomerMetadata)), typeof(Customer));

var isValid = Validator.TryValidateObject(new Customer(), context, results, true);
29
ответ дан 4 December 2019 в 06:40
поделиться

Хотя я не тестировал ваш код в .NET 4.0, в .NET 3.5 / Silverlight 3 ваш класс метаданных должен выглядеть следующим образом:

[MetadataType(typeof(Customer.CustomerMetaData))]
public partial class Customer 
{ 
    internal sealed class CustomerMetaData 
    {
        private CustomerMetaData()
        {
        }

        [Required(ErrorMessage = "You must supply a name for a customer.")]        
        public string Name; 
    } 
}
1
ответ дан 4 December 2019 в 06:40
поделиться

После некоторого исследования я не смог найти причину, по которой TryValidateObject всегда возвращает true, если я использую MetadataType (класс друзей). Но он работает со следующим кодом (xVal).

    public static IEnumerable<ErrorInfo> GetErrors(object instance, string name)
    {
        var metadataAttrib = instance.GetType()
                .GetCustomAttributes(typeof(MetadataTypeAttribute), true)
                .OfType<MetadataTypeAttribute>().FirstOrDefault();
        var buddyClassOrModelClass = metadataAttrib != null
                ? metadataAttrib.MetadataClassType
                : instance.GetType();
        var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass)
            .Cast<PropertyDescriptor>();
        var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType())
            .Cast<PropertyDescriptor>();

        var list = from buddyProp in buddyClassProperties
                   join modelProp in modelClassProperties on
                            buddyProp.Name equals modelProp.Name
                   from attribute in buddyProp.Attributes.OfType<ValidationAttribute>()
                   where !attribute.IsValid(modelProp.GetValue(instance))
                   select new ErrorInfo(
                       buddyProp.Name,
                       attribute.FormatErrorMessage(modelProp.Name),
                       instance);

        if (name != null)
            list = list.Where(x => x.PropertyName == name);

        return list;
    }
4
ответ дан 4 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: