我试图使用.NET DataAnnotations功能在派生类中提供简单验证时遇到了一点困难。我使用.NET 4中包含的标准注释(来自System.ComponentModel.DataAnnotations命名空间)标记我的类,然后使用MS Enterprise Library v5验证块处理规则。DataAnnotations MetadataType类忽略基类属性
我有一些从一个公共基类派生的对象,其中包含所有我的对象的共同属性。出于验证的目的,我可能对从这个类派生的各个类有不同的规则。
这里有一个简单的例子:
public abstract class PersonBase
{
public int Id { get; set; }
public string Name { get; set; }
}
[MetadataType(typeof(CustomerMD))]
public class Customer : PersonBase
{
}
[MetadataType(typeof(ManagerMD))]
public class Manager : PersonBase
{
}
public class CustomerMD
{
[Required]
[StringLength(20, ErrorMessage="Customer names may not be longer than 20 characters.")]
public object Name { get; set; }
}
public class ManagerMD
{
[Required]
[StringLength(30, ErrorMessage = "Manager names may not be longer than 30 characters.")]
public object Name { get; set; }
}
// calling code
var invalidCustomer = new Customer {Id=1, Name=string.Empty};
var valFactory = EnterpriseLibraryContainer.Current.GetInstance<ValidatorFactory>();
var customerValidator = valFactory.CreateValidator<Customer>();
var validationResults = customerValidator.Validate(invalidCustomer);
// validationResults.IsValid should equal False, but actually equals True.
我发现,我能得到预期的验证结果,如果我把注释到基类,但后来我失去履行不同的不同要求的能力类型。另外,如果我在派生类中放置特定于类的属性并为这些属性提供元数据,我会得到结果,但仅限于这些属性,而不是基类中的属性。
我还没有尝试过使用EntLib提供的验证属性;如果可能的话,我宁愿保持图书馆的生活不受外部核心框架的依赖。
我错过了什么,或者我只是在这里运气不好?