#.net #asp.net-mvc-3 #data-annotations
#.net #asp.net-mvc-3 #данные-аннотации
Вопрос:
В моей модели у меня есть следующие свойства DomainRegistry
:
[Domain("Extension")]
public string Name { get; set; }
[Required(ErrorMessage = "Select extension")]
public string Extension { get; set; }
Домен это моя пользовательская аннотация данных, и я перепробовал все в своем IsValid
методе, чтобы получить доступ к значению внутри свойства расширения.
В моей аннотации пользовательских данных у меня есть следующее:
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class DomainAttribute : ValidationAttribute
{
public string ExtensionProperty { get; set; }
public DominioAttribute(string property)
{
ExtensionProperty = property;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
var extension = (string) properties.Find(Propriedade, true).GetValue(value);
if (extension == null) return new ValidationResult("Extension shouldn't be null");
return null;
}
Кажется, я не могу получить значение из расширения внутри IsValid
метода. У кого-нибудь есть совет, как это сделать? Также мне нужно получить расширение в виде строкового значения.
Ответ №1:
Попробуйте это:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var containerType = validationContext.ObjectInstance.GetType();
var field = containerType.GetProperty("Extension");
if (field != null)
{
var extensionValue = field.GetValue(validationContext.ObjectInstance, null);
return extensionValue != null ? ValidationResult.Success : new ValidationResult("Extension shouldn't be null", new[] { validationContext.MemberName });
}
return ValidationResult.Success;
}
Комментарии:
1. Именно то решение, которое я нашел.
2. Хотя это допустимо, я бы предложил использовать ValidationContext.ObjectType вместо ValidationContext.ObjectInstance . GetType(), поскольку эта информация стала доступной.
Ответ №2:
Параметр IsValid
метода value
содержит фактическое значение аннотируемого свойства, поэтому в вашем случае значение Name
свойства. Чтобы получить доступ к фактическому DomainRegistry
экземпляру (чтобы получить значение Extension
свойства), вы должны использовать validationContext.ObjectInstance
свойство:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(validationContext.ObjectInstance);
var extension = (string)properties.Find(ExtensionProperty, true).GetValue(validationContext.ObjectInstance);
if (extension == null) return new ValidationResult("Extension shouldn't be null");
return ValidationResult.Success;
}
Комментарии:
1. Тем не менее, я нашел способ сделать это:
string extension = (string) validationContext.ObjectType.GetProperty(ExtensionProperty).GetValue(validationContext.ObjectInstance, null);