ViewModel是MVVM(Model-View-ViewModel)和推薦的ASP.NET MVC實現中使用的術語。考慮到每個模式使用相同的術語,研究「ViewModel」會令人困惑。MVVM ViewModel與MVC ViewModel
MVC ViewModel和MVVM ViewModel之間的主要區別是什麼?例如,我相信MVVM ViewModel更加豐富,因爲缺少一個Controller。這是真的?
ViewModel是MVVM(Model-View-ViewModel)和推薦的ASP.NET MVC實現中使用的術語。考慮到每個模式使用相同的術語,研究「ViewModel」會令人困惑。MVVM ViewModel與MVC ViewModel
MVC ViewModel和MVVM ViewModel之間的主要區別是什麼?例如,我相信MVVM ViewModel更加豐富,因爲缺少一個Controller。這是真的?
一個相當具有挑戰性的問題來簡潔地回答,但我會嘗試。 (請記住,這些問題的答案仍然是開發人員之間爭論的主題。)
在MVC中,ViewModel提供了View所需的所有信息。它包含的數據是使用模型中定義的數據創建的。視圖讀取ViewModel並呈現輸出。來自視圖的輸入被傳遞給控制器,該控制器操縱模型,構建適當的視圖模型,並將其傳遞給視圖以進行渲染。
在MVVM中,ViewModel的功能與它在MVC中的功能相同,但它也通過提供允許View來操作模型的命令來替換部分MVC控制器。 WPF數據綁定根據ViewModel中的更改管理View的更新(並且這有效地替代了MVC控制器的其餘功能)。
這已經有一段時間,因爲我打的UI設計模式賓果。但是讓我來刺在這個..
MVVM是隻是一些MS想出了...因爲它可以幫助你得到最出WPF。您將視圖的狀態和行爲組合成一個易於測試的類(演示模型),然後使用數據綁定將數據獲取到任何視圖中。
這個link簡要介紹了MVVM的發展。將這與福勒的「GUI Architectures」系列相結合,你應該在路上。
更新:不知道有什麼叫MVC-VM。顯然是ASP.NET MVC人羣的心血結晶。外觀和聽起來與MVVM類似(除ASP.NET MVC以外);唯一的區別是它放置了VM和View之間存在1:1映射的限制。我已經猜到了1:N,但其他一切都匹配。
我知道這是一個(方式)老問題,但我已經指出它作爲在MVC上下文中使用「視圖模型」的一個例子。我認爲這是不正確的,並且會導致新手或/和/兩種模式的人混淆。無論誰在做 - stahp。這就是爲什麼(甚至是以迂迴方式回答原始問題)。
發生這種情況的一個例子可以在this question中看到。用戶試圖使用在ASP.NET MVC應用程序中實現INotifyPropertyChanged的View Model,從而將桌面和無狀態Web應用程序設計混合在一起,造成架構失敗和心碎。
簡而言之,MVC模式中沒有「視圖模型」。有是,但是,功能相當,這就是控制器。只是要明確各部件及其效果影響不大,
MVVM(桌面應用程序):
MVC(Web應用程序):
示範實際上是在這兩個模式是相同的。桌面模型可以實現更新事件通知,Web模型可以是動態的(即,不是強類型的),並且都可以包含或不包含驗證方法或元數據。
在桌面的View是用戶看到的內容。在網絡中,它是一個輸出HTML的瀏覽器在客戶端顯示的生成器。它必須解釋在桌面上的用戶交互,而是通過客戶端的JavaScript,瀏覽器,並且被髮送回服務器的請求來處理在網絡上。
視圖模型/控制器在功能上大致相同,但在實現方式和操作方式方面差異很大。 在視圖模型,與所述應用程序的用戶交互被轉移到視圖模型經由個ICommand,路由事件,以及其他方法(許多MVVM框架提供不同的方式來查看鉤模型到UI和應用程序的其他部分)。 在控制器,請求進來與控制器所需的所有信息,將結果返回給用戶(假設它是一個200 OK請求)。控制器必須執行任何必要的工作來創建HTML生成器(視圖)所需的狀態(又稱模型)以創建響應。在設計方面,控制器坐在視圖和模型瞭解和控制兩個以上,而視圖模型坐在旁邊的視圖,通過它們之間的模型(和其它信息)。
真正讓人困惑的是有客戶端MVVM框架,您可以混合到您的MVC應用程序。這些僅在用戶的瀏覽器中以javascript存在,並且與您在服務器端遵循的任何特定模式無關。您可以運行一個經典的ASP網站,在客戶端使用MVVM。地獄,你可以在客戶端運行使用MVVM的靜態HTML頁面。他們是分開的。
這些JavaScript MVVM框架通常遵循與上述桌面MVVM模式類似的模式,但被調整爲更適合HTML DOM和JavaScript的本質。例如,DOM中沒有廣泛的綁定系統,而且javascript的類型系統非常有限,因此將模板與模型進行匹配與在WPF中完全不同。它們通常也與服務器斷開連接,當它們需要交互時,更喜歡AJAX調用,而不是將頁面返回給Controller(AJAX調用通常由ASP.NET MVC中的WebAPI控制器處理)。總而言之,MVC中確實沒有View Model。控制器是粗略的等價物,但它在接收用戶輸入,解釋它並將結果返回給用戶的方式上有很大不同。使用術語「視圖模型」來引用MVC中的任何內容只會導致混淆,因此應該避免。爲模式的正確部分使用適當的術語。這看起來可能很迂腐,但它應該有助於保持清晰,並且不會讓那些對這兩種模式都陌生的人感到困惑。
對不起,但我相信這是不正確的,並且造成VM和MVC充滿混淆。 Adams在上面的回答在一行中是正確的:「在MVC中,ViewModel提供了View所需的所有信息。」 IOW,控制器中不存在VM的任何部分。控制器不等同於虛擬機。 VM是一個定義良好的單個對象,具有呈現視圖所需的所有屬性。我解釋瞭如何在這裏構建它們:http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc/29135747#29135747 – Sam
@Sam因此,控制器,像ViewModel,不解釋用戶操作,將它們翻譯成業務邏輯,然後將這些操作的結果返回到視圖來呈現? – Will
絕對不是!控制器的工作是將視圖返回給請求。而不是一件事。控制器通常很小(谷歌「瘦身控制器」)。虛擬機的工作完全不同,與控制器無關。虛擬機的工作是將對象和服務組裝成單個對象,然後將其呈現給呈現引擎,以便創建視圖。 VM包含與用戶交互的邏輯(動畫,着色,隱藏/顯示等),並根據需要調用業務服務。 – Sam
在實踐中; ASP.NET MVC中的ViewModel在View中不允許使用「Magic Strings」;併爲視圖提供強類型模型(包括Intellisense和所有爵士樂)。否則,很好的答案。 –
很好的答案。 @George:雖然你仍然可以在MVC中使用Magic Strings,但這不是MVC的關注......它不會阻止這種做法。 –