2011-10-20 40 views
2

我正在使用ViewModels與asp.net MVC3。我很好奇的一件事是,假設我有一個名爲Customers的實體,並且它具有添加,編輯,刪除屏幕。假設它們都有不同的屬性要求。什麼方法可以選擇ViewModels?

例如,添加可能有地址欄,但編輯屏幕可能沒有編輯屏幕,刪除可能只會使用客戶名稱。

我的問題是,你如何爲此創建ViewModels?您是否在添加,編輯和刪除之間使用共享ViewModel的方法,即爲您處理所有內容的單個視圖模型類,或者您更喜歡創建視圖模型類/頁面?

與共享視圖模型的優點是它減少了開發時間,我們可以重用類。但是與此有關的一個大問題是,如果您使用的工具如Automapper,您可能會期望針對不同屏幕的結果。

一個viewmodel/page的缺點是它增加了開發時間。我應該走哪條路?

+1

不Automapper只是忽略那些從特定ViewModel缺少或清空的字段? –

+0

如果我的viewmodel具有這些字段而且它們爲空,該怎麼辦?然後,它會將空值分配給我的實體,並且我的數據庫將被填充具有空值的列。 – Jaggu

+0

@Jaggu:爲什麼值爲空?他們是不是由數據庫填充,而不是視圖?您將哪兩個類映射在一起,哪些值可能爲空(在每種情況下)? –

回答

1

我的方法來查看模型是使用共享視圖模型,直到需求(在數據傳輸)到視圖是不同的。這意味着我在使用CreateAddress和EditAddress的情況下使用共享視圖模型,以防所有傳輸到視圖的數據都相同。如果需要在視圖中顯示其他字段,例如在CreateAddress視圖中,我正在重構我的視圖模型併爲CreateAddress和EditAddress使用不同的視圖模型。

例如對於DeleteAddress我會從開始使用不同的視圖模型,因爲我知道在DeleteAddress視圖中顯示的數據幾乎從不與Create/EditAddress中的數據相同。

另一種方法是使用動態視圖模型,因爲視圖模型應該/不應該實現業務邏輯並充當控制器和視圖之間的DTO,這種方法有一些優點(不需要創建邏輯,免去DTO)。

1

這取決於情況。如果您對不同屏幕(驗證,渲染屬性等)有類似要求,則可以在不同視圖之間使用視圖模型。如果有一個或兩個屬性的差異,我仍然會使用相同的viewmodel,並且在不需要這些屬性的情況下,我會將它們放在隱藏的輸入中,以便它們返回時不會出現不需要的結果。衆所周知,隱藏字段可以進行調整,開發人員可以決定使用隱藏字段是否安全。但是,如果我對兩個屏幕有不同的驗證要求,那麼我絕對必須使用viewmodel/page方法。您可以根據需要像他們說的混合這兩種方法「有做事的沒有最好的方法」

1

模型中存在的所有字段都可以更改。它們是否隱藏並不重要。用戶所要做的就是檢查你的頁面,並試圖找出模型中存在的字段。

然後,他可以添加這些字段(例如與Chrome開發工具),以對其進行更改。

擺脫這個問題的最安全的方法是隻讓模型具有允許更改的字段。

也就是說,如果所有用戶都允許更改模型中的所有字段,請繼續並使用相同的模型。(並且根本不顯示不應該修改的字段)

相關問題