ASP.NET MVC2中可重用的可分页列表

时间:2010-07-08 09:59:28

标签: asp.net-mvc pagination renderpartial

例如,此列表包含文档概述和允许分页的需要。 该列表在整个网站中使用。

根据使用它的上下文,它需要来自不同来源的数据。例如,它可以在“组”页面上使用,在该页面上需要加载组的文档。它可以在“事件”页面上使用,它需要加载事件的文档。

这两种情况也可以对包含页面的文档进行不同的过滤。

如果列表没有不同的数据源,我可以轻松使用Html.RenderAction,并从那里开始工作。

但是我是否在调用者的列表中提供文档,或者列表是否应该加载文档,具体取决于filter / paging / ... viewdata?

2 个答案:

答案 0 :(得分:0)

您可以将列表实现为部分视图而不是控制器操作。然后,您可以使用RenderPartial渲染列表,并根据列表应显示的内容传入不同的对象列表。

如果你传入IEnumerable作为模型,你可以使用类似Model.Skip(page * pagesize)的东西来实现分页.Take(pagesize)

更新

我们不要在视图中进行分页。创建一个执行分页的模型类可能是一个更好的主意,并且实际上是可测试的,并将其传递到视图中以提供正确的文档页面。当然,视图仍然负责显示页面和链接到其他页面。

您可以创建类似于DocumentPager类的东西,它包装IEnumerable并进行分页。这看起来像这样

public class DocumentPager {
    public IEnumerable<MyDocumentObject> DocSource { get; private set; }
    public int PageSize { get; private set; }

    public DocumentPager(IEnumerable<MyDocumentObject> docSource, int pageSize) {
        DocSource = docSource;
        PageSize = pageSize;
    }

    public IEnumerable<MyDocumentObject> GetPage(int pageNumber) {
        return DocSource.Skip(..etc).Take(..etc);
    }

    public int NumPages {
        get { return DocSource.Count() / PageSize; }
    }
}

然后,您可以将其传递到视图和部分视图中,该视图可以调用GetPage和NumPages方法和属性。

答案 1 :(得分:0)

也许你可以使用ScottGu的PagedList类做些什么,可以在这里找到:http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/