У меня есть модель просмотра, которая должна отображать определенное поле IEnumerable
в виде текстового поля, разделенного точкой с запятой. Сначала я подумал об использовании DefaultModelBinder
для его преобразования, но у меня возникли проблемы с мыслью, как добиться этого в обоих направлениях (dto <-> viewmodel).
Псевдонимы - это поле, которое я пытаюсь отобразить как одно текстовое поле, разделенное точкой с запятой.
public class Parent
{
public IEnumerable<Child> Children { get; set; }
}
public class Child
{
public IEnumerable<string> Nicknames { get; set; }
}
Итак, я решил попробовать AutoMapper, я создал две модели просмотра:
public class ParentViewModel
{
public IEnumerable<ChildViewModel> Children { get; set; }
}
public class ChildViewModel
{
public string Nicknames { get; set; }
}
Затем я создал сопоставления, подобные этому, для дочерних элементов (для краткости опущено обратное преобразование)
Mapper.CreateMap<Child, ChildViewModel>().ForMember(
d => d.Nicknames, o => o.ResolveUsing<ListToStringConverter>().FromMember(s => s.Nicknames);
Затем для родителя создал наивная карта (опять же, пропущенная в противном случае)
Mapper.CreateMap<Parent, ParentViewModel>();
Я действительно ожидал, что дочерние сопоставления будут происходить автоматически, но этого не происходит, я уже создал слишком много «правильного» кода для решения действительно простой проблемы, которая в любой другой более простая / старая среда, отличная от MVC, я бы давно покончил с ней :) Как я могу продолжить и сказать AutoMapper преобразовать дочерние элементы без написания другого «преобразователя дочерних элементов».
Неужели я переусердствовал и есть способ попроще?
Спасибо!