我正在尝试转换为在我的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);
任何帮助都将不胜感激。
答案 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>();
您还需要从Item
到ItemViewModel
的地图:
Mapper.CreateMap<Item, ItemListViewModel>();