2013-03-09 117 views
1

不會創建ViewModels導致冗餘?從某種意義上說,我有我的領域模型,我需要在視圖上顯示它的數據。所以我們創建ViewModels,添加DataAnnotations並將其顯示在View上。在這一點上,我有2個對象幾乎相同的數據。MVC視圖模型冗餘

回答

1

正如其他人已經說過的,只有最平凡的應用程序才能將其域模型直接傳遞給視圖。即使如此,由於很多原因,這仍然不是一個好主意。

視圖的需求與數據模型的需求不同。例如,您可能在視圖中需要一個字段,但在您的vie模型中可以爲空。如果您添加了[[必需的]]屬性,那麼您的模型現在將認爲此字段不可爲空。

但是,我從未在視圖中使用域模型的唯一最大原因是爲了安全。 MVC允許你發佈任何值,默認模型聯編程序會很好地插入你發佈到模型中的值,這意味着如果你有一個IsAdmin標誌,並且有人發佈了IsAdmin的真實值,那麼當你保存更改到模型中,有人現在是管理員。

網絡安全的第一條規則永遠不會來自用戶的信任輸入,並將視圖模型直接傳遞給視圖基本上會放棄對數據進行消毒。

+0

謝謝你的迴應。填充ViewModel的最佳實踐是什麼(我知道我們可以使用Automapper)。我想知道是否有裝載視圖模型比弄亂控制器代碼要做到這一點 – itsbpk 2013-03-10 13:03:58

+0

@itsbpk其他更好的方式 - 我傾向於使用AutoMapper,但它真的很容易創建簡單的映射方法爲好。你可以實現這些作爲擴展方法,只是說model.Map(otherModel)。無論哪種方式,它不必混亂你的控制器。 – 2013-03-10 22:12:29

1

是的,這是一種冗餘。但通常需要冗餘來實現其他目標。在模型的情況下,視圖模型和領域模型的這種分離有助於實現視圖和數據存儲之間的分離設置。 ViewModel並不經常是Domain的精確副本。

這意味着,可以改變而不會對其他產生影響。我可以看到這種情況很有價值 - 表中的數據類型更改不需要調用Web應用程序的部署。

因此,總而言之,儘管存在冗餘,但它是系統是否足夠複雜以從冗餘中受益的設計選擇。

0

不,使用ViewModel有它自己的目的。讓我們來思考一下當你的視圖有兩個或更多來自域模型的實體時,如果沒有ViewModel,你將如何組織數據?有時候某個視圖所需的數據與域模型不完全相同,它可能會有更少或更多的信息,有時我們必須在呈現視圖之前預先處理來自域的數據(例如,格式日期時間取決於客戶端的文化)。

此外,ViewModel有助於將Web UI從域圖層中分離出來。領域模型中的實體不僅僅涉及數據表示(這是視圖模型的唯一目的),它們還具有模仿業務規則的操作,您不希望向不需要向過去不需要太多領域知識的UI層知道。

0

在99%的情況下,ViewModel不會導致重定向。

我想到的只有1%是貧血域模型和頁面的簡單應用,它只顯示頁面上的單個模型。這是內容管理頁面特有的。

在任何其他情況下:
1)你的ViewModels將加入從多個域模型的信息
2)你必須特定於域模型的域邏輯
3)它不是混個好主意像您的域中的DataAnnotations這樣的特定於視圖的元信息