2014-11-16 2 views
0

Я пытаюсь преобразовать в использование ViewModels в моем приложении mvc4. Я успешно переключил свои действия POST, чтобы использовать viewmodels, но в приведенном ниже примере я пытаюсь использовать как autoapper, так и PagedList в действии.Использование automapper с PagedList.mvc

Я сделал класс, называемый AutoMapperConfiguration (ниже), чтобы избежать добавления отображения по всей программе:

public class AutoMapperConfiguration 
{ 
    public static void Configure() 
    { 
     ConfigureItemMapping(); 
    } 

    public class PagedListConverter : ITypeConverter<PagedList<Item>,PagedList<ItemListViewModel>> 
    { 
     public PagedList<ItemListViewModel> Convert(ResolutionContext context) 
     { 
      var model = (PagedList<Item>)context.SourceValue; 
      var vm = model.Select(m => Mapper.Map<Item, ItemListViewModel>(m)).ToPagedList(model.PageNumber,model.PageSize); 

      return new PagedList<ItemListViewModel>(vm,model.PageNumber,model.PageSize); 
     } 
    } 

    private static void ConfigureItemMapping() 
    { 
     Mapper.CreateMap<ItemListViewModel,Item>(); 
     Mapper.CreateMap<PagedList<Item>, PagedList<ItemListViewModel>>() 
      .ConvertUsing<PagedListConverter>(); 
    } 
} 

выше вызывается из Global.asax

protected void Application_Start() 
    { 
     ... 
     AutoMapperConfiguration.Configure(); 
     ... 
    } 

От контроллера, я пытаясь отправить список элементов в itemViewModel из элемента «Модель» в виде списка подкачки. Здесь я полностью застрял. Излишне говорить, что нижеследующее не работает.

[HttpGet] 
     public ActionResult Index(int page = 1) 
     { 
      //Show 10 items per page for the Admin 
      int pageSize = 10; 

      var items = new PagedList<Item>(
         db.Items.OrderBy(i => i.ItemId),page,pageSize); 
      var vm = new ItemListViewModel(); 

      Mapper.Map<PagedList<Item>, PagedList<ItemListViewModel>>(items); 

      return View(vm); 
     } 

Ошибка в настоящее время рассматривается является:

Missing конфигурация типа карты или неподдерживаемый отображение.

типы карт: Предмет -> ItemListViewModel Project.Models.Item -> Project.ViewModels.ItemListViewModel

Путь назначения: ItemListViewModel

Он бросают на следующей строке в PagedListConverter

var vm = model.Select(m => Mapper.Map<Item, ItemListViewModel>(m)).ToPagedList(model.PageNumber,model.PageSize); 

Любая помощь будет оценена по достоинству.

ответ

1

Я хотел бы создать PagedList<Item> вручную, а затем карту к PagedList<ItemViewModel>:

[HttpGet] 
public ActionResult Index(int page = 1) 
{ 
    int pageSize = 20; 

    var vm = new ItemListViewModel(); 
    var items = new PagedList(
     db.Items.OrderBy(i => i.ItemId), 
     page, 
     pageSize); 

    var viewModels = Mapper.Map<PagedList<Item>, PagedList<ItemListViewModel>>(items); 

    return View(viewModels); 
} 

Тогда это также кажется, что ваш конвертер нуждается в некоторых ухищрений тоже.Это, вероятно, следует считать число и размер страницы из источника PagedList:

public class PagedListConverter : ITypeConverter<PagedList<Item>,PagedList<ItemListViewModel>> 
{ 
    public PagedList<ItemListViewModel> Convert(ResolutionContext context) 
    { 
     var model = (PagedList<Item>)context.SourceValue; 
     var vm = model.Select(m => Mapper.Map<Item, ItemListViewModel>(m)).ToList(); 

     return new PagedList<ItemListViewModel>(vm, model.PageNumber, model.PageSize); 
    } 
} 

Также убедитесь, что использовать свой собственный конвертер, если вы звоните CreateMap:

Mapper.CreateMap<PagedList<Item>, PagedList<ItemViewModel>>() 
    .ConvertUsing<PagedListConverter>(); 

Вам также потребуется карта от Item к ItemViewModel :

Mapper.CreateMap<Item, ItemListViewModel>(); 
+0

Привет Андрей, я смотрел на ваш пример кода и внесены соответствующие изменения, чтобы проверить. Но я получаю сообщение об ошибке в PagedListConverter (в исходном сообщении). – ricky89

+0

@ user2317406: Я думаю, что у вас есть ваше отображение назад: вам нужно от «Item» до «ItemListViewModel». Я обновил ответ, дайте мне знать, если это поможет. –

+0

Я думаю, что есть проблема со следующим: var vm = new ItemListViewModel(); в контроллере. Если это не нужно также преобразовывать в PagedList? – ricky89

1

Generic раствор в AutoMapper 6+:

TypeConverter:

public class PagedListConverter<TSource, TDestination> : ITypeConverter<PagedList<TSource>, PagedList<TDestination>> where TSource : class where TDestination : class 
{ 
    public PagedList<TDestination> Convert(PagedList<TSource> source, PagedList<TDestination> destination, ResolutionContext context) 
    { 
     var collection = Mapper.Map<IEnumerable<TSource>, IEnumerable<TDestination>>(source.Value); 

     return new PagedList<TDestination>(collection, source.Page, source.Size, source.TotalCount); 
    } 
} 

Инициализировать:

CreateMap(typeof(PagedList<>), typeof(PagedList<>)).ConvertUsing(typeof(PagedListConverter<,>)); 

Пример:

var vm = Mapper.Map<PagedList<User>, PagedList<UserViewModel>>(users); 

ОБНОВЛЕНИЕ:

Если и используют висимость зиденту инъекции (IMapper), а затем заменить статический класс Mapper с context.Mapper.Map...

var collection = context.Mapper.Map<IEnumerable<TSource>, IEnumerable<TDestination>>(source.Items);