2012-10-28 25 views
0

我的視圖模型看起來是這樣的:的細節,編輯和列表使用單一的視圖模型

public class CarViewModel { 
    public CarModel Car { get; set; } 
    public List<CarModel> Cars { get; set; } 
} 

CarModel樣子:

public class Car() { 
    public string Make { get; set; } 
    public string Model { get; set; } 
    . . . 
} 

我的目標是隻有一個單一的視圖模型我可以使用我的列表視圖和單個視圖。對於列表視圖,我會補充Cars列表並在視圖內使用它,同時忽略單個Car實體。

有關詳細信息視圖,情況會相反。我的控制器會爲單個Car實體提供水分,視圖會使用它並忽略List。

這是部分工作,但模型綁定很弱。

DRY(不要重複自己)和SOC/SRP(關注點分離/單個責任主體)在這裏似乎有衝突。處理列表視圖和細節視圖的最佳方式是什麼?我有一個感覺,答案是創建重複的視圖模型,但我不想重複代碼,如果我可以幫助它。

回答

2

看來你已經在想這一點了。只要有一個名爲CarViewModel一類,這將是這樣的:

public class CarViewModel() { 
    public string Make { get; set; } 
    public string Model { get; set; } 
    . . . 
} 

爲您詳細內容/編輯/創建視圖,您的看法是CarViewModel類型。對於您的列表視圖,只需將CarViewModel的列表傳遞給視圖即可。在列表視圖IEnumerable<CarViewModel>()上設置模型類型。這將從當前建議的路徑中移除一個班級,並保持單個查看模型負責與汽車相關的所有事情。

編輯

關注的是 - 「如果我的列表視圖模型需要的不僅僅是一個汽車的列表的詳細信息」。在這種情況下,爲列表視圖創建獨立視圖模型是有意義的,因爲它需要附加信息。

public class ListOfCarsViewModel(){ 
    public IEnumerable<CarViewModel> Cars {get;set;} 
    public string SomeOtherProperty {get;set;} 
    public bool SomeFlagProperty {get;set;} 
} 

請注意,我們沒有重複自己,因爲我們仍然將汽車列表傳遞到視圖。但是,由於我們需要的不僅僅是汽車列表,這個視圖模型需要的屬性不僅僅是一個列表。如果您的代碼/視圖需要該信息,那麼擁有多個視圖模型沒有任何問題。

+0

我原來的執行就像你的建議。我唯一擔心的是,除了簡單的對象列表之外,列表視圖最終可能需要額外的信息。 –

+0

然後,您可以爲列表視圖製作第二個視圖模型,將這些模型考慮在內。我將在一個示例中進行編輯 – Tommy

0

你也可以繼承的基礎類有點像這個 你的主要模式是

public class Car() { public string Make { get; set; } public string Model { get; set; } . . . } 和模型類

public class CarViewModel:Car { public List<CarModel> Cars { get; set; } }

相關問題