Я создал собственный TypeDescriptionProvider для одной из моих моделей MVC. Я использую его для динамического присвоения ValidationAttribute.
Я использую значение одного свойства, чтобы решить, какие атрибуты добавить к другим свойствам. В веб-сервисе, где я использую DataAnnotationsValidationRunner, проверка работает нормально.
Источник раннера: здесь
internal static class DataAnnotationsValidationRunner
{
public static IEnumerable<ErrorInfo> GetErrors(object instance)
{
return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(prop.GetValue(instance))
select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance);
}
}
Чтобы получить значение свойства, я использую следующий код (в MyCustomTypeDescriptor)
public override PropertyDescriptorCollection GetProperties()
{
var originalProperties = base.GetProperties();
var newProperties = new List<PropertyDescriptor>();
var myProperty = originalProperties.Find("CountryCodeID", false)
var myId = (int)countryProperty.GetValue(base.GetPropertyOwner(myProperty));
foreach (PropertyDescriptor pd in originalProperties)
{
AttributeCollection runtimeAttributes = pd.Attributes;
// add new attributes based on myId value
....
}
return new PropertyDescriptorCollection(newProperties.ToArray());
}
При использовании этой модели с этим дескриптором в MVC View я получаю следующее исключение:
Значение не может быть нулевым. Имя параметра: primary Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.
Сведения об исключении: System.ArgumentNullException: значение не может быть нулевым. Имя параметра: первичный
Как правильно получить значение свойства в TypeDescriptor? Я использую этот дескриптор через поставщика для типа модели, а не для экземпляра (например, global.asax).
РЕДАКТИРОВАТЬ: Я нашел обходной путь. В методе GetTypeDescriptor MyTypeDescriptorProvider я использую параметр экземпляра и передаю его конструктору MyCustomTypeDescriptor. Однако проверка MVC не работает. Я думаю, что он использует эти динамические данные автоматически (аналогично упомянутому выше бегуну).
РЕДАКТИРОВАТЬ 2: Используя workaroud, я почти всегда вижу нулевой экземпляр. Таким образом, невозможно получить значение там и передать его конструктору TypeDescriptor ...
Спасибо!