2014-04-01 125 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

相关问题