2010-01-29 58 views
6

分配ViewModel字段時,域對象是否應直接傳遞給ViewModel對象,然後決定如何呈現數據,或者像服務這樣的其他類是否將數據從模型分配給ViewModel?ViewModel有自己的邏輯嗎?

也:

編輯:有沒有在分割視圖模型爲接收和贈送任何意義? (而不是隻綁定更新上的某些領域?)

+1

將ViewModel視爲DTO:http://en.wikipedia.org/wiki/Data_transfer_object – ali62b 2010-01-29 06:42:04

回答

5

通常,控制器操作採用業務對象並放置視圖模型所需的任何東西。

如果您的業務對象包含字段名稱,地址,標識和視圖應該只顯示名稱,那麼ViewModel只有一個字段「名稱」,並且控制器操作會填充它。 ViewModel應該對你的業務類一無所知,它應該只知道它需要顯示的東西。

然後,主要/唯一的邏輯是「顯示邏輯」,就像「如果TotalAmount爲負值,用CSS類negativeNumber顯示它」。

+0

將ViewModel劃分爲接收者和演示者有什麼意義嗎? – zsharp 2010-01-29 02:56:34

+0

我已經接近沒有MVP類型模式的經驗,但我沒有看到太多需要。當Controller Action創建ViewModel時,「Receiver」部分應該只包含一些燈光驗證,並且大部分Presenter邏輯都是實際的View Page(如果使用默認的WebForms View Engine,則爲YourView.aspx)。如果您在ViewModel類中執行繁重的條件邏輯,也許應該將它解壓縮到單獨的類中(如果由多個ViewModel共享)。真的,取決於情況,但通常ViewModel是非常輕量級的。 – 2010-01-29 03:07:26

+1

如果邏輯在視圖中顯示性別,那麼呢?假設你將M和F保存在數據庫中,並且當顯示在視圖中時,邏輯'if gender.Equals(「M」)返回「Male」;其他「女性」應該放在ViewModels,Repository中或者當它映射到ViewModels時? – Willy 2016-09-05 04:21:58

3

根據我的經驗,我用服務將模型映射到ViewModel。我不把邏輯放在我的ViewModels中。

順便說一下,您可能需要花一些時間檢查AutoMapper以幫助您進行映射。絕對有助於減少編寫重複映射邏輯。

4

爲了SoC的緣故,如果該邏輯與View相關,他們可以安全地在ViewModel中,甚至在View中本身,但如果它們與Business或Program相關,則分別將它們放在Model和Controller上。

+1

+1,而ViewModels通常可能是POCO,在需要的地方向它們添加視圖邏輯,而不是在控制器中執行它,使事情保持乾爽。 – 2013-09-20 19:44:12

相關問題