鉴于这个由 EntityFramework T4 模板自动生成的 POCO 类(没有也不能以任何方式手动编辑):
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”是一个命名错误的数据库字段,因此自动生成器无法生成正确的显示名称和错误消息,应该是“Account Number”。
所以我们手动创建这个好友类来添加无法自动生成的自定义属性:
[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”而不是“Account Number”)。
但是 buddy 类中的 [NumberCode] 属性甚至没有应用于 AccountNumber 属性:
foreach (ValidationAttribute attrib in prop.Attributes.OfType<ValidationAttribute>())
{
// This collection correctly contains all the [Required], [StringLength] attributes
// BUT does not contain the [NumberCode] attribute
ApplyValidation(generator, attrib);
}
为什么prop.Attributes.OfType<ValidationAttribute>()
集合不包含 [NumberCode] 属性?NumberCode 继承 RegularExpressionAttribute 继承 ValidationAttribute 所以它应该在那里。
如果我手动将 [NumberCode] 属性移动到自动生成的类,那么它会包含在prop.Attributes.OfType<ValidationAttribute>()
集合中。
所以我不明白为什么这个特定的属性在伙伴类中不起作用,而伙伴类中的其他属性起作用。以及为什么此属性在自动生成的类中有效,但在伙伴中无效。有任何想法吗?
另外,当 StringLength 没有时,为什么 DisplayName 会被好友覆盖?