2010-12-15 40 views
11

我已經習慣於用數據註解屬性來裝飾數據模型類,但是我的純粹主義者在包含純粹的表示屬性(例如顯示格式)時稍微有些茫然。然而,我很高興在這裏保持以驗證爲中心的屬性。我必須繼續在數據模型中保留所有註釋等的一個很好的理由是我的視圖模型聚集了數據模型類,例如,視圖模型中的我的ViewModelBase.DetailItem<TEntity>屬性僅僅是對我的數據模型中的實體類的引用。如果我想將視覺模型的表示註釋移動到視圖模型中,我必須從根本上將我的設計修改爲在我的視圖模型中複製數據模型屬性的設計,並使用對象映射工具基於數據模型對象填充視圖模型對象。數據註釋應該放在模型還是視圖模型上?

我應該在哪裏做我的數據註釋?

只是順便說一句,這是我的草稿ViewModelBase樣子:

public class ViewModelBase<T> 
{ 
    public virtual string PageTitle { get; set; } 
    public virtual string ViewHeading { get; set; } 

    public virtual ViewMode ViewMode { get; set; } 
    public virtual IEnumerable<T> ItemList { get; set; } 
    public virtual T DetailItem { get; set; } 
} 
+0

此外,請查看:http://stackoverflow.com/questions/3338919/mvc-validation-using-data-annotations-model-classes-or-view-model-classes – DarrellNorton 2010-12-15 18:45:59

回答

7

我對DRY委託人和驗證有共同的關注,這就是爲什麼我更願意在模型中保留大多數驗證要求的原因。但爲什麼它必須是一個或另一個?模型驗證屬於模型,但視圖模型中存在某些特定於視圖的驗證。

這就是說,數據註釋就是這樣的:數據的註釋。沒有適當的驗證邏輯。驗證邏輯與數據註釋完全不同(A Required屬性僅僅是驗證的一個方面)。我個人發現很難將真正的驗證放在MVVM實現中,因爲一些驗證需要上下文而不是僅僅需要或不需要。

簡短回答:如果它在你的模型中,那麼它會聚合到你的視圖模型。如果有特定的視圖需求,視圖模型可以根據需要滿足其他需求。

+0

嘿@William,很長一段時間沒有閱讀:-)我喜歡你所說的有關驗證被聚合到視圖模型的說法,但是我在爲聚合類型視圖模型添加額外驗證方面存在一些障礙。我會看看我今晚晚些時候會想出什麼東西。 – ProfK 2010-12-15 18:56:49

+0

也許觀察模型沒有被抽象得離模型足夠遠(或者相反,它們並沒有被抽象得足以接近觀點)來使決策變得容易?我仍然認爲驗證不是特定於觀點。可能涉及上下文(例如,在醫院系統中需要名稱,除了尚無名稱的新生兒),但驗證邏輯和推理很少適用於特定視圖。 – WilliamB 2010-12-15 19:24:01

+0

我在想這是誰投票給你的。如果你問我,真的不需要。 – ProfK 2010-12-15 19:52:17

11

驗證應至少在視圖模型,因爲這是你的看法取得什麼執行。此外,驗證始終在給定視圖的上下文中執行。因此,您可以將兩個不同的視圖模型對應於兩個不同的視圖,但映射到單個模型類,並且由於驗證可能因視圖而異,因此應在視圖模型上執行此驗證。如果您對模型執行了驗證,那麼您將很難區分這兩種情況,因爲您可能會遇到第一個視圖需要屬性但第二個視圖不需要的情況。因此,如果您使用數據註釋來執行驗證,那麼您應該使用它們來修飾您的視圖模型。

+0

有關兩種不同驗證的好處,但它似乎認爲模型更像是一個DTO而不是具有業務邏輯的完整領域模型,以滿足不同的用例,其中每個用例都將被不同的視圖和視圖模型所照顧。 – ProfK 2010-12-15 18:24:10

相關問題