例如,此列表包含文档的概述,并且需要允许分页。该列表在整个网站中使用。
根据使用它的上下文,它需要来自不同来源的数据。例如,它可以用在“组”页面上,它需要为组加载文档。它可以在“事件”页面上使用,它需要为事件加载文档。
这两种情况也可以对带有页面的文档进行不同的过滤。
如果列表没有不同的数据源,我可以轻松使用 Html.RenderAction,然后从那里开始工作。
但是我是否在调用者中为列表提供文档,或者列表是否应该加载文档,具体取决于过滤器/分页/...视图数据?
例如,此列表包含文档的概述,并且需要允许分页。该列表在整个网站中使用。
根据使用它的上下文,它需要来自不同来源的数据。例如,它可以用在“组”页面上,它需要为组加载文档。它可以在“事件”页面上使用,它需要为事件加载文档。
这两种情况也可以对带有页面的文档进行不同的过滤。
如果列表没有不同的数据源,我可以轻松使用 Html.RenderAction,然后从那里开始工作。
但是我是否在调用者中为列表提供文档,或者列表是否应该加载文档,具体取决于过滤器/分页/...视图数据?
您可以将列表实现为部分视图而不是控制器操作。然后,您可以使用 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; }
}
}
You can then pass this into the view and into your partial view that can call the GetPage and NumPages method and property.
Maybe you can do something with ScottGu's PagedList class which can be found here: http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/