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

C# 为什么继承的数据注释停止工作?,c#,asp.net-mvc-5,data-annotations,C#,Asp.net Mvc 5,Data Annotations,如果有人遗漏了标记:我正在使用.NETMVC5开发一个web应用程序,并使用数据注释进行验证(客户端和服务器端) 我想定制内置注释(Required、StringLentgth、Range等),以更好地满足我的需要。我首先创建了自己的类,该类继承了RequiredAttribute,没有添加任何内容,并将viewmodel上的Required替换为Test。我运行它,期望它能像以前一样100%工作,但令我惊讶的是,验证完全停止了对上述领域的工作。在HTML中,先前存在的数据val require

如果有人遗漏了标记:我正在使用.NETMVC5开发一个web应用程序,并使用数据注释进行验证(客户端和服务器端)

我想定制内置注释(Required、StringLentgth、Range等),以更好地满足我的需要。我首先创建了自己的类,该类继承了
RequiredAttribute
,没有添加任何内容,并将viewmodel上的
Required
替换为
Test
。我运行它,期望它能像以前一样100%工作,但令我惊讶的是,验证完全停止了对上述领域的工作。在HTML中,先前存在的
数据val required=“…”
不再显示

我的新属性(我尝试过使用或不使用用法规范,结果相同):

viewmodel中带注释的特性:

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

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

那么,这是如何工作的呢?为什么仅仅通过子类化就可以改变行为?我应该如何继承属性以继承其行为?这不是违反了Liskov替换原则吗?

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


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


[更新:正如Davor在评论中指出的。这是一个错误的答案!!请将此留给遇到相同问题的任何人。对不起。]

MSDN中引用为不可继承属性的必需属性。

[AttributeUsageAttribute(AttributeTargets.Property,AllowMultiple=false,
继承的(错误)]

公共密封类RequiredAttribute:Attribute
[更新:正如Davor在评论中指出的那样。这是一个错误的答案!!请将此留给遇到相同问题的任何人。对不起。]

MSDN中引用为不可继承属性的必需属性。

[AttributeUsageAttribute(AttributeTargets.Property,AllowMultiple=false,
继承的(错误)]

公共密封类RequiredAttribute:Attribute
您的命名空间/类错误,是这样的:当我在VS中打开RequiredAttribute时,这在定义中:
[SuppressMessage(“Microsoft.Performance”,“CA1813:AvoidUnsealedAttributes”,justify=“我们希望用户能够扩展此类”)
。因此,他们明确希望我们能够继承它。您的命名空间/类搞错了,是这样的:当我在VS中打开RequiredAttribute时,这在定义中:
[SuppressMessage(“Microsoft.Performance”,“CA1813:AvoidUnsealedAttributes”,justify=“我们希望用户能够扩展此类”)
。所以他们明确地希望我们能够继承它。这似乎是最好的方式。我想你也可以对其他内置属性做同样的处理?是的,如果你需要覆盖客户端验证,因为你正在更改验证逻辑,那么也有一种方法可以做到。是的,我已经在客户端有很多自定义属性,我只想用本地化消息编写我自己的“必需”属性。我刚刚将资源文件的设置添加到新属性的构造函数中,该属性继承自
RequiredAttribute
,它工作起来很有魅力。谢谢:这似乎是最好的办法。我想你也可以对其他内置属性做同样的处理?是的,如果你需要覆盖客户端验证,因为你正在更改验证逻辑,那么也有一种方法可以做到。是的,我已经在客户端有很多自定义属性,我只想用本地化消息编写我自己的“必需”属性。我刚刚将资源文件的设置添加到新属性的构造函数中,该属性继承自
RequiredAttribute
,它工作起来很有魅力。谢谢:D
// Before, works.
[Required]
public int WorkerId { get; set; }

// After, doesn't work.
[Test]
public int WorkerId { get; set; }
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(Test), typeof(RequiredAttributeAdapter));