我正在尝试使用DataPager进行服务器端分页。 这是我的代码:
<asp:DataPager ID="pgrFooBars" PagedControlID="lvFooBars"
QueryStringField="page" runat="server" >
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
代码后端
protected void Page_Load(object sender, EventArgs e)
{
ConfigureBlogPostListView();
}
private void ConfigureBlogPostListView()
{
int pageNum;
int.TryParse(Request.Params["page"], out pageNum);
int pageSize = 20;
PagedList<IFooBar> FooBars = FooService.GetPagedFooBars(
new PagingSettings(pageNum, pageSize));
ListViewPagedDataSource ds = new ListViewPagedDataSource();
ds.AllowServerPaging = true;
ds.DataSource = FooBars;
ds.MaximumRows = pageSize;
ds.StartRowIndex = pageNum;
//TotalCount is the total number of records in the entire set, not just those loaded.
ds.TotalRowCount = FooBars.TotalCount;
lvFooBars.DataSource = ds;
lvFooBars.DataBind();
pgrFooBars.PageSize = pageSize;
pgrFooBars.SetPageProperties(pageNum, FooBars.TotalCount, true);
}
PagedList来自RobConery有用的帖子http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/。
问题在于DataPager似乎使用ListView的Count属性来确定记录的总数,而在这种情况下是20。它需要知道有1,500条记录,而不是20条记录。DataPager有一个TotalRowCount属性,但这是只读的。
我从未见过带有服务器端分页的DataPager示例,但认为它可以进行服务器端分页,否则QueryStringField属性有什么用呢?
我知道你可以使用类似4GuysFromRolla在这里使用的方法 https://web.archive.org/web/20211020140032/https://www.4guysfromrolla.com/articles/031506-1.aspx 进行自定义分页解决方案,但我想先知道是否可以使用DataPager解决方案,然后再创建自定义解决方案。
更新 看得越多,我就越来越认为这是不可能的,并且不幸的是,datapager是一个只适用于小型网站的控件。如果控件构建正确,我想要做的应该很简单。我想能够说
dpFooBars.TotalRowCountComputed = false;
dpFooBars.TotalRowCount = AnyNumberThatISoChoose;
我一直在寻找一些方法来实现相同的功能,但似乎datapager的TotalRowCount是从它绑定的数据源中实际项目数计算得出的。对于微软创建ListViewPagedDataSource()类和DataPager,并将它们一起使用但无法正确协作,这对我来说非常奇怪,但事实就是如此。
更新2(恍然大悟?) 自从.Net 2.0以来,使用ObjectDataSource并自定义SelectCountMethod()已经可以进行服务器端分页了。我认为应该可以自定义ObjectDataSource以适应我的需要。嗯,我要去度周末了,所以我需要几天时间来看看这是否可行。请关注,真正的信徒们。