DataAnnotation属性伙伴类奇怪 – ASP.NET MVC

鉴于这个POCO类是由EntityFramework T4模板自动生成的(没有也无法以任何方式手动编辑):

public partial class Customer { [Required] [StringLength(20, ErrorMessage = "Customer Number - Please enter no more than 20 characters.")] [DisplayName("Customer Number")] public virtual string CustomerNumber { get;set; } [Required] [StringLength(10, ErrorMessage = "ACNumber - Please enter no more than 10 characters.")] [DisplayName("ACNumber")] public virtual string ACNumber{ get;set; } } 

请注意,“ACNumber”是一个命名错误的数据库字段,因此自动生成器无法生成正确的显示名称和错误消息,该消息应为“帐号”。

所以我们手动创建这个伙伴类来添加无法自动生成的自定义属性:

 [MetadataType(typeof(CustomerAnnotations))] public partial class Customer { } public class CustomerAnnotations { [NumberCode] // This line does not work public virtual string CustomerNumber { get;set; } [StringLength(10, ErrorMessage = "Account Number - Please enter no more than 10 characters.")] [DisplayName("Account Number")] public virtual string ACNumber { get;set; } } 

其中[NumberCode]是一个简单的基于正则表达式的属性,只允许数字和连字符:

 [AttributeUsage(AttributeTargets.Property)] public class NumberCodeAttribute: RegularExpressionAttribute { private const string REGX = @"^[0-9-]+$"; public NumberCodeAttribute() : base(REGX) { } } 

现在,当我加载页面时,DisplayName属性正常工作 – 它显示来自伙伴类的显示名称而不是生成的类。

StringLength属性无法正常工作 – 它显示生成的类的错误消息(“ACNumber”而不是“帐号”)。

但是,伙伴类中的[NumberCode]属性甚至没有应用于AccountNumber属性:

 foreach (ValidationAttribute attrib in prop.Attributes.OfType()) { // This collection correctly contains all the [Required], [StringLength] attributes // BUT does not contain the [NumberCode] attribute ApplyValidation(generator, attrib); } 

为什么prop.Attributes.OfType()集合不包含[NumberCode]属性? NumberCodeinheritance了inheritanceValidationAttribute的RegularExpressionAttribute,因此它应该存在。

如果我手动将[NumberCode]属性移动到自动生成的类,那么它将包含在prop.Attributes.OfType()集合中。

所以我不明白为什么这个特定属性在伙伴类中,当伙伴类中的其他属性起作用时不起作用。 为什么这个属性在自动生成的类中有效,但在伙伴中却没有。 有任何想法吗?

另外,为什么DisplayName会被伙伴覆盖,而StringLength则没有?

我注意到您的NumberCodeAttribute未在AttributeUsage属性中指定AllowMultiple = True。 该参数的默认值(如果未指定)为false。 尝试添加它,它应该出现。

我使用VS2008和MVC2重新创建了你的代码,它对我来说很好。