2011-06-29 188 views
0

我目前正在使用EF4和asp.net mvc 3,並且當你將這些技術結合在一起時,我肯定會遇到一些麻煩,可以通過不同類型的模型進行工作。EF4模型和MVC模型和視圖模型...建模或不模型?

我有一個數據庫,我已經定義,並通過EF4我有我的數據庫的模型。但也有傳遞給我的觀點的模型和視圖模型呢?

可以說我有一個項目的mvc模型。該項目具有描述,名稱和類別屬性。我有一個視圖頁面來創建一個項目並將其返回給控制器,通過ef4插入到數據庫中。所以我最初創建了一個具有這些確切屬性的類作爲我的模型。然而,我的頁面在創建該項目時還需要一個類別列表,因此我添加了一個字符串數組到我的模型中,該數組作爲我的項目模型的一部分與其他屬性一起傳遞到頁面,並且工作正常。一切都很好......但我不得不想...因爲如果項目模型模擬一個項目,那麼它不應該有一個完整的類別列表。它應該只有屬於該項目的一部分。

但這個完整的分類列表在哪裏去。在視圖包裏?這對我來說似乎不正確?我應該創建視圖模型嗎?這個視圖模型看起來如何?如何添加一個方法到項目模型,這將沿着GetCategories()的方向,然後我可以從視圖頁面調用這個方法......但是這是否打破了mvc中理想的關注點分離?

我相信很多人對這個主題會有不同的看法,但是任何能夠幫助我解決這個問題的評論都會有所幫助。

感謝,

回答

0

在所有你最好不通過模型對象提出的意見,但最簡單的應用程序。 View應該有一個ViewModel,它由Controller使用來自Model對象的數據構建,幷包含View需要顯示其信息的所有內容。

ViewModels將您的表示層與業務層分離,並且您的示例演示了爲什麼這很重要;您的視圖需要關於Project的信息,而且還需要Project可能屬於的所有Categories的完整列表 - 這樣的列表在邏輯上不適合Project域模型對象,但完全符合ProjectViewModel的邏輯。

+0

謝謝史蒂夫,這當然有很大的意義...你會讓類別列表視圖模型的功能,並從視圖運行?或者將在控制器中執行該操作? –

+0

我會有一個'SelectList Categories {get;組; }'ProjectViewModel'上的屬性,並將其填充到Controller中。控制器會有一個[Repository](http://martinfowler.com/eaaCatalog/repository.html)對象(或[ServiceLayer](http://martinfowler.com/eaaCatalog/serviceLayer.html)對象,具體取決於大小通過它的構造函數注入到它中,並從中獲取可用類的集合。 –