2014-11-16 1 views
0

mvc4 응용 프로그램에서 ViewModels를 사용하여 변환하려고합니다. 내가 성공적으로 내 POST 작업을 사용하여보기 모델을 사용 전환 한 있지만 아래 예제에서는 automapper 및 PagedList 작업에서 사용하려고합니다.PagedList.mvc와 함께 automapper 사용

내가 응용 프로그램 전체 매핑을 추가 피하기 위해 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(); 
     ... 
    } 

에서 호출 항목 목록을 모델 목록에서 itemListModel에 보내려고합니다. 이것이 내가 완전히 붙어있는 곳입니다. 말할 필요도없이 아래는 작동하지 않습니다. 지금은 볼되고

[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); 
     } 

오류는 다음과 같습니다

누락 형태 맵 구성이나 지원되지 않는 매핑.

매핑 유형 : 아이템 -> ItemListViewModel Project.Models.Item -> Project.ViewModels.ItemListViewModel

대상 경로 : 그것은 PagedListConverter

에 다음 줄에 발생되는 ItemListViewModel

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에 대한지도가 필요합니다 : 6 + AutoMapper에서

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

안녕 앤드류와 정적 클래스 Mapper을 대체, 당신의 예제 코드를 쳐다 보면서 테스트 따라 개정했다. 하지만 원래 게시물에서 PagedListConverter에 오류가 발생했습니다. – ricky89

+0

@ user2317406 : 매핑이 거꾸로되어 있다고 생각합니다. 'Item'에서'ItemListViewModel '까지 필요합니다. 답변을 업데이트했습니다. 도움이되는지 알려주세요. –

+0

다음과 같은 문제가 있다고 생각합니다 : var vm = new ItemListViewModel(); 컨트롤러에서. 이 또한 PagedList로 변환 할 필요가 없습니까? – ricky89

1

일반 솔루션 :

,515, 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); 

UPDATE :

U가 사용하는 경우에 의존적 dency 주입 (IMapper는) 다음 context.Mapper.Map...

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