Простой способ доступа к зависимому свойству внутри пользовательских аннотаций данных

#.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);