为什么继承的数据注释停止工作?
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
如果有人遗漏了标签:我正在使用 .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