Я не хочу поражать сервер и возвращать каждую строку, когда я пролистываю записи при помощи пейджера. Я считал, что, если я установил тип данных = локальный в полном блоге в функции .ajax И если я установил loadonce:true затем, я должен смочь избежать необходимости ожидать сетки для перезагрузки с данными.
Однако, когда я делаю эти вещи, сетка не переходит к следующей странице. Это просто зависает...
Что я делаю неправильно?
jQuery(document).ready(function () {
jQuery("#list").jqGrid({
datatype: processrequest,
mtype: 'POST',
jsonReader: {
root: "rows", //arry containing actual data
page: "page", //current page
total: "total", //total pages for the query
records: "records", //total number of records
repeatitems: false,
id: "ID" //index of the column with the PK in it
},
colNames: ['Name', 'Title'],
colModel: [
{ name: 'name', index: 'name', width: 250 },
{ name: 'title', index: 'title', width: 250 }
],
pager: '#pager',
rowNum: 10,
rowList: [10, 20, 30],
sortorder: "desc",
viewrecords: true,
height: '250px',
caption: 'My first grid',
loadonce: true
}).navGrid('#pager', {edit: false, add: false, del: false});
});
function processrequest(postdata) {
...
$.ajax({
...
complete: function (jsondata, stat) {
if (stat == "success") {
var thegrid = jQuery("#list2")[0];
var jsonObject = (eval("(" + jsondata.responseText + ")"));
thegrid.addJSONData(jsonObject.d);
$(".loading").hide();
} else {
$(".loading").hide();
alert("Error with AJAX callback");
}
$("#list").setGridParam({ datatype: 'local' });
}
});
}
Есть некоторые недоразумения. Если вы используете datatype: local
, то вам придется самостоятельно заполнять jqGrid методами типа addRowData
или задавать данные один раз параметром data
(для jqGrid версии 3.7 и выше). Таким образом, использование datatype: local
приводит к тому, что jqGrid не загружает никаких данных сам и ваш параметр datatype: processrequest
будет проигнорирован.
Если вы хотите использовать параметр loadonce: true
, который поддерживается с версии 3.7 jqGrid, то у вас должны быть все параметры jqGrid для JSON или XML (например, datatype: json
в вашем случае) и дополнительный параметр loadonce: true
. Тогда после первой загрузки данных jqGrid переключит тип данных на datatype: local
и после этого будет работать независимо от сервера, но игнорировать некоторые параметры (например, datatype: processrequest
в вашем случае).
Еще одно небольшое замечание. Большинство свойств jsonReader
, которые вы используете в своем примере, являются свойствами по умолчанию (см. эту вики). Параметры, которые вы используете, будут объединены со свойствами по умолчанию, поэтому достаточно использовать параметр типа
jsonReader: { repeatitems: false, id: "ID"}
UPDATED: OK Jeff. Мне кажется, чтобы решить вашу проблему, вам нужно еще несколько примеров кода с обеих сторон: клиента и сервера. Вот небольшой пример, который я создал и протестировал для вас.
Сначала о серверной стороне. В веб-сервисе ASMX мы определяем веб-метод, который генерирует тестовые данные для вашей таблицы:
public JqGridData TestMethod() {
int count = 200;
List<TableRow> gridRows = new List<TableRow> (count);
for (int i = 0; i < count; 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 = 1,
page = 1,
records = gridRows.Count,
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
не имеет параметров и отправляет обратно полные данные. Пагинация, сортировка и поиск данных будут осуществляться с помощью jqGrid (версия 3.7 или выше).
Чтобы прочитать такие данные и поместить в jqGrid, мы можем сделать следующее:
$("#list").jqGrid({
url: './MyTestWS.asmx/TestMethod',
datatype: 'json',
mtype: 'POST',
loadonce: true,
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
serializeGridData: function (postData) {
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; }
},
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},
{},{},{},{multipleSearch : true});
Некоторые комментарии по поводу определения jqGrid:
Для взаимодействия с веб-сервисом ASMX через JSON необходимо сделать следующее в соответствующем jQuery.ajax
запросе:
dataType: 'json'
должен быть установлен. contentType:'application/json; charset=utf-8'
должен быть установлен. Для всего этого я использую datatype
, ajaxGridOptions
и serializeGridData
параметры jqGrid. Кодировку JSON я делаю с помощью функции JSON.stringify
(соответствующий JavaScript можно скачать с здесь).
Затем полученные данные необходимо декодировать. Я делаю это с помощью моей любимой функции jqGrid - jsonReader
с функциями (см. этот пост SO и эту вики).
В конце мы используем loadonce: true
, который меняет datatype
jqGrid с 'json'
на 'local'
и мы можем сразу же использовать все преимущества локальной пагинации, сортировки и расширенного поиска, существующие с версии jqGrid 3.7.
Если вы хотите сделать серверную подкачку, сортировку и поиск (или расширенный поиск) с помощью веб-сервиса ASMX, это также возможно. Чтобы сэкономить место здесь и разделить примеры кода, я размещу соответствующий пример в другом вашем вопросе jqgrid Page 1 of x pager (см. ОБНОВЛЕННУЮ часть).
У меня это сработало. У меня возникла проблема с разбиением по страницам и неработающей сортировкой. Вероятно, из-за элементов .d и __type, которые отправлялись обратно в объекте JSON в .net. Однако с дополнительными конфигурациями в этом примере. Это сработало!
Я сходил с ума. Это способ настройки сетки, если вы используете .Net в качестве веб-сервиса. Он настроен на анализ и правильную установку элементов данных из объекта JSON в правильные места, необходимые в сетке, чтобы обеспечить работу разбиения по страницам и сортировки.
Мне пришлось прокомментировать, потому что я уверен, что есть несколько человек, которые хотели бы использовать эту сетку, но используют .Net в качестве своего веб-сервиса.
Немного поздно, но вот (?) Супер-простое решение для любых будущих искателей решений:
gridComplete: function(){
$("#yourGridID").setGridParam({datatype: 'local'});
}
Вот и все. Пользуюсь 3.7.2, о других версиях говорить не могу. Проблема (по-видимому) проистекает из того, что loadonce работает только с предопределенными значениями типа данных, а функция не является. Я полагаю , что другие встроенные значения также будут работать, но «локальный» имеет смысл.