2012-02-22 95 views
2

今天讓我的頭轉向MVC,並且貫穿了不將模型直接傳遞到視圖的最佳實踐。相反,使用ViewModel。將IEnumerable <Object>傳遞給ViewModel - 對象是否需要ViewModel?

我研究了AutoMapper並計劃使用它將我的ViewModel映射到相應的模型。我知道AutoMapper足夠聰明,可以將IEnumerable映射到IEnumerable而無需單獨映射,只要映射源和目標即可。

但是我對如何處理將ViewModel中的IEnumerable傳遞給我的視圖有點困惑。我目前有我的頁面使用包含IEnumerable的ViewModel工作,但我讀到這與將IEnumerable直接傳遞給視圖一樣糟糕。那麼,我需要一個單獨的ViewModel來保存將在主ViewModel的IEnumerable屬性中使用的對象嗎?

那麼,活​​動是有問題的型號:

public class ActivityHistoryViewModel 
{ 
    public IEnumerable<Activity> activities { get; set; } 
} 

我需要創建ActivityViewModel和寫我ActivityHistoryViewModel這樣嗎?

public class ActivityHistoryViewModel 
{ 
    public IEnumerable<ActivityViewModel> activities { get; set; } 
} 

有沒有更簡單的方法來做到這一點?

回答

1

是的,這是正確的。假設你的模型將需要的唯一的數據列表,那麼你並不真正需要ActivityHistoryViewModel和視圖可以分型爲這樣的:

@model IEnumerable<ActivityViewModel> 

你的自動映射器的配置是這樣的:

Mapper.CreateMap<Activity, ActivityViewModel>(); 

你會映射這樣的:

IEnumerable<Activity> data = GetActivities(); 
var model = Mapper.Map<IEnumerable<Activity>, IEnumerable<ActivityViewModel>>(data); 
return View(model); 

當你定義ActivityViewModel您可以創建一個財產的屬性重複的類型,或修剪掉多餘的DAT你不需要(在我的情況下,它會像「創建日期」,這是數據庫生成的,對用戶不重要)。

或者,如果你想堅持ActivityHistoryViewModel沿着不僅僅是列表的詳細經過:

視圖類型:

@model ActivityHistoryViewModel 

映射配置可以保持不變

地圖這樣的:

IEnumerable<Activity> data = GetActivities(); 
var model = new ActivityHistoryViewModel() { 
    someOtherProperty = "hello world!", 
    activities = Mapper.Map<IEnumerable<Activity>, IEnumerable<ActivityViewModel>>(data) 
}; 
return View(model); 
+0

Duh,didn'甚至不考慮傳遞IEnumerable 。但我真的想到更大的場景,我需要傳遞更多的數據。 – 2012-02-22 19:52:58

+0

我添加了代碼來代替使用'ActivityHistoryViewModel'。希望它正在尋找什麼。 – 2012-02-22 20:02:04

+0

太棒了,我設法讓一切正常,包括對嵌套實體對象上的屬性的自定義映射。我感謝您的幫助。一旦你想出來,它總是變得容易。 :) – 2012-02-22 20:14:14

相關問題