鑑於已自動通過的EntityFramework T4模板生成此POCO類(還沒有,不能手動以任何方式編輯):DataAnnotation屬性哥們類陌生感 - ASP.NET MVC
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屬性可以正常工作 - 它顯示了buddy類的顯示名稱而不是生成的類。
StringLength屬性無法正常工作 - 它顯示來自生成的類(「ACNumber」而不是「Account Number」)的錯誤消息。
但哥們類[NumberCode]屬性甚至不會應用到賬戶號碼屬性:
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>()
集合中。
所以我不明白爲什麼這個特殊的屬性在Buddy類中的其他屬性不起作用的時候。以及爲什麼這個屬性在自動生成的類中工作,但不在好友中。有任何想法嗎?
此外,爲什麼DisplayName會被夥伴重寫,而StringLength不會呢?
同樣的問題在這裏...任何解決方案? – Alex 2010-06-09 22:10:15
評論!我以爲滾石已經得到了這個問題。我自己還沒有解決。 – 2010-06-10 00:56:00