在PagedList.mvc中使用automapper

时间:2014-11-16 20:45:14

标签: asp.net-mvc asp.net-mvc-4 automapper pagedlist

我正在尝试转换为在我的mvc4应用程序中使用ViewModels。我已成功切换我的POST操作以使用viewmodels,但在下面的示例中,我尝试在操作中同时使用automapper和PagedList。

我创建了一个名为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);
        }

现在出现的错误是:

  

缺少类型映射配置或不支持的映射。

     

映射类型:项目 - &gt; ItemListViewModel Project.Models.Item - &gt;   Project.ViewModels.ItemListViewModel

     

目标路径:ItemListViewModel

它被抛到PagedListConverter

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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>();

您还需要从ItemItemViewModel的地图:

Mapper.CreateMap<Item, ItemListViewModel>();