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; }
}
}
Вот другой поток с тем же вопросом., но никакой ответ. текст ссылки
Я нашел ответ здесь: 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);
Хотя я не тестировал ваш код в .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;
}
}
После некоторого исследования я не смог найти причину, по которой 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;
}