Если нажать кнопку «Далее», новый запрос будет отправлен на сервер. Запрос будет содержать page=2
и, например, rows=10
параметры как часть URL (если вы хотите получить следующие 10 строк второй страницы).
Код вашего сервера должен прочитать эти параметры и отправить обратно соответствующие строки данных. Данные JSON, отправленные обратно с сервера, должны выглядеть следующим образом
{
"total": "5",
"page": "2",
"records": "55",
"rows" : [
{"id" :"21", "cell" :["cell11", "cell12", "cell13"]},
{"id" :"22", "cell" :["cell21", "cell22", "cell23"]},
...
{"id" :"30", "cell" :["cell31", "cell32", "cell33"]},
]
}
(см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_data). Таким образом, данные должны содержать правильное значение для page
(страница = 2). В целом, возможно, что теперь у вас меньше данных, как раньше, и вы возвращаете страницу № 1 по запросу на получение страницы № 2.
Поэтому я предлагаю, чтобы в данный момент код вашего сервера не возвращал правильное значение page
в выводе.
ОБНОВЛЕНО : ОК, Джефф. Я продолжаю свой ответ в jqgrid setGridParam datatype: local и сообщаю, как обещанный код, как выполнять разбиение на страницы, сортировку и поиск на стороне сервера (или расширенный поиск).
Прежде всего, в примере я не буду реализовывать сортировку и поиск, а буду имитировать пейджинг только там, где у вас сейчас проблемы. Реальное разбиение на страницы, сортировка и поиск должны быть реализованы как соответствующие операторы SELECT
для базы данных SQL, в которой существуют данные. Сортировка выполняется по ORDER BY
, поиск по WHERE
и разбиение на конструкции типа TOP(x)
, TOP(x)
с LEFT OUTER JOIN
или использование ROW_NUMBER() OVER(...)
конструкций. Но все это не предмет вашего вопроса. Поэтому я сводлю все к простой симуляции подкачки данных.
Я начинаю с кода веб-метода ASMX:
public JqGridData TestMethod (int page, int rows, string sidx, string sord,
bool _search, string searchField, string searchOper, string searchString) {
// for advance search use "string filters" instead of the last three parameters
int recordsCount = 205;
int startIndex = (page - 1) * rows;
int endIndex = (startIndex + rows < recordsCount) ?
startIndex + rows : recordsCount;
List<TableRow> gridRows = new List<TableRow> (rows);
for (int i = startIndex; i < endIndex; i++) {
gridRows.Add (new TableRow () {
id = i,
cell = new List<string> (2) {
string.Format("Name{0}", i),
string.Format("Title{0}", i)
}
});
}
return new JqGridData () {
total = (recordsCount + rows - 1) / rows,
page = page,
records = recordsCount,
rows = gridRows
};
}
где классы JqGridData
и TableRow
определены следующим образом:
public class TableRow {
public int id { get; set; }
public List<string> cell { get; set; }
}
public class JqGridData {
public int total { get; set; }
public int page { get; set; }
public int records { get; set; }
public List<TableRow> rows { get; set; }
}
Мы пропускаем любую проверку входных параметров TestMethod
, чтобы сделать пример кода более читабельным.
Теперь код клиента:
$("#list").jqGrid({
url: './MyTestWS.asmx/TestMethod',
datatype: 'json',
mtype: 'POST',
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
serializeGridData: function (postData) {
if (postData.searchField === undefined) postData.searchField = null;
if (postData.searchString === undefined) postData.searchString = null;
if (postData.searchOper === undefined) postData.searchOper = null;
//if (postData.filters === undefined) postData.filters = null;
return JSON.stringify(postData);
},
jsonReader: {
root: function (obj) { return obj.d.rows; },
page: function (obj) { return obj.d.page; },
total: function (obj) { return obj.d.total; },
records: function (obj) { return obj.d.records; }
},
// you can also use following more simple form of jsonReader instead:
// jsonReader: { root: "d.rows", page: "d.page", total: "d.total",
// records: "d.records", id: "d.names" }
colModel: [
{ name: 'name', label: 'Name', width: 250 },
{ name: 'title', label: 'Title', width: 250 }
],
rowNum: 10,
rowList: [10, 20, 300],
sortname: 'name',
sortorder: "asc",
pager: "#pager",
viewrecords: true,
gridview: true,
rownumbers: true,
height: 250,
caption: 'My first grid'
}).jqGrid('navGrid', '#pager', {edit: false, add: false, del: false, search: true});
// {}, // use default settings for edit
// {}, // use default settings for add
// {}, // delete instead that del:false we need this
// {multipleSearch : true} // enable the advanced searching
// );
В коде я использую ту же технику, что и в jqgrid setGridParam datatype: local , но код функции serializeGridData
немного отличается. Поскольку мы используем метод POST, а не метод GET для получения данных с сервера , все входные параметры веб-метода всегда должны быть установлены . С другой стороны jqGrid задает не всегда параметры searchField
, searchOper
и searchString
, но только если _search=true
. Например, при первой загрузке jqGrid _search=false
и searchField
, searchOper
и searchString
не определены в postData
. Чтобы решить эту проблему, мы инициализируем неопределенные параметры с null
.
Для реализации сортировки необходимо использовать параметры sidx
(индекс сортировки) и sord
(направление сортировки: "asc"
или "desc"
).
Для осуществления поиска необходимо использовать другие параметры _search
, searchField
, searchOper
, searchString
.
При расширенном поиске вместо параметров searchField
, searchOper
, searchString
должен использоваться параметр filters
(см. Закомментированные строки). Данные должны быть декодированы в соответствии с десериализатором JSON. Поэтому необходимо установить multipleSearch : true
в jqgrid. Функцию serializeGridData
следует заменить на
serializeGridData: function (postData) {
if (postData.filters === undefined) postData.filters = null;
return JSON.stringify(postData);
}
и прототип веб-метода должен быть изменен на
public JqGridData TestMethod (int page, int rows, string sidx, string sord,
bool _search, string filters)
для декодирования параметра filters
можно использовать такой простой код:
if (_search && !String.IsNullOrEmpty (filters)) {
JavaScriptSerializer serializer = new JavaScriptSerializer ();
jqGridSearchFilter searchFilter =
serializer.Deserialize<jqGridSearchFilter> (filters);
// use the searchFilter here
}
где класс jqGridSearchFilter
может быть определен следующим образом:
public class jqGridSearchFilterItem {
public string field { get; set; }
public string op { get; set; }
public string data { get; set; }
}
public class jqGridSearchFilter {
public string groupOp { get; set; }
public List<jqGridSearchFilterItem> rules { get; set; }
}
Надеюсь, этой информации вам будет достаточно для реализации любого вида использования jqGrid в отношении веб-метода ASMX.
Я использовал простейшую отправку данных с сервера на клиент с дополнительными id
вне основных данных. Если один из столбцов в таблице - id
, вы можете немного уменьшить объем данных, отправляемых на сервер. См. Jqgrid 3.7 не показывает строки в Internet Explorer для получения дополнительной информации.