当前位置: 首页 > 编程语言 > C#

DataAnnotation属性伙伴类很奇怪-ASP.NETMVC分享

时间:2023-04-11 10:57:47 C#

DataAnnotation属性伙伴类很奇怪-ASP.NETMVC鉴于这个POCO类是由EntityFrameworkT4模板自动生成的(没有也不能手动编辑以任何方式):publicpartialclassCustomer{[Required][StringLength(20,ErrorMessage="CustomerNumber-Pleaseenternomorethan20characters.")][DisplayName("CustomerNumber")]publicvirtualstringCustomerNumber{get;放;}[Required][StringLength(10,ErrorMessage="ACNumber-请输入不超过10个字符。")][DisplayName("ACNumber")]publicvirtualstringACNumber{get;set;请注意,“ACNumber”是一个错误命名的数据库字段,因此自动生成器无法生成正确的显示名称和错误消息,这应该是“帐号”。所以我们手动创建这个伴随类来添加不能自动生成的自定义属性:[MetadataType(typeof(CustomerAnnotations))]publicpartialclassCustomer{}publicclassCustomerAnnotations{[NumberCode]//这行不起作用publicvirtualstringCustomerNumber{得到;设置;}[StringLength(10,ErrorMessage="AccountNumber-请输入不超过10个字符。")][DisplayName("AccountNumber")]publicvirtualstringACNumber{get;set;其中[NumberCode]是一个简单的基于正则表达式的属性,只允许使用数字和连字符:[AttributeUsage(AttributeTargets.Property)]publicclassNumberCodeAttribute:RegularExpressionAttribute{privateconststringREGX=@"^[0-9-]+$";publicNumberCodeAttribute():base(REGX){}}现在,当我加载页面时,DisplayName属性正常工作-它显示来自合作伙伴类而不是生成类的显示名称。StringLength属性无法正常工作-它显示生成类的错误消息(“ACNumber”而不是“Account”)。但是,合作伙伴类中的[NumberCode]属性甚至没有应用于AccountNumber属性:foreach(ValidationAttributeattributeinprop.Attributes.OfType()){//Thiscollectioncorrectlycontainsallthe[Required],[StringLength]attributes//但不包含[NumberCode]属性ApplyValidation(generator,attrib);为什么prop.Attributes.OfType()集合不包含[NumberCode]属性?NumberCode从inheritanceValidationAttribute继承了RegularExpressionAttribute,所以它应该在那里。如果我手动将[NumberCode]属性移动到自动生成的类,那么它将包含在prop.Attributes.OfType()集合中。所以我不明白为什么这个特定的属性在伙伴类中,而当伙伴类中的其他属性起作用时却不起作用。为什么这个属性在自动生成的类中起作用,而在好友中却不起作用。有任何想法吗?另外,为什么DisplayName会被伙伴覆盖,而StringLength不会?我注意到您的NumberCodeAttribute没有在AttributeUsage属性中指定AllowMultiple=True。此参数的默认值(如果未指定)为false。尝试添加它,它应该会出现。我使用VS2008和MVC2重新创建了您的代码,它对我来说工作正常。以上就是C#学习教程:DataAnnotation属性伙伴类的奇葩-ASP.NETMVC分享的全部内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注-本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: