保存后jqGrid没有退出编辑模式(RESTful API)

时间:2013-12-13 10:01:56

标签: jquery ajax json jqgrid jstree

我在包含两个jqGrids的页面的前端工作。其中一个网格工作正常,双击行时启动编辑模式,按下Return键后退出编辑模式提交更改。另一个(给我带来麻烦的那个)正在工作,并在按Return时发出正确的POST请求,但它仍处于编辑模式。

奇怪的是,两个网格都使用相同的代码,只更改了POST参数以及POSTPUTDELETE网址。我相信问题在我用来将POST数据转换为JSON格式的函数中继续:如果不是设置了此函数中的所有必需参数,因此服务器在尝试保存时返回错误,网格退出编辑模式。但是,如果正确设置了所有参数并且POST请求成功,则网格保持不变。工作正常的网格使用非常相似的函数将POST数据转换为JSON格式。

网格(相关)代码:

function loadCommissions(userid, accountid) {
    $("#pager-commissions").empty();
    $("#jqgrid-commissions").empty().jqGrid({
        url : '/api/v1/commission/?account=' + accountid,
        datatype : 'json',
        ajaxGridOptions : {
            contentType : "application/json"
        },
        jsonReader : {
            repeatitems : false,
            id : "id"
        },
        colNames : ["Commission", "Type", "Rate"],
        colModel : [{
            name : 'Commission',
            width : 202
        }, {
            name : 'Type',
            edittype : 'select',
            formatter : 'select',
            editoptions : {
                value : 'F:Fixed Amount;P:Percentage'
            },
            stype : 'select'
        }, {
            name : 'Rate'
        }],
        cmTemplate : {
            editable : true,
            width : 100
        },
        ondblClickRow : function() {
            var rowid = $("#jqgrid-commissions").getGridParam('selrow');
            $('#jqgrid-commissions').jqGrid('editRow', rowid, {
                keys : true,
                dataType : 'json',
                url : '/api/v1/commission/' + encodeURIComponent(rowid) + '/',
                mtype : 'PUT'
            });
        },
        serializeRowData : function(data) {
            return serializeCommissionData(data, userid);
        },
        ajaxRowOptions : {
            contentType : "application/json"
        },
        autowidth : true,
        shrinkToFit : false,
        gridview : true,
        height : "auto",
        autoencode : true,
        loadonce : false,
        rowNum : 10,
        rowList : [10, 20, 30],
        pager : "#pager-commissions",
        viewrecords : true
    });
}

POST数据转换为JSON格式(服务器期望)的函数:

function serializeCommissionData(data, userid) {
    return JSON.stringify({
        user : '/api/v1/user/' + userid + '/',
        account : '/api/v1/account/' + $("a.jstree-clicked:first").parent().attr("id") + '/',
        Type : data.Type,
        Commission : data.Commission,
        Rate : data.Rate
    });
}

检索网格使用的JSON(/api/v1/commission/?account=1):

{
  "rows": [
    {
      "commission_currency": null, 
      "account": "/api/v1/account/1/", 
      "Commission": "Test", 
      "Rate": "0", 
      "user": "/api/v1/user/1/", 
      "Type": "F", 
      "id": 5, 
      "resource_uri": "/api/v1/commission/5/"
    }
  ], 
  "meta": {
    "total_count": 1, 
    "next": null, 
    "records": 20, 
    "limit": 20, 
    "offset": 0, 
    "total": 1, 
    "page": 1, 
    "previous": null
  }
}

1 个答案:

答案 0 :(得分:0)

我发现了问题。在网格的PUT请求中,服务器返回HttpNoContent(204),而不是HttpResponse(200)。我改变了后端以返回200而不是204,这就是诀窍。