Сериализация данных редактирования jqGrid в JSON - PullRequest
1 голос
/ 22 декабря 2011

После того, как пользователь отредактировал данные в jqGrid, я хотел бы вернуть отформатированную строку JSON обратно на сервер для использования. Ниже приведен пример того, что сервер ожидает получить:

{
  "aptitudeArrayList":[
    {
      "skill":"VITS",
      "value":2,
      "id":2,
      "color":"RED"
    },
    {
      "skill":"GBFM",
      "value":6,
      "id":1,
      "color":"GREEN"
    },
    {
      "skill":"JSON",
      "value":4,
      "id":3,
      "color":"RED"
    },
    {
      "skill":"CASTLEROCK",
      "value":7,
      "id":4,
      "color":"RED"
    }
  ],
  "cell":12412,
  "line":"FIRST_LINE",
  "name":"Barop",
  "id":1,
  "region":"The end",
  "available":true
}

Вот сегмент моей ColModel:

...
{
    name:'cell',
    label:'Cell #',
    width:80,
    align:'center',
    editable:true,
    editrules:{required:true, integer:true},
    editoptions:{size:10, maxlength:10}
},
{
    name:'available',
    label:'Available',
    formatter:'checkbox',
    width:46,
    align:'center',
    editable:true,
    edittype:'checkbox',
    editoptions:{value:"true:false"}
},
{
    name:"vits.value",
    label:'VITS',
    width:300,
    align:'center',
    editable:true,
    jsonmap:"aptitudeArrayList.0.value"
},
{
    name:"vits.color",
    editable:true,
    jsonmap:"aptitudeArrayList.0.color"
}
...

Вот параметры редактирования: (я закомментировал постданные, так как они сейчас не нужны)

var editOptions = {
    onclickSubmit:function (params, postdata) {
        params.url = URL + '/'; //+ postdata.id;
    }
};

После вызова редактирования данные отправляются этой функции:

$.extend($.jgrid.edit, {
    closeAfterEdit:true,
    closeAfterAdd:true,
    ajaxEditOptions:{ contentType:"application/json" },
    mtype:'PUT',
    serializeEditData:function (data) {
        delete data.oper;
        return JSON.stringify(data);
    }
});

Приведенный выше неадекватный код возвращает этот JSON:

{
  "id":"1",
  "name":"Barop",
  "region":"The end",
  "line":"FIRST_LINE",
  "cell":"12412",
  "available":"true",
  "vits.value":"2",
  "vits.color":"RED"
  ...
}

Когда я присоединяю отладчик, я обнаруживаю, что data содержит: dataObject { id="1", name="Barop", region="The end", ... vits.value="2", vits.color="RED"} Кажется, он получает ключи от атрибута name в jqGrid.

Как мне сериализовать мои данные в формат, который требует сервер?

1 Ответ

2 голосов
/ 22 декабря 2011

Простейшим способом решения вашей проблемы мне кажется модификация serializeEditData, которую вы используете. Это может быть о следующем

serializeEditData: function (data) {
    return JSON.stringify({
        id: parseInt(data.id, 10),
        name: data.name,
        line: data.line,
        cell: parseInt(data.cell, 10),
        available: data.available === 'true',
        aptitudeArrayList: [
            value: data.value,
            color: data.color
        ]
    });
}

Более того, я рекомендую вам не использовать точки или любые другие метасимволы в свойстве name. Либо вы можете просто переименовать name: "vits.value" в name: "value", либо использовать дополнительное index свойство

name: "value",
index: "vits.value",
jsonmap: "aptitudeArrayList.0.value"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...