2010-05-27 55 views
4

鑑於已自動通過的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不會呢?

+2

同樣的問題在這裏...任何解決方案? – Alex 2010-06-09 22:10:15

+0

評論!我以爲滾石已經得到了這個問題。我自己還沒有解決。 – 2010-06-10 00:56:00

回答

1

我用VS2008和MVC2重新創建了你的代碼,它對我來說工作得很好。

+0

你可以在這裏發佈嗎?我使用VS2010和.NET 4順便說一句。 – 2010-06-29 22:33:26

1

我注意到你的NumberCodeAttribute沒有在AttributeUsage屬性中指定AllowMultiple = True。該參數的默認值(如果未指定)爲false。嘗試添加它,它應該出現。

+0

您的回答起初聽起來很有希望,但後來我意識到我只使用[NumberCode]屬性一次,所以問題不能由AllowMultiple = false引起。我確定它是真的,它沒有任何區別。 – 2010-06-29 22:35:00

+0

然而,[DisplayName]可以在夥伴類中被超載,但[StringLength]不能由AllowMultiple = false引起。我剛剛檢查了反射器,[DisplayName]沒有指定AllowMultiple,但[StringLength]表示AllowMultiple = false。也許AllowMultiple的默認值是== true? – 2010-06-29 22:37:32

+0

hmmm ...根據MSDN,AllowMultiple默認爲false。反射器爲你提供了有趣的結果。是否有可能讓EF不將驗證屬性應用於生成的POCO,而只保留好友類和它們的屬性?總的來說,這將是一個更清潔的解決方案。 – 2010-07-01 21:41:43