为什么继承的数据注释停止工作?

Why do inherited data annotations stop working?

如果有人遗漏了标签:我正在使用 .NET MVC5 开发 Web 应用程序,并使用数据注释进行验证(客户端和服务器端)。

我想自定义内置注释(Required、StringLentgth、Range 等)以更好地满足我的需求。我首先制作了自己的 class,它继承了 RequiredAttribute,几乎没有添加任何内容,并将我的视图模型上的 Required 替换为 Test。我 运行 希望它能像以前一样 100% 地工作,但令我惊讶的是,验证完全停止了对上述领域的工作。在 HTML 中,之前存在的 data-val-required="......" 根本就没有再出现了。

我的新属性(无论有没有使用规范我都试过了,结果是一样的):

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class TestAttribute : RequiredAttribute
{
    // Literally nothing new, same as superclass.
}

viewmodel中的注释属性:

// Before, works.
[Required]
public int WorkerId { get; set; }

// After, doesn't work.
[Test]
public int WorkerId { get; set; }

那么,这是如何运作的?为什么仅仅通过 subclassing 就会改变行为?我应该如何继承属性来继承它们的行为?这不是违反了里氏替换原则吗?

好吧,我希望服务器端验证继续工作,但客户端验证停止工作的原因是你必须告诉 ASP.NET 使用哪个适配器来生成客户端验证JavaScript。如果您实际上没有更改 RequiredAttribute 的行为,您可以只使用它的适配器。将以下代码放入您的 Application_Start() 方法中。

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(Test), typeof(RequiredAttributeAdapter));

[更新:正如 Davor 在评论中指出的那样。这是一个错误!回答。把这个留给任何遇到同样情况的人。对不起。 ]

MSDN 中引用的 Required 属性是不可继承的。 https://msdn.microsoft.com/en-us/library/microsoft.build.framework.requiredattribute(v=vs.110).aspx

  [AttributeUsageAttribute(AttributeTargets.Property, AllowMultiple = false, 
 Inherited = false)]

  public sealed class RequiredAttribute : Attribute