2012-02-13 55 views
1

我已閱讀Scott Guthrie的博客 - ASP.NET MVC 3: New @model keyword in RazorASP.NET MVC3,爲什麼我們需要強類型的View?

我沒有意識到的一件事是頁面將以不同方式綁定值,但爲什麼我們必須強制從Model中綁定視圖?

例如,論壇網站的用戶的控制面板,它可以具有用戶信息,後歷史,用戶設置等等

從數據模型的視圖,綁定源可以來自不同的表:用戶,帖子,user_settings等

但是,一個視圖只能引用一個@model指令。

其實,我可以添加什麼屬性模型,我必須使用。 那麼,使視圖變成強類型的優點是什麼?

+0

究竟是什麼問題? – gdoron 2012-02-13 07:20:34

回答

4

然而,一個視圖可以僅引用一個@model指令。

是的,這應該是您的視圖模型。視圖模型是您專門設計以滿足給定視圖要求的類。而這樣做的每個視圖

從數據模型的角度來看,綁定源可以來自不同 表:用戶,文章,user_settings等

大,然後設計一個視圖模型將包含所有必要的屬性,並讓控制器構建這個視圖模型,聚合來自不同位置的信息並將其傳遞給視圖以進行顯示。

您不應將域模型傳遞給您的視圖。因爲視圖通常是一個或多個領域模型的投影=>因此需要定義視圖模型。

+0

我讀過你和Rhapsody的回答,非常感謝你(SOF不要讓我將兩個標記爲答案)。 另外,我搜索關於ViewModel的更多信息,並找到關於MVVM - http:// en的一些有趣信息。 wikipedia.org/wiki/Model_View_ViewModel。 – Cheung 2012-02-13 07:39:24

+3

@SilverNight,MVVM是WPF,Silverlight和WP7中更常用的設計模式。其中視圖模型與域模型進行交互。這種模式不適用於ASP.NET MVC,其中視圖模型不應該知道域模型的任何內容。在ASP.NET MVC中,負責執行不同領域模型和視圖模型之間協調的控制器。在MVVM中沒有控制器。 – 2012-02-13 07:46:04

+0

Phil Haack在* Professional ASP.Net MVC3 *中稱這些'視圖特定模型' - 正是因爲可能與WPF MVVM混淆。它們並不是一回事,儘管它們有着相似的目的。 – 2013-03-08 16:29:28

3

1)可以使用自動scaffolding
2)IntelliSense支持
3)編譯時間類型檢查

1

因此,最好的做法是爲每個視圖創建一個ViewModel。此ViewModel包含視圖所需的所有屬性(用戶,帖子,設置等)。

在控制器/模型可以實例化視圖模型,並填寫其屬性。所以不要向視圖提供單個表/記錄列表,而是提供ViewModel。

的優點是,一切強類型的,還有上運行時錯誤的機會較少。此外,當某些內容發生變化(即數據庫列)時,這些錯誤將直接由IDE檢測到。

2

您的視圖模型應與商業模型分離。

單頁都將有一個單一的視圖模式

例如:

public class UserPost 
{ 
    public string UserName { get; set; } 
    public string Subject { get; set; } 
    public IEnumerable<Message> Messages { get; set; } 
} 

您的用戶名酒店將在用戶表和它的用戶名字段中來。 您的主題可能來自主題表格,而來自另一個主題的訊息。

您的觀點應該只關注提供已經處理的信息,而不是查詢數據源。