2011-10-31 50 views
2

我有我的DomainRegistry模型以下屬性:簡單的方式

[Domain("Extension")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Select extension")] 
    public string Extension { get; set; } 

域名是我的自定義數據註解,我已經在我的IsValid方法來訪問值tryed一切內部擴展屬性。

我有我的自定義數據註解如下:

[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方法從擴展中的值。任何人有任何提示如何做到這一點?另外我需要將擴展​​名作爲字符串值。

回答

4

試試這個:

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; 
    } 
+0

完全是我找到的解決方案。 –

+0

雖然有效,但我建議使用validationContext.ObjectType而不是validationContext.ObjectInstance.GetType(),因爲此信息已經可用。 –

1

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; 
} 
+0

我tryed使用find,並得到了一個錯誤。 –

+0

仍然我找到了一種方法:'字符串擴展=(字符串)validationContext.ObjectType.GetProperty(ExtensionProperty).GetValue(validationContext.ObjectInstance,null);' –