0

私は次のクラスを持っており、Thread クラスの投稿のコレクションを ThreadView クラスのページ付けされた投稿のコレクションにマップする必要がありますが、その方法について完全に困惑しています。

// Database class
public class Thread
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual IEnumerable<Post> Posts { get; set;}
}

// View class
public class ThreadView
{
    public int Id { get; set; }
    public string Title { get; set; }
    public PaginatedList<PostView> Posts { get; set; }
}

public class PaginatedList<T> : List<T>
{
    public PaginatedList<IEnumerable<T> source, int page)
    {
        ...
    }
}

私のマッピングは単純です:

Mapper.CreateMap<Thread, ThreadView>();
Mapper.CreateMap<Post, PostView>();

そして、私のアクションメソッドは次のようになります:

public ViewResult ViewThread(int threadId, int page = 1)
{
    var thread = _forumService.GetThread(threadId, page);
    var viewModel = Mapper.Map<Thread, ThreadView>(thread);

    return View(viewModel);
} 

しかし、これは明らかに機能しません。誰でも助けることができますか?

ありがとう

アップデート

少し匂いがしますが、今のところ、このようにすることで解決すると思います。

public ViewResult ViewThread(int id, int page = 1)
{
    var thread = _forumService.GetThread(id, page);
    var posts = Mapper.Map<IEnumerable<Post>, IEnumerable<PostView>>(thread.Posts);

    var viewModel = new ThreadView {
        Id = thread.Id,
        Title = thread.Title,
        Posts = new PaginatedList<PostView>(posts, page)
    };

    return View(viewModel);
}

他の誰かがこれを行う方法を知らない限り?

4

1 に答える 1

0

とにかくすべての Post アイテムを返しているように見えるので、ThreadView の代わりに Thread オブジェクトから PaginatedList を作成するようにアクションを変更できます。何かのようなもの:

public ViewResult ViewThread(int threadId, int page = 1)
{
    var thread = _forumService.GetThread(threadId, page);
    thread.Posts = new PaginatedList(thread.Post, page);
    var viewModel = Mapper.Map<Thread, ThreadView>(thread);

    return View(viewModel);
} 

AutoMapper を使用するだけでは、おそらく簡単な方法はありません。

編集:ああ、ページがサービスに渡されていることに気付きました。したがって、この答えはおそらくあなたが望むものではありません。その場合は削除しますのでお知らせください。

于 2012-04-11T14:30:06.577 に答える