9

Troy Goodeの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 -> PagedViewModel1 PagedList.IPagedList 1[[Provision.DomainObjects.Department, Provision.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> Provision.DomainObjects.PagedViewModel1 [[Provision.DomainObjects.Department、Provision.DomainObjects、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null]]

宛先パス:PagedViewModel`1

ソース値:PagedList.StaticPagedList`1 [Provision.DomainObjects.Department]

どうすればこれを機能させることができますか?

4

1 に答える 1

2

髪を抜いた後、ようやくこれに気づきました。コードにまったく問題はありません。構成されたマッピングがクリアされるスレッドの問題であることが判明しました。上記のコードは、私が望んでいたことを行う適切な方法です。同じことをする必要がある他の人に別の質問をすることができるように、これをここに残しておきます。

于 2012-09-21T21:47:43.537 に答える