我正在使用Troy Goode's PagedList在我的WebApi中提供分页信息。他的包返回一个实现IEnumerable的IPagedList,但也包含自定义属性,如IsLastPage,PageNumber,PageCount等。
当您尝试从WebApi控制器方法(例如GET)返回此类时,Enumerable已序列化,但自定义属性不是。所以,我想我会使用AutoMapper并编写一个自定义类型转换器来转换为这样的类:
public class PagedViewModel<T>
{
public int FirstItemOnPage { get; set; }
public bool HasNextPage { get; set; }
public bool HasPreviousPage { get; set; }
public bool IsFirstPage { get; set; }
public bool IsLastPage { get; set; }
public int LastItemOnPage { get; set; }
public int PageCount { get; set; }
public int PageNumber { get; set; }
public int PageSize { get; set; }
public int TotalItemCount { get; set; }
public IEnumerable<T> rows { get; set; }
}
由于我将Enumerable移动到一个不同的属性,序列化完美地处理它。所以,我坐下来写了一个这样的自定义类型转换器:
public class PagedListTypeConverter<T> : ITypeConverter<IPagedList<T>, PagedViewModel<T>>
{
public PagedViewModel<T> Convert(ResolutionContext context)
{
var source = (IPagedList<T>)context.SourceValue;
return new PagedViewModel<T>()
{
FirstItemOnPage = source.FirstItemOnPage,
HasNextPage = source.HasNextPage,
HasPreviousPage = source.HasPreviousPage,
IsFirstPage = source.IsFirstPage,
IsLastPage = source.IsLastPage,
LastItemOnPage = source.LastItemOnPage,
PageCount = source.PageCount,
PageNumber = source.PageNumber,
PageSize = source.PageSize,
TotalItemCount = source.TotalItemCount,
rows = source
};
}
}
然后在我的配置中设置如下:
Mapper.CreateMap<IPagedList<Department>, PagedViewModel<Department>>().ConvertUsing(new PagedListTypeConverter<Department>());
但是,当我试着这样称呼它时:
var x = Mapper.Map<IPagedList<Department>, PagedViewModel<Department>>(departments);
我收到此错误:
缺少类型映射配置或不支持的映射。
映射类型:IPagedList
1 -> PagedViewModel
1 PagedList.IPagedList1[[Provision.DomainObjects.Department, Provision.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> Provision.DomainObjects.PagedViewModel
1 [[Provision.DomainObjects.Department, Provision.DomainObjects,Version = 1.0.0.0,Culture = neutral, 公钥=空]]目标路径:PagedViewModel`1
来源价值: PagedList.StaticPagedList`1 [Provision.DomainObjects.Department]
我该如何做到这一点?
答案 0 :(得分:1)
拔掉头发之后,我终于想出了这个。代码没有任何错误。事实证明,配置的映射已被清除,这是一个线程问题。上面的代码是做我想要的正确方法。我要离开这里,以便我可以为其他需要做同样事情的人指出另一个问题。