如何阻止 [Required] 注释在被覆盖的字段上被继承?

Kyl*_*e S 7 c# asp.net-mvc data-annotations

我有一个电话号码通知模型(用户通过与他们的帐户关联的电话号码获得紧急情况通知,并且他们可以设置调用这些电话的顺序)。大多数情况下,模型的电话号码部分是必需的,但在创建新用户的过程中存在一种特殊情况,我们不想强制使用它。

我创建了一个非常简单的子对象 UserCreationPhoneNotificationModel,它继承自上述 UserPhoneNotificationModel。还有一些其他小的更改,但这里的相关更改是覆盖 PhoneNumber 字段,以便不再需要它。

在父模型中它是

[Required]
public virtual string PhoneNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)

在子模型中它只是

public override string PhoneNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)

我认为这可以解决问题,但显然不是。我认为问题在于 RequiredAttribute 上会有 Inherited = true ,但事实并非如此,所以我不完全确定为什么它会被继承到子类中。

我做了双重检查以确保,从父类中的字段中删除 Required 也使得子类中的字段不需要,所以这绝对是某种继承的东西。

Anu*_*rma 6

可以通过用同名的新属性隐藏现有属性来完成。所以,如果父类中的属性是这样的:

[Required]
public virtual string PhoneNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)

您可以在子类中定义新属性,如下所示:

public new string PhoneNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将在子类中隐藏 PhoneNumber 属性及其属性。现在您可以将任何其他属性与它一起使用。例如,您可以[PhoneNumber]向子类中的属性添加属性。


小智 -2

如果使用 C# 4.0,

编写“新”构造函数怎么样?

public new string PhoneNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)

我不确定它是否有效。

  • 也许您可以在发布答案之前对此进行测试。 (4认同)