Конфигурация jqgrid jsonReader

Я новичок в jqgrid, наконец, я настроил сетку. Предположим, мне нужно настроить jsonReader, чтобы сетка знала, где взять мои данные сетки в возврате json. Однако после нескольких дней попыток я получил пустые ячейки.

Вот моя сетка:

jQuery("#list48").jqGrid({
            url: 'dbtest.aspx/get_offsite_history2',
            datatype: "json",
            mtype: 'POST',
            ajaxGridOptions: { contentType: "application/json" },
            serializeGridData: function(postData) {
                return JSON.stringify(postData);
            },
            jsonReader: {
                root: function(obj) { alert(JSON.stringify(obj.d)); return obj.d; },
                repeatitems: false
            },
            height: 'auto',
            rowNum: 30,
            rowList: [10, 20, 30],
            colNames: ['name', 'start_date', 'duration', 'offsite_cat'],
            colModel: [
                          { name: 'name', index: 'name', width: 80, align: 'left', editable: true, edittype: 'text' },
                          { name: 'start_date', index: 'start_date', width: 120, align: 'left', editable: true, edittype: 'text' },
                          { name: 'duration', index: 'duration', width: 120, align: 'left', editable: true, edittype: 'text' },
                          { name: 'offsite_cat', index: 'offsite_cat', width: 120, align: 'left', editable: true, edittype: 'text'}],
            pager: "#plist48",
            viewrecords: true,
            sortname: 'name',
            caption: "Grouping Array Data",
            gridview: true
        });

Это возврат сервера с URL-адреса dbtest.aspx/get_offsite_history2:

{"d":"[{\"name\":\"A\",\"start_date\":\"B\",\"duration\":\"C\",\"offsite_cat\":\"D\"}]"}

я полагаю, чтобы получить результат, установив "root: 'd'", но для этого я получил 64 пустых строки...

ищите комментарии... большое спасибо


person user2045340    schedule 07.02.2013    source источник


Ответы (2)


Причиной вашей проблемы является ошибка в коде вашего сервера. Вы делаете сериализацию в JSON дважды. После десериализации свойства d ответа сервера вы получаете все еще строку JSON (!!!) вместо объекта. Типичной ошибкой является ручное использование JavaScriptSerializer.Serialize в веб-методе. Следует возвращать сам объект вместо строки, которая является результатом сериализации.

Без изменения вашего текущего кода сервера вы можете решить проблему, используя

jsonReader: {
    root: function (obj) {
        alert(typeof obj.d === "string" ? obj.d : JSON.stringify(obj.d));
        return typeof obj.d === "string" ? $.parseJSON(obj.d) : obj.d;
    },
    repeatitems: false,
    page: function () { return 1; },
    total: function () { return 1; },
    records: function (obj) {
        return typeof obj.d === "string" ? $.parseJSON(obj.d).length : obj.length;
    }
}

или (если вы используете loadonce: true) просто

jsonReader: {
    root: function (obj) {
        return typeof obj.d === "string" ? $.parseJSON(obj.d) : obj.d;
    },
    repeatitems: false
}

Поскольку ваш текущий код сервера, похоже, не реализует разбиение данных на страницы, вам следует увеличить rowNum до некоторого достаточно большого значения, такого как rowNum: 10000, или использовать loadonce: true.

ОБНОВЛЕНО: вы можете найти здесь измененный демо, которое работает. Он отображает

введите здесь описание изображения

после сообщения alert.

person Oleg    schedule 07.02.2013

Я думаю, проблема в структуре ваших возвращаемых данных json.

Ниже приведен тот, который я использую:

{   "page":1,
    "rows":[{"id":"1","cell":["1","1","Row 1","3","9",""]},
            {"id":"2","cell":["2","2","Row 2","2","1",""]},
            {"id":"3","cell":["3","4","Row 3","2","0",""]}],
    "records":3,
    "total":1
}

Возможно, вам потребуется добавить colModel для идентификатора, чтобы однозначно идентифицировать каждую строку.

e.g.

      colNames: ['id', 'name', 'start_date', 'duration', 'offsite_cat'],
        colModel: [
                      { name: 'id', index: 'id', hidden: true },
                      { name: 'name', index: 'name', width: 80, align: 'left', editable: true, edittype: 'text' },
                      { name: 'start_date', index: 'start_date', width: 120, align: 'left', editable: true, edittype: 'text' },
                      { name: 'duration', index: 'duration', width: 120, align: 'left', editable: true, edittype: 'text' },
                      { name: 'offsite_cat', index: 'offsite_cat', width: 120, align: 'left', editable: true, edittype: 'text'}],

Надеюсь, это поможет.

person Steve    schedule 07.02.2013