2015-04-28 1 views
2

У меня есть существующее веб-приложение, которое в настоящее время использует jqGrid, и весь серверный сервер обращается с разбивкой по страницам на основе номера страницы и длины страницы. Теперь я хочу начать использовать DataTables для некоторых частей, и поскольку в его разбиении на страницы используются начальная запись и длина, я хочу знать, есть ли способ настроить DataTables для принятия номера страницы, поэтому мне не нужно изменять весь мой бэкэнд.Как настроить DataTables для работы с номером страницы, а не с начала записи

Любой способ настроить или, возможно, адаптировать DataTables для этого?

Редактирование: просто, чтобы избежать путаницы, я говорю о DataTables с функциональностью обработки на стороне сервера, а не о разбиении на страницы на стороне клиента.

EDIT 2: добавление некоторого кода того, как мой бэкэнд берет и отвечает на запросы из браузера. Это ASP.NET MVC4.

Мои услуги всегда отвечают страницы данных объекта разрабатывается с с помощью метода так:

Page<T> GetPage<TKey>(int pageNumber, 
         int pageSize, 
         Expression<Func<T, TKey>> orderBy, 
         bool ascending = true, 
         Expression<Func<T, bool>> predicate = null) 

Это возвращает Page<T> объект вроде этого:

public class Page<T> : IEnumerable<T> 
{ 
    private readonly IList<T> _items; 

    public IList<T> Items 
    { 
     get { return _items; } 
    } 

    public Page() 
    {} 

    public Page(int currentPage, IEnumerable<T> items, int itemsPerPage, int totalItems, int totalPages) 
    { 
     PageIndex = currentPage; 
     _items = items.ToList(); 
     TotalItems = totalItems; 
     PageSize = itemsPerPage; 
     TotalPages = totalPages; 
    } 

    public int PageIndex { get; private set; } 
    public int PageSize { get; private set; } 
    public int TotalItems { get; private set; } 
    public int TotalPages { get; private set; } 

    public IEnumerator<T> GetEnumerator() 
    { 
     return _items.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

Тогда это анализируется в Json в контроллере, возвращая ответ действия, чтобы соответствовать структуре json, необходимой для плагина grid (тогда как это jqGrid или DataTables).

Я не могу изменить структуру страницы и механику разбиения на страницы, поскольку это сильно повлияет на веб-приложение, так что это не обсуждается. Мне нужно найти способ адаптации DataTables, чтобы он отправил PageNumber вместо Запустите. Параметр Length будет соответствовать PageSize на моей стороне, чтобы он идеально подойдет.

+0

Как выглядит ваш текущий код? Трудно ответить, не зная, какого именно поведения вы хотите добиться. – davidkonrad

+0

Это не что-то о визуальном аспекте таблицы, речь идет о том, как плагин работает за сценой. Прямо сейчас плагин DataTables отправляет на сервер стартовую запись страницы, которую он хочет показать, и количество записей, которые нужно предъявить, затем сервер отвечает соответственно. Я хочу, чтобы DataTables отправлял номер страницы (вместе с количеством записей, которые оставались бы похожими на предыдущие). – CesarD

+0

Да, пожалуйста, добавьте свой код к вопросу. По коду я имею в виду, как вы хотите получить доступ к dataTables с помощью pagenumber, то есть как вы делаете это сейчас с помощью jqGrid. – davidkonrad

ответ

4

Свойство ajax.data можно изменить, чтобы изменить данные, представленные на сервер.

$('#example').dataTable({ 
    "processing": true, 
    "serverSide": true, 
    "ajax": { 
     "url": "script.php", 
     "data": function(d, settings){ 
     var api = new $.fn.dataTable.Api(settings); 

     // Convert starting record into page number 
     d.pageNumber = Math.min(
      Math.max(0, Math.round(d.start/api.page.len())), 
      api.page.info().pages 
     ); 
     } 
    } 
}); 
+0

Это очень похоже на временное решение, которое я придумал сегодня. Но я переоцениваю весь призыв ajax своим собственным, так что ваш лучше. Не могли бы вы сделать так, чтобы он только добавлял свойство pageNumber в объект данных вместо перезаписывания? С этим я его одобрю. Также один вопрос: я вычислил номер страницы с Math.floor (data.start/data.length), какая разница будет с вашей стороны? Благодаря! – CesarD

+1

Я добавил новое свойство 'pageNumber' вместо изменения' start'. Что касается свойства 'length' данных запроса, я считаю, что могут быть случаи, когда его значение не равно фактической длине страницы, например, с расширением [Скроллер] (https://datatables.net/extensions/scroller). Но в вашем случае 'd.start' и' api.page.len() 'должны быть равны. –

+0

Было бы лучше сделать это на сервере, а не на клиенте. Так как вы все равно получите начало и ограничение в параметрах. –

 Смежные вопросы

  • Нет связанных вопросов^_^