2012-06-26 52 views
9

我一直在研究asp.net MVC項目結構的一個新項目,並有一個問題讓我感到困惑。模型和視圖模型有什麼區別?我在說視圖模型包含表單屬性中的模型時是否正確?模型和視圖模型之間的差異

+0

你可能已經google了。 SO本身有很多問題註冊。這個主題。 – VJAI

+1

This SO Question- http://stackoverflow.com/questions/4061440/asp-net-mvc-model-vs-viewmodel,完美地回答了這個問題。 – Bibhu

回答

28

我有一個博客,我想顯示在一個視圖中的最新的帖子最新評論日誌分類名單。我該怎麼做?我可以強烈地將我的觀點輸入到任何一個模型中?有查看模型

我創建了一個名爲BlogViewModel的視圖模型,其中包含最新的帖子,最新的評論和其他東西作爲屬性,我綁定我的視圖與這個模型。 posts,comments ..都是域模型BlogViewModel查看模型我專門爲視圖創建的。

明天我會在移動版本中顯示我的博客,那時我可能會創建一個只包含較少屬性的簡單視圖模型。最後,視圖模型是用於視圖和大部分時間,它們充當真實域模型的包裝器!

4

ViewModel是從調整到特定視圖的業務域圖層中的模型的版本。

它只有與視圖相關的屬性,不應該有方法(除了簡單的像ToString())。

ViewModel只是一個「數據容器」。

2

模型僅僅是應用程序中對象的表示形式。但是,您應該瞭解幾種不同類型的模型。

  1. 域模型:如果您使用的是ORM(Linq2SQL,EF),則表示應用程序中的域對象,如SQL表。

  2. 查看模型:這表示您希望最終用戶查看/編輯/等的對象。視圖模型可以包含來自多個域模型或不包含域模型的屬性,並且通常會排除最終用戶不應該使用的屬性。視圖模型應只包含爲特定請求顯示適當數據給最終用戶所需的元素。

Here is some Jimmy Bogard爲您查看模型及其使用。

22

模型通常與數據存儲(數據庫,服務等)的關係更密切,模型與這些模型非常相似。

另一方面,ViewModel與您的數據呈現給用戶的方式密切相關。它通常是您的模型的扁平版本,非規範化等等。它可以是多個模型的聚合。

對於典型的Person的對象,你的模型可能包含的屬性如下所示:

  • 名字
  • 出生日期

然而,在您的視圖模型,你可以選擇代表它不同,並有更多像:

  • 全名
  • 年齡
+1

我會補充說一個Model對象應該代表對象的語義/概念結構,它的內在/自然屬性和行爲,而不是它實際存儲的方式。存儲受制於實現細節,這不是實際的對象特性。 – heltonbiker

+1

@heltonbiker,這是一個偉大的觀點。我認爲有許多模型,ViewModel,業務邏輯模型,數據存儲模型等等。我們經常掙扎,因爲我們不接受每個人的差異,而是關注他們的相似之處。我很快就可以寫一篇博客文章;) –

+1

在我看來,模型是最重要的開發活動中最被忽視的部分(至少在我知道的大多數地方......) – heltonbiker