2010-11-24 73 views
2

我們將所有DataAnnotations放在我們的Model類Customer上。然後,我們將Customer的一個實例作爲相關ViewModel的一個屬性以及一些針對Countries的查找列表,並在View中顯示。迄今爲止都是很好的。將DataAnnotation屬性應用於Model Model中的ViewModel

然後,我們閱讀SO和其他消息來源,我們不應該將我們的整個Customer模型對象傳遞給View,原因是僅僅爲View提供最低限度的需求,更重要的是(爲了我們) ModelBinding可能存在的惡意回發可能會導致問題,這些回發會添加其他信息來更改我們的模型屬性,否則這些屬性在視圖中不可用。

我們如何從模型對象中獲取所有這些DataAnnotation屬性,並將可能減少的ViewModel屬性放在懸崖上而不會將DRY原理拋出?

此外,我們是否認爲我們不應該使用TryUpdateModel來對付我們從數據庫中提取的實體?我想我們的選擇是使用TryUpdateModel並傳遞一個排除列表的屬性,這對我來說看起來並不是那麼優雅,因爲列表只是一個字符串類型的參數。或者,也許我們應該廢除TryUpdateModel並使用類型更安全的AutoMapper之類的工具?

感謝您對這些問題的任何想法。

回答

1

我們如何將所有這些DataAnnotation屬性從模型對象中移除並放到可能減少的ViewModel屬性上,而不會將DRY原理扔到懸崖上?

你不行。這是付出的代價,但我認爲它相當便宜,因爲事實上,在這個精簡版本中,驗證屬性可能不同,並且根據視圖的要求,您可能具有不同的驗證屬性。我們舉一個例子:NewEdit視圖。在Edit視圖中,將需要實體的Id,而在New視圖中不需要,因爲它將由數據存儲分配(實際上在您的新模型中可能甚至沒有Id屬性)。

此外,通常我只將驗證屬性放在視圖模型上,但這可能不是最好的方法,就好像您希望在不同的應用程序中重複使用模型一樣,不會有任何驗證邏輯。

此外,我們是否認爲我們不應該使用TryUpdateModel來對付我們從數據庫中拉出的實體?

我個人從未使用TryUpdateModel。我更喜歡將視圖模型作爲控制器操作參數傳遞,並讓默認模型聯編程序執行該作業。在這種情況下,您當然不需要任何包含或排除屬性列表,因爲此視圖模型完全適合於給定的視圖。

就AutoMapper而言,它是必須的工具,用於在模型類(出現在存儲庫方法簽名中)和傳遞到視圖中的視圖模型之間進行轉換。

0

我發現僅在ViewModel上放置驗證屬性並保持模型對象不變是最好的方法。

視圖模型進行了驗證,當用戶帖子的任何數據,如果數據是有效的,業務層需要與用戶發送的數據的數據庫中創建對象模型的照顧。

在服務/業務層類,更新或添加的函數只接受對象模型(字符串,整數等)的必要值,但不會接受整個對象。服務類負責創建對象。

通過將驗證放置在視圖模型上,確保傳遞到業務邏輯層的任何和所有數據都是有效的,並且您可以安全地提交更改。