Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AutoMapper - mapping child collections in viewmodel

I have a viewmodel that needs to display a certain IEnumerable field as semicolon-separated textbox. At first I thought of using DefaultModelBinder to transform it, but I had trouble thinking how to achieve it in both directions (dto <-> viewmodel).

Nicknames is the field I'm trying to display as one textbox separated by semicolon.

public class Parent
{
    public IEnumerable<Child> Children { get; set; }
}

public class Child
{
    public IEnumerable<string> Nicknames { get; set; }
}

So I decided to try AutoMapper, I created two ViewModels:

public class ParentViewModel
{
    public IEnumerable<ChildViewModel> Children { get; set; }
}

public class ChildViewModel
{
    public string Nicknames { get; set; }
}

Then, I created mappings, like this for the children (omitted the other-way conversion for brevity)

Mapper.CreateMap<Child, ChildViewModel>().ForMember(
d => d.Nicknames, o => o.ResolveUsing<ListToStringConverter>().FromMember(s => s.Nicknames);

Then, for the parent, created a naive map (again, omitted the other-way)

Mapper.CreateMap<Parent, ParentViewModel>();

I truly expected the child mappings occur automatically, but they don't, I've already created too much "proper" code to solve a really simple problem which in any other simpler/older non-MVC environment, I'd be done with a long time ago :) How can I proceed and tell AutoMapper to transform the children without writing another "children member resolver".

Have I overthought this and there's a simpler way?

Thank you!

like image 851
Madd0g Avatar asked Nov 25 '11 14:11

Madd0g


1 Answers

try

Mapper.CreateMap<Parent, ParentViewModel>();
Mapper.CreateMap<Child, ChildViewModel>();

var v = Mapper.Map<Parent, ParentViewModel>(parent);
like image 192
Rafay Avatar answered Sep 25 '22 05:09

Rafay