首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataAnnotations MetadataType类忽略基类属性

DataAnnotations MetadataType类忽略基类属性
EN

Stack Overflow用户
提问于 2010-10-01 00:56:54
回答 2查看 930关注 0票数 2

在尝试使用.NET DataAnnotations特性在派生类中提供简单的验证时,我遇到了一些困难。我用.NET 4(来自System.ComponentModel.DataAnnotations命名空间)中包含的标准批注标记我的类,然后使用MS企业库v5验证块来处理规则。

我有许多对象是从一个公共基类派生的,这个基类包含我所有对象的公共属性。出于验证的目的,对于从这个类派生的各种类,我可能有不同的规则。

下面是一个简化的例子:

代码语言:javascript
复制
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提供的验证属性;如果可能的话,我更喜欢让这个库不依赖于核心框架。

是我错过了什么,还是我只是运气不好?

EN

回答 2

Stack Overflow用户

发布于 2010-10-01 01:42:58

我想我有一个可行的解决方案。

似乎元数据类将不提供对属于目标对象的超类的属性的验证。为了让元数据与此一起工作,我需要将超类属性标记为虚拟,然后为我想要验证的属性提供覆盖。

示例(原始示例参见上面的问题):

代码语言:javascript
复制
public abstract class PersonBase
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}
[MetadataType(typeof(CustomerMD))]
partial class Customer : PersonBase
{
    public override string Name
    {
        get
        {
            return base.Name;
        }
        set
        {
            base.Name = value;
        }
    }
}

覆盖到位后,验证器将按预期工作。这是一个稍微多一点的工作,但它会完成工作。

我还尝试将注释作为备用默认规则添加到基类中;这允许我拥有一组基本规则,并根据需要逐一覆盖它们。看起来不错。

票数 1
EN

Stack Overflow用户

发布于 2016-04-05 23:26:01

我遇到了同样的问题,无法让它使用MethadataType注释具有属性的基类。像Scroll Lock一样,我做了基类虚拟属性的重写部分。在它的顶部,我为非虚拟属性做了“阴影”。

代码语言:javascript
复制
public class BaseClass
{
  public virtual int Id {get;set;}

  public string Name {get;set;}
}


public class DerivedClass
{
   [SomeAttribute]
   public ovveride int Id {get{ return base.Id;} set{ base.Id = value;}}

   [SomeAttribute]
   public new string Name {get{ return base.Name;} set{ base.Name = value;}}
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3832946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档