【发布时间】:2013-04-11 19:43:26
【问题描述】:
我有一个电话号码通知模型(用户通过与他们的帐户相关联的电话号码收到紧急情况通知,并且他们可以设置这些电话号码的调用顺序)。大多数情况下,模型中的电话号码部分是必需的,但在创建新用户期间有一种特殊情况,我们不想强制使用它。
我制作了一个非常简单的子对象 UserCreationPhoneNotificationModel,它继承自上述 UserPhoneNotificationModel。还有一些其他小的更改,但这里的相关更改覆盖了 PhoneNumber 字段,因此不再需要它。
在父模型中是
[Required]
public virtual string PhoneNumber { get; set; }
在子模型中它只是
public override string PhoneNumber { get; set; }
我认为这可以解决问题,但显然不是。我认为问题在于RequiredAttribute 会有 Inherited = true ,但事实并非如此,所以我不完全确定为什么它会被继承到子类中。
我做了仔细检查以确保,从父类的字段中删除Required也使得子类中的字段不需要,所以它肯定是某种继承的东西。
【问题讨论】:
-
RequiredAttribute 通过 ValidationAttribute 继承自 Attribute。抽象类 Attribute 具有 Inherited = true。您最好在场景中使用自定义属性并将 Inherited 标志设置为 false。
-
啊,我刚刚意识到我没有进一步向上看。创建一个新属性只是为了关闭 Inherited 似乎有点愚蠢,但看起来这是唯一的方法。
-
您是否尝试过设置电话号码以通过赋予新关键字来隐藏基本实现?
-
在 .net mvc 中更轻松、更清洁的开发的一般建议:优先组合而不是继承——使用视图模型——将注释放在 vm 上,靠近需要它们的 ui。
标签: c# asp.net-mvc data-annotations