Я пытаюсь использовать 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, по-видимому, использует свойство Count для ListView для определения общего количества записей, которое в этом случае равно 20. Как-то он должен знать, что существует 1500, а не 20 общих записей. DataPager имеет свойство TotalRowCount, но это только для чтения.
Я никогда не видел пример DataPager с подкачкой на стороне сервера, но предполагал, что он может выполнять страничную страничку на стороне сервера, в противном случае, что хорошего является атрибутом QueryStringField?
Я знаю, что вы можете выполнить собственное поисковое решение, используя такую методологию, как 4GuysFromRolla, здесь http://www.4guysfromrolla.com/articles/031506-1.aspx, но мне сначала хотелось бы чтобы узнать, возможно ли решение с помощью DataPager до создания пользовательского решения.
UPDATE Чем больше я смотрю на это, тем больше я прихожу к выводу, что это невозможно, и что, к сожалению, датапакер - это средство, предназначенное только для небольших веб-сайтов. То, что я хочу сделать, должно быть очень простым, если контроль был построен правильно. Я хочу сказать
dpFooBars.TotalRowCountComputed = false;
dpFooBars.TotalRowCount = AnyNumberThatISoChoose;
Я искал какой-то взлом, чтобы выполнить одно и то же, но похоже, что DataPager TotalRowCount вычисляется из фактического количества элементов в источнике данных, к которому он привязан. Мне кажется странным, что Microsoft одновременно создаст класс ListViewPagedDataSource() и DataPager и не будет корректно работать вместе, но похоже, что это произошло.
ОБНОВЛЕНИЕ 2 (AHA MOMENT?) Похоже, что с сайта .Net 2.0 можно было выполнять подкачку на стороне сервера, используя объект ObjectDataSource и настраивая SelectCountMethod(). Я считаю, что должно быть возможно настроить ObjectDataSource в соответствии с моими потребностями. Хммм. Я уезжаю на выходные, так что для меня будет несколько дней, чтобы посмотреть, работает ли это. Оставайтесь с нами, истинно верующие.