是否可以覆盖.NET子类中的DataAnnotation属性?

时间:2014-04-02 15:52:50

标签: .net asp.net-mvc-4 data-annotations unobtrusive-validation

我正在尝试覆盖子类中的DataAnnotation。

我尝试过类似问题的解决方案但我的成功有限。

例如,我使用RangeAttribute

来创建此类
public class BaseViewModel 
{
    [Range(1, 99999999, ErrorMessageResourceName = "NotInRange9M", ErrorMessageResourceType = typeof(Resources.Account))]
    public virtual decimal? Amount { get; set; }
}

和一个儿童班:

public class ExtendedViewModel : BaseViewModel
{
    internal decimal? _amount;

    [Range(1, 2000, ErrorMessageResourceName = "NotInRange2K", ErrorMessageResourceType = typeof(Resources.Account))]
    public override decimal? Amount {
        get { return _amount; }
        set { _amount = value; }
    }
}

此示例有效,因此使用第一个对象的表单将提供客户端验证错误"The amount must be between 1 and 999,999,999",第二个将表示"The amount must be between 1 and 2,000"

但是,如果我想让子类没有任何验证:

public class ExtendedViewModel : BaseViewModel
{
    internal decimal? _amount;

    public override decimal? Amount {
        get { return _amount; }
        set { _amount = value; }
    }
}

使用它的表单仍然会给客户端验证错误"The amount must be between 1 and 999,999,999",它以某种方式从父级继承。

所以我们可以覆盖属性,但我们无法摆脱它们? 还有另一种方式吗?

我也尝试过:

    new public decimal? Amount {
        get { return _amount; }
        set { _amount = value; }
    }

没有成功。

我不得不解决这个限制,但我想了解数据注释的这种机制,以便我可以更好地使用它们。

1 个答案:

答案 0 :(得分:1)

嗯,在Attributes类上有一个AttributeUsageAttribute ....

例如,RangeAttribute看起来像那样

[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field|AttributeTargets.Parameter, AllowMultiple = false)]
public class RangeAttribute : ValidationAttribute

AttributeUsageAttribute类的一个属性是Inherited,看起来就是这样。

    //
    // Summary:
    //     Gets or sets a Boolean value indicating whether the indicated attribute can
    //     be inherited by derived classes and overriding members.
    //
    // Returns:
    //     true if the attribute can be inherited by derived classes and overriding
    //     members; otherwise, false. The default is true.
    public bool Inherited { get; set; }

正如我们在RangeAttribute的定义中看到的那样,属性中不存在Inherited属性。 所以默认情况下是这样,所以属性是在覆盖成员上继承的。