代码之家  ›  专栏  ›  技术社区  ›  Nick

是否可以重写.NET子类中的DataAnnotation属性?

  •  3
  • Nick  · 技术社区  · 10 年前

    我正在尝试重写子类中的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; }
        }
    }
    

    使用此选项的表单仍然会显示客户端验证错误 “金额必须介于1和999999999之间” ,它以某种方式从父级继承。

    因此,我们可以覆盖属性,但无法消除它们? 还有别的办法吗?

    我也尝试过:

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

    没有成功。

    我必须克服这个限制,但我想了解数据注释的这种机制,以便更好地使用它们。

    1 回复  |  直到 10 年前
        1
  •  3
  •   Raphaël Althaus    10 年前

    嗯,有一个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 , 继承 属性中不存在属性。 所以默认情况下它是true,所以属性是在重写成员上继承的。