【问题标题】:jqGrid pagination not working with json datatypejqGrid 分页不适用于 json 数据类型
【发布时间】:2013-04-20 05:13:22
【问题描述】:

我似乎无法让 jqGrid 分页工作。当我单击 next/prev/reload 或尝试 filter 时,它没有发出请求。只要我点击这些按钮中的任何一个,所有记录都会消失。

这是发送的初始请求,因此您可以看到所有这些参数都被传入。

 https://www.xxxxxxx.com/getallorders?contactId=333&bucketId=444&_search=false&nd=1366982305621&rows=2‌​0&page=1&sidx=PKId&sord=desc

这会返回适当数量的记录,如果我手动执行它并传入假设 page=2 我确实会得到适当的设置。问题似乎是请求没有发出。

jQuery("#grid").jqGrid({
    url:'/GetAllOrders',
    mtype: "GET", 
    datatype: "json", 
    jsonReader: {
        root: "Rows",
        page: "Page",
        total: "Total",
        records: "Records",
        repeatitems: false,
        userdata: "UserData",
        id: "Id"
    },
    postData: {
        contactId: currentUserId,
        bucketId: currentBucketId
    },
    colNames:[
        'Id',
        'Cancel',
        'Order #',
        'Order Date',
        'Bucket', 
        'Warehouse',
        'Destination',
        'Status',
        'Tracking #',
        'Transport By',
        'Ordered By',
        'Order Items'
    ],
    colModel:[
        {name:'Id',index:'Id', width:5, align:"center", hidden: true},
        {name:'Cancel', index:'Cancel',width:80, align:"center", formatter: cancelLinkFormatter, search:false },
        {name:'OrderNumber',index:'OrderNumber', width:80, align:"center"},
        {name:'OrderDate',index:'OrderDate', width:140, align:'right'},
        {name:'Bucket',index:'Bucket', width:180, align:"center", hidden: false},
        {name:'Warehouse',index:'Warehouse', width:80, align:"center", hidden: true},
        {name:'Destination',index:'Destination', width:150},
        {name:'StatusCode', index:'StatusCode', width:100, align: 'center'},
        {name:'TrackingNumber', index:'TrackingNumber', width:100, align: 'center'},
        {name:'TransportCompany', index:'TransportCompany', width:100, align: 'center'},
        {name:'OrderedBy', index:'OrderedBy', width:100, align: 'center'},
        {name:'OrderItems', index:'OrderItems', width:100, align: 'center'}
    ],
    viewrecords: true, 
    rowNum: 20,
    autowidth: false,
    width: 860,
    height: 450,
    rowList:[10,20,30,40,50],
    pager: jQuery('#pager'),
    sortname: 'Id',
    align: 'center',
    sortorder: "desc",
    loadonce: false,
    ignoreCase: true,
    caption:"Orders"
}).navGrid('#pager',{edit:false,add:false,del:false});
setSearchSelect('StatusCode');
jQuery("#grid").jqGrid('filterToolbar', {stringResult: true, searchOnEnter: false, defaultSearch: "cn"});

这是我在初始加载时从服务器获得的 json 响应。

{
"Total":2,
"Page":1,
"Records":28,
"Rows":[
    {
        "PKId":1234,
        "OrderNumber":"XXXXXX97",
        "Cancel":"Cancel",
        "OrderDate":"Jul 11 2012 12:37PM",
        "Warehouse":"",
        "Bucket":"xxxxxxxx",
        "StatusCode":"Shipped Complete",
        "StatusLink":"View Info",
        "TrackingNumber":"xxxxxxx",
        "TransportCompany":"xxxxxxxx",
        "Destination":"xxxxxxx",
        "BucketId":110,
        "ShippingEmail":"xxxxxxxx",
        "OrderedBy":"xxxxxxxx",
        "OrderItem":"xxxxxxx"
    },
    .... MORE DATA HERE ... 20 OBJECTS ALL-TOGETHER WITHIN Rows Array
    {
        "PKId":13434,
        "OrderNumber":"XXXXXX97",
        "Cancel":"Cancel",
        "OrderDate":"Jul 11 2012 12:37PM",
        "Warehouse":"",
        "Bucket":"xxxxxxxx",
        "StatusCode":"Shipped Complete",
        "StatusLink":"View Info",
        "TrackingNumber":"xxxxxxx",
        "TransportCompany":"xxxxxxxx",
        "Destination":"xxxxxxx",
        "BucketId":110,
        "ShippingEmail":"xxxxxxxx",
        "OrderedBy":"xxxxxxxx",
        "OrderItem":"xxxxxxx"
    },
],
"UserData":null
}

有什么建议吗?

顺便说一句,当我使用 loadonce: true 和一次加载所有数据时,分页和过滤工作正常,但是,由于记录太多,我只需要切换到服务器端。

编辑 我发现了问题。首先,很抱歉没有包括其余的代码。 你看,我也有loadComplete,这对我来说是个问题。 问题中的代码将起作用,所以我要感谢大家的参与。

这是导致问题的loadComplete。一旦我删除它,它就开始正确分页。

        loadComplete: function() {
        setParamsOnComplete();
        var myGrid = jQuery("#grid");
        var ids = myGrid.getDataIDs();
        for (var i = 0, idCount = ids.length; i < idCount; i++) {
            jQuery("#"+ids[i]+" a",myGrid[0]).click(function(e) {
                var hash=e.currentTarget.hash;// string like "#?id=0"
                if (hash.substring(0,6) === "#S?id=") {
                    var id = hash.substring(6,hash.length);
                    var text = this.textContent || this.innerText;
                    dialog.dialog({ title: 'Status Information', 
                        buttons:{   Ok: function() {
                                        jQuery( this ).dialog("close");
                                    }
                                },
                        open:   function() {
                                    jQuery('.ui-dialog-buttonpane').find('button:contains("Ok")').css('font-size', '10px');
                                }          
                    });
                    dialog.dialog('open');
                }
                if (hash.substring(0,6) === "#C?id=") {
                    var id = hash.substring(6,hash.length);
                    var text = this.textContent || this.innerText;
                    var changed = false;
                    var additionalMesages = "";
                    jQuery.post("DataFetcher.asp", { 'action': "cancelOrder", 'id':id }, function(xml) {
                        changed = (xml === 'True');
                        additionalMesages = xml;
                    }).success(function(){ 
                        if (changed){
                            showDialogCustomTitle("Success", "You've successfully cancelled the order " + id + ".");
                            jQuery("#grid").setGridParam({datatype:'xml', page:1}).trigger('reloadGrid');
                        }else if (additionalMesages.split("_")[1] == "2"){
                            showDialogCustomTitle("Error", additionalMesages.split("_")[2]);
                        }else if (additionalMesages.split("_")[1] == "1"){
                            showDialogCustomTitle("Error", additionalMesages.split("_")[2]);
                        }
                    });
                }
                //e.preventDefault();
            });
        }  
    },

我的下一个任务可能是找出loadComplete 导致问题的原因。

编辑 2 找到loadComplete 的第一个问题。昨晚我太累了,没有注意到它,但是这个网格填充 xml 并在客户端分页期间的剩余代码肯定会导致问题。再次感谢大家的参与。 :)

jQuery("#grid").setGridParam({datatype:'xml', page:1}).trigger('reloadGrid');

【问题讨论】:

  • 你可以为此提供jsfiddle吗?
  • 我想错误应该在您的服务器代码中。对服务器的请求可能会发送到服务器,但服务器返回总是第一页数据。此外,您应该修复包含行 ID 的属性名称。您的 JSON 响应不包含 Id 属性,而是包含 PKId。因此,您应该将jsonReader 内部的id: "Id" 更改为id: "PKId"。我建议您另外删除不需要的Id 列或将Id 列重命名为PKId 并将key: true 属性添加到colModelPKId 列的定义中。
  • 当我更改页面时,开发者工具不会向 /GetAllOrders 显示任何请求。这不是正常行为吗?
  • 另外,在jsonReader中改为id:"PKId",并在colModelPKId列的定义中添加了key: true,但是,我仍然面临同样的问题,但是谢谢指出这一点。

标签: javascript jquery jqgrid pagination


【解决方案1】:

由于您已设置loadonce:false,因此分页和过滤请求将尝试在服务器端进行处理。由于您的情况可能不会发生这种情况,因此 jqGrid 中将没有数据可以返回和设置。

如果您使用loadonce:falsedatatype:"json" jqGrid 选项,那么您的服务器必须实现网格的分页。服务器接收一些参数,这些参数在'GET' 请求的情况下附加到url 或在"POST" 请求的情况下在HTTP 正文中发送,即:rows, page, sidx, sord

例如,如果您的表有一个索引为'Col1' 的列作为当前排序列,rowNum: 20,那么您的网址将附加baseUrl?rows=20&amp;page=1&amp;sidx=Col1&amp;sord=asc。您的服务器端编码应该修改您的数据查询,使其具有ORDER BY (Col1 datafield in the table) ascrowNum from 1 to 20

如果您已按照上述操作但仍无法正常工作,则应验证您的服务器代码。

【讨论】:

  • 感谢您的意见,但我确实按照您提到的步骤进行操作。这是发送的初始请求,因此您可以看到所有这些参数都被传入: getallorders?contactId=3434&bucketId=24334&_search=false&nd=1366982305621&rows=20&page=1&sidx=Id&sord=desc 这将返回正确数量的记录,并且如果我手动执行它并传入让我们说 page=2 我确实得到了正确的设置。问题似乎是没有提出请求。
  • 我使用 'json' 数据类型和 POST 请求类型,当我点击搜索时,POST 正文中没有添加任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多