2011-05-23 37 views
0

我已經爲我的實體創建了用於驗證的元數據對象。驗證工作正常,但我有顯示屬性的麻煩。我想在元數據上顯示屬性以及驗證屬性,併爲標籤和錯誤消息提供正確的文本顯示。在元數據上使用DisplayAttribute時不正確的標籤文本

看起來好像除非我在視圖模型的元數據對象上指定顯示屬性,否則我將得到標籤或錯誤消息的不正確文本。

是否可以在元數據類中定義所有必需的屬性,並將所有內容都提交給視圖?

型號:

[MetadataType(typeof(Metadata))] 
public partial class Contact 
{ 
    class Metadata 
    { 
     [Required] 
     [Display(Name = "FirstName", ResourceType = typeof(MyResources))] 
     public string FirstName { get; set; } 
    }   

    public string FirstName { get; set; } 
} 

視圖模型:

public class ContactViewModel 
{ 
    // Want to be able to omit all attributes from here 
    //[Display(Name = "FirstName", ResourceType = typeof(MyResources))] 
    public string FirstName { get; set; } 
} 
+1

你可以發佈你的元數據和模型/ viewmodel代碼 – 2011-05-23 04:49:25

回答

1

你正在做的事情是錯誤的。視圖模型應該包含表示和驗證屬性。視圖中顯示的是視圖模型,並且由於每個視圖都有不同且特定的視圖模型,因此您應該使用Display屬性,以便根據此特定視圖的要求對其進行適當格式化。

就驗證而言,IMO還應該在視圖模型上執行此操作。爲什麼?因爲您從視圖中收到視圖模型。我們以經典插入/編輯視圖爲例。您將有兩種不同的視圖模型:InsertItemViewModelEditItemViewModel。在編輯視圖模型中,ID屬性將是必需的,因此用Required屬性標記,但不在Insert視圖模型中。同樣代表所有格式驗證屬性,如StringLength,Regex,... =>它們應該位於視圖模型上。

就模型而言,負責操作它的服務層應該照顧ensuring its validity

+0

這是真的。但是,例如在插入和編輯時需要實體上的必填字段。所以我喜歡這樣的想法,即可以在域層設置域約束(因爲它反映了數據庫約束NOT NULL等)。我很樂意將[Display]屬性放在視圖模型中,但看起來我的錯誤信息不會得到正確的文本。 – 2011-05-23 21:26:59

+0

@havok,那麼祝你好運,把視圖特定的東西放在你的模型上。我不想在這裏聽起來很悲觀,但你會需要它。 – 2011-05-23 21:30:15

+0

我仍然在努力理解爲什麼驗證會成爲視圖特定的關注點。這是在數據庫級別確定的,必須傳達給視圖但不是由它決定。每個觀點都需要尊重相同的約束條件,因此讓我們把它們放在域名層面並提出觀點似乎是合乎邏輯的。如果所有的驗證都保留在視圖中,那麼稍後在創建新視圖時很容易就會忘記約束。這也不允許域名項目在解決方案之間重複使用。 – 2011-05-23 21:52:30