在HTTP 414错误的情况下,jqGrid不会触发loadError

时间:2014-08-14 08:52:51

标签: jqgrid

loadError返回错误时,似乎没有触发jqGrid事件GET

414 Request-URI Too Long

可以通过附加大于2048字节的数据的后期数据来再现它。 也许有人知道如何在jqGrid中使用POST而不是GET请求?

$grid.jqGrid({
    url:'/greenarrow_campaign_statistics/get_all_for_grid',
    datatype: "json",
    mtype: "POST",
    colNames:['Campaign Name', 'Last Date', '# of mailings', 'Recipients', 'Hard bounces', '%', 'Opens', '%', 'Clicks', '%', 'Upgrades', '%', 'FBL Compl.', '%'],
    colModel :[
        {name:'campaign_name', index:'campaign_name', width:220, sorttype:'text',align:'left',fixed:true},
        {name:'finishtime_str', index:'finishtime_sec', width:140, sorttype:'number',align:'center',fixed:true},
        {name:'count', index:'mailings_cnt', width:70, sorttype:'number',align:'right',fixed:true,hidden:true},
        {name:'recips_total', index:'recips_total', width:75, sorttype:'number',align:'right',fixed:true},
        {name:'num_bounces_hard', index:'num_bounces_hard', width:60, sorttype:'number',align:'right',fixed:true},
        {name:'num_bounces_hard_perc', index:'num_bounces_hard_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter},
        {name:'num_opens', index:'num_opens', width:75, sorttype:'number',align:'right',fixed:true},
        {name:'num_opens_perc', index:'num_opens_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter},
        {name:'num_clicks', index:'num_clicks', width:70, sorttype:'number',align:'right',fixed:true},
        {name:'num_clicks_perc', index:'num_clicks_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter},
        {name:'num_upgrade', index:'num_upgrade', width:60, sorttype:'number',align:'right',fixed:true},
        {name:'num_upgrade_perc', index:'num_upgrade_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter},
        {name:'num_fbl', index:'num_fbl', width:60, sorttype:'number',align:'right',fixed:true},
        {name:'num_fbl_perc', index:'num_fbl_perc', width:40, sorttype:'number',align:'right',fixed:true, formatter: percFormatter}
    ],
    rowList:[20, 30, 50, 100, 500],
    pager: '#pager',
    rowNum:20,
    shrinkToFit: true,
    sortname: 'finishtime_sec',
    viewrecords: true,
    sortorder: "desc",
    toolbar: [true, 'top'],
    multiselect: true,
    multiboxonly: true,
    footerrow: true,
    userDataOnFooter: true,
    height: "auto",
    caption:"",
    beforeRequest: function()
    {
        $grid.jqGrid(
            'appendPostData',
            {
                period: $period.val(),
                from: $('#start_date').val(),
                to: $('#end_date').val(),
                campaigns: $('input[name="campaign_names"]').val(),
                search_text: $('#search_text').val()
            });
    },
    ondblClickRow: function(id)
    {
        $('#btn_edit').trigger('click');
    },
    loadComplete: function(data) {
        $("tr.jqgrow:odd").css("background", "#DDDDDC");
    },
    loadError: function(xhr, status, error) {
        jQuery("#rsperror").html("Type: " + status + "; Response: " + xhr.status + " " + xhr.statusText);
    }
})

1 个答案:

答案 0 :(得分:0)

如果你检查jqGrid的源代码(参见the lines),你可以看到jqGrid只使用jQuery.ajax。所以它可能是您使用的jQuery版本中的一个问题。

无论如何,问题的根源可能是使用HTTP GET而不是使用HTTP POST。 GET请求的所有参数都将附加到URL(?p1=v1&p2=v2&p3=v3...)。 URL长度存在限制,在不同的浏览器和不同的Web服务器中有所不同(请参阅here)。例如,Internet Explorer的最大URL长度为2,083个字符(请参阅here)。其他Web浏览器还有另一个URL限制(例如,请参阅here)。

从设计的角度来看,如果URL的总大小可能大于2K(2048个字符),则严格建议使用POST而不是GET。如果您对HTTP 414错误没有任何问题。

因此,您应修改服务器代码以回复POST请求,并包含jqGrid的mtype: "POST"选项(或将mtype: "GET"替换为mtype: "POST")。