我正在尝试覆盖子类中的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; }
}
没有成功。
我不得不解决这个限制,但我想了解数据注释的这种机制,以便我可以更好地使用它们。
答案 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
属性。
所以默认情况下是这样,所以属性是在覆盖成员上继承的。