2010-10-31 117 views
69

好的,我一直聽到關於MS的ASP.NET MVC的「ViewModels」的討論。ASP.NET MVC模型vs ViewModel

現在,這是打算成爲一種特定類型的模型,是否正確?不是特定類型的視圖。

據我瞭解,這是一種模型,具有與視圖交互的特定目的?或類似的東西?

一些澄清將不勝感激。

回答

54

基本上模型和視圖模型都是具有屬性的簡單類。

這些類的主要目標是爲它們各自的受衆(分別爲控制器和視圖)描述(以「模型」)對象。

所以你時,你說

我的理解是完全正確的,它是一種 模型具有的 特定目的與景觀互動

所以,當模型類實際上是您的應用程序與之交互的域實體,View Models是您的視圖與之交互的簡單類。

希望它能幫助:)

更新

微軟已經通過馬丁公司研製呈現圖案的專用版本福勒主要是基於模型 - 視圖 - 控制器,並把它稱爲模型 - 視圖 - 用於PF應用程序的ViewModel(MVVM)。該模式針對的是現代UI開發平臺,其中UI開發人員比傳統開發人員具有更多基於業務邏輯的不同需求。有一點理論的外觀here

+1

好的,謝謝,也感謝您的更新,這非常有幫助!因此,如果沒有考慮到MS的特殊版本,以及MVC 2的股票,你是否將ViewModels放置在一個特殊的指定文件夾中?或者它們本質上就像其他任何一個一樣直接進入Models文件夾。或者,你可以做嗎? – Qcom 2010-10-31 01:47:45

+0

不客氣。通常我會將模型和視圖模型放置在同一個文件夾中,因爲我想將它們組合在一起以尊重它們引用的域,但這只是我的選擇,我相信還有更好的方法 – Lorenzo 2010-10-31 01:51:20

+5

ViewModel應該將View和(Domain)Model分開。所以將ViewModel放在View附近而不是Model附近是有意義的。 – 2011-08-29 14:28:24

16

維基百科模型與模型視圖更爲完整的描述比你在得到如此回答:http://en.wikipedia.org/wiki/Model_View_ViewModel

我引述:

型號:如在經典的MVC模式中那樣,模型是指(a)代表真實狀態內容的對象模型(面向對象的方法),或者(b)代表內容的數據訪問層(以數據爲中心的方法)。

查看:與傳統的MVC模式一樣,視圖引用GUI顯示的所有元素,例如按鈕,窗口,圖形和其他控件。

視圖模型:視圖模型是一個「視圖的模型」,這意味着它是一個也用作在數據中的視圖和模型之間的結合視圖的抽象。它可以被看作是一個控制器(在MVC模式中)的一個特殊方面,它充當一個數據綁定器/轉換器,將模型信息更改爲視圖信息並將視圖中的命令傳遞到模型中。 ViewModel公開了屬性,命令和抽象。 ViewModel已經被比作數據的概念狀態,而不是模型中數據的實際狀態。

+3

雖然有關於Model和ViewModel的描述,但該鏈接僅描述了MVVM架構模式。不是模型和視圖模型之間的區別 – Lorenzo 2010-10-31 01:52:35

+1

我比被接受的答案有更好的描述差異:) – 2010-10-31 03:33:00

+0

我同意 - 這和Jason Marsell的答案都能更好地捕捉到「vs.」這個問題的一部分。 – 2015-04-01 17:54:58

5

有一個ViewModel的概念,但它通常不與Asp.net MVC關聯。 MVC使用模型視圖控制器模式,控制器處理交互,根據模型構建數據,然後將該數據傳遞給視圖進行顯示。

ViewModels(和Model View ViewModel模式)通常與Silverlight和WPF相關聯。 Xaml有點不同,因爲視圖可以對ViewModels進行雙向綁定,所以技術有點不同。例如,如果您將文本框綁定到字段,那麼在您鍵入該文本框時,該字段的值會動態更新。由於網頁是無狀態的,因此這種交互在網頁中是不可能的。

兩種模式的相似之處在於它們都試圖將邏輯從顯示中分離出來。最常見的用途/原因是測試:您希望能夠通過代碼(通過測試框架)執行用戶通過用戶界面調用的所有交互。

+0

+1用於描述我忘記提及的兩種模式之間的相似性 – Lorenzo 2010-10-31 01:56:49

+0

在第1章介紹的「Professional ASP MVC 2」中,我介紹ViewModel作爲保持表示/模型交互的強類型和DRY 。微軟作者包括Scott Hansleman,Phil Haack,Scott Guthrie。 – Berryl 2010-10-31 03:33:07

+0

最近我見過很多,ViewModel被用在Asp.net MVC中。看起來ViewModel在視圖中比在Domain Model中有更多的業務。所以我們一直使用的模式是讓域模型組裝ViewModel的主要部分。目前,我們使用修改的命令模式(操作)與域模型一起執行其任務。結果彙編到ViewModel中併發送到視圖。在這種情況下,視圖模型包含所有支持該視圖的註釋和簡單而有針對性的邏輯。 – Sinaesthetic 2013-07-31 06:32:16

24

我發現這篇文章是一個非常有用的資源,用於理解「域模型」和「視圖模型」如何在MVC應用程序內進行交互,特別是在綁定方面。最重要的是包括例子而不是抽象的描述。

「自MVC發佈以來,我觀察到關於如何最好地構建視圖模型的困惑很多,有時候這種混淆不是沒有理由,因爲似乎沒有大量關於最佳實踐建議的信息。此外,還沒有一個「萬能的解決方案」作爲銀彈,在這篇文章中,我將介紹一些已經出現的主要模式以及每種模式的優缺點,重要的是要注意許多這些模式已經從解決現實世界問題的人身上涌現出來。「

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

+1

非常好的鏈接文章。我發現的教程沒有解決這個問題,這正是我正在尋找 – Tasio 2012-05-01 07:54:03

+0

@misteraidan - 偉大的文章,非常豐富,感謝分享。 +1 :) – Bibhu 2012-11-14 07:47:55

+1

優秀的文章。 – 2013-03-21 12:22:10

49

簡單的說,我喜歡把以下內容:

型號:嚴格的外觀和感覺就像你的數據模型。對於所有意圖和目的,它只是數據模型的類表示。它不瞭解您的視圖或視圖中的任何元素。也就是說,它不應該包含任何將用於View的屬性裝飾器(即;必需的,長度等)。

查看模型:作爲您的視圖和您的模型之間的數據綁定器,在很多情況下,也是您的模型的包裝。如果沒有View,它將變得沒有用處,所以它通常不能在多個視圖和控制器(如標準Model)中重用。

舉個例子,你的模型可能具有以下特性,這是您的數據源的直接表示:現在

public string FirstName { get; set; } 
    public string LastName { get; set; } 

,因爲您的視圖模型綁定到你的視圖,它可能具有以下屬性 - 它將Model的FirstName字段和LastName字段連接在一起作爲一個字符串:

[Display(Name = "Customer Name")]     
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }} 
+1

你能提供一個更完整的ViewModel的例子嗎?它如何知道myModel是什麼以及它如何獲取myModel的數據? – 2015-07-15 13:41:04

+3

本質上,ViewModel是一個普通的C#對象(PO​​CO),永遠不會真正知道您的數據模型是什麼樣子。它更像是您的數據模型和視圖需要顯示的特定元素的混合體。至於它如何獲得數據,你必須加載數據。我喜歡使用單獨的中介類,在那裏我將數據調用到服務中,然後手動將該數據加載到ViewModel中。然後,我將完全加載的ViewModel返回到控制器操作。 – 2015-07-15 16:42:28

+2

真棒解釋!謝謝你,先生! – Unbreakable 2016-10-26 04:39:52