2014-04-01 122 views
1

我有一個包含的ViewModels的IList中視圖模型:Automapper - 映射嵌套的ViewModels一個視圖模型

public class MyCustomViewModel 
    { 
     public IList<ItemViewModel> Items { set; get; } 
     public IList<PersonViewModel> Persons { set; get; } 

     public MyCustomViewModel() 
     { 

     } 
    } 

在我的控制器的Index操作方法,我無法弄清楚如何正確地映射這種嵌套的ViewModels的。

Normaly我會做這樣的事情:

IList<Item> items= db.Items.ToList(); 
var viewModel = Mapper.Map<IList<ItemViewModel>>(item); 

如何將包含幾個其他的ViewModels一個視圖模型的工作?我一直試圖單獨創建每個viewmodel的新實例,但我沒有看到如何將它們映射到我的自定義viewmodels。

我不能將viewmodels映射到其他viewmodels,可以嗎?

+0

如果您的viewmodels是相同的,它應該沒有問題,如果不是你必須手動定義映射。 –

+0

試試這個http://stackoverflow.com/questions/13348812/how-to-use-automapper-to-create-complex-viewmodel-objects-from-a-simple-object-a/13355873#13355873或http:///stackoverflow.com/questions/20270983/ienumerable-to-entitycollection-failed-mapping-with-automapper-using-nested-mapp/20271546#20271546 –

回答

2

只要您爲兩個視圖模型類型定義了一個映射,autoMapper就會映射嵌套視圖模型。

例如,如果我有一個帶有ChildObjectViewmodel類型屬性的ParentObjectViewModel,我需要確保我已經在它們之間構建了一個映射。 Automapper將處理您的財產是IList的事實。

Mapper.CreateMap<ParentObjectViewmodel, ParentDataObject>(); 
    Mapper.CreateMap<ChildObjectViewmodel, ChildDataObject>(); 

當然,如果您的屬性名稱與視圖模型和數據對象不匹配,則需要將其指定爲Automapper。

編輯: 對於你的例子,它聽起來像你只是想能夠映射子對象(屬性)。所以,你可以使用:

Mapper.CreateMap<ItemViewModel, Item>(); 

這將允許你從任何ItemViewModel類型的任何項目類型自動映射(包括對象的ILists)。在CreateMap調用中,源對象類型位於左側,目標類型位於右側。如果你想來回映射,只需調用CreateMap兩次。

+0

這工作時,我添加了一個ParentDataObject但它可能沒有它?我認爲有了ChildDataObjects就足夠了,因爲我的ParentObjectViewModel只是我自定義視圖所需的不同模型的集合,並沒有自己的真實業務邏輯(它僅用於演示目的)。一旦我澄清這一點將接受你的答案:) –

+0

答案更新。我希望這有幫助。 – CuriousLayman

+0

這是否回答了您的問題? – CuriousLayman

相關問題