AutoMapper - 使用构造函数映射子集合

时间:2012-04-11 14:04:37

标签: c# collections pagination automapper

我有以下类,我需要将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);
}

除非其他人知道如何做到这一点?

1 个答案:

答案 0 :(得分:0)

因为看起来你要返回所有Post项目,你可以修改动作以从Thread对象而不是ThreadView创建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可能不是一种简单的方法。

编辑:哦,只是注意到页面正在传递到您的服务中。所以这个答案可能根本不是你想要的。让我知道,如果是这样的话,我会删除它。