2012-06-15 37 views
1

我想更深入地瞭解ViewModels,並且我已經閱讀了許多關於MVC中的ViewModel的文章和博客。在一些文章中說,Model不應該從ViewModel引用,但在其他一些文章中,建議使用model作爲viewmodel的成員。模型作爲ViewModel的成員

讓我們舉一個例子,我必須創建一個基於模型的ViewModel。我可能做到這一點有兩種方式:

public class Car 
{ 
     public int Year {get;set;} 
     public string Make {get;set;} 
     //more properties...... 
} 

public class CarViewModel 
{ 
    public CarViewModel(Car model) 
    { 
    Model = model; 
    } 

    public Car Model { get; set; } 
//additional view model specific properties 
} 

或者2.

public class Car 
{ 
     public int Year {get;set;} 
     public string Make {get;set;} 
     //more Car properties...... 
} 

public class CarViewModel 
{ 
     public int Year {get;set;} 
     public string Make {get;set;} 
     //more Car properties...... 

    //additional view model specific properties 
} 

我只是想知道哪一個是創建一個視圖模型的正確途徑。或者有沒有其他的方式來完成這一切?

回答

2

我會去第二種方法時Car模型是數據持久性說它是由實體框架創建的類。在這種情況下,我不希望這些模型在控制器和視圖中浮動。我將創建一個相當於您所做的視圖模型,並使用像AutoMapper這樣的工具來映射屬性。

在第一種方法中,視圖模型充當包裝。如果您希望在與該模型綁定的視圖中顯示其他信息,則可以使用此選項。假設您必須添加幾個UI字段,並且絕對不應該在Car模型中這樣做,並且您必須創建一個包裝Car模型和其他UI字段的視圖模型。

基本查看模型可以幫助您保持您的業務模型不受用戶界面的影響,並有助於避免數據庫內容在視圖和控制器中浮動的模型。所以你可以根據情景使用兩種方法。

希望這回答你的問題。

+0

謝謝@Mark!我總結爲:如果視圖需要比模型中包含的信息更多的信息,創建一個包裝視圖模型,並且如果視圖需要模型的更少數量的屬性,則創建一個全新的ViewModel類? –

+0

還有一件事是,當你有由Entity Framework,LinqToSql等創建的模型時,你應該創建一個視圖模型。如果沒有使用視圖模型,並且當你直接使用這些類,你將會遇到序列化異常和其他問題,因爲包含延遲加載/循環引用,所以在這些情況下你也應該使用視圖模型。 – VJAI

+0

太棒了!這是有道理的。非常感謝你。 –

相關問題