4

我想知道是否有人可能对此有所了解。jqGrid 对这个 JSON 字符串非常满意:

{'page':'1','total':1,'records':'4','rows':[{'id':1,'title':'Story Manager','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':2,'title':'Analysis','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':3,'title':'Narrative','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':4,'title':'Graphic','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'}]}

Jayrock(.NET JSON-RPC 框架)将 JSON 字符串提供为:

{id:'-1','result':{'page':'1','total':1,'records':'4','rows':[{'id':1,'title':'Story Manager','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':2,'title':'Analysis','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':3,'title':'Narrative','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':4,'title':'Graphic','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'}]}}

即它{id:'-1','result':{ /* ... snip ... */ }}在工作的 JSON 周围添加了一个 " " 包装器。

无论如何将 jqGrid 的 jsonReader 属性指向正确的位置以开始解析 JSON 结果?我在这一切上玩得很开心:)

- - 编辑 - -

我想发布一个简单的例子......谢谢你的回答,Stuntz。以下示例只需要 .NET、JayrockjQueryjqGrid。这适用于上述 JSON。我忘了您是否需要设置内容类型。

var lastsel; // last row selected (for editing)      

jQuery(document).ready(function(){ 
    jQuery("#mygrid").jqGrid({ 
        contentType: "text/plain; charset=utf-8",
        datatype: function(postdata)
        {
            $.ajax({
                url: 'http://localhost:2064/StoryManager/StoryManager.ashx/getPageItemRoles?id=3',
                data: postdata,
                complete: function(response, status)
                {
                    if(status=='success')
                    {
                        var mygrid = jQuery("#mygrid")[0];
                        var o = eval("(" + response.responseText + ")"); // TODO don't use eval.  it's insecure, but older browsers support it...
                        mygrid.addJSONData(o.result);
                    }
                }
            })
        },                
        colNames:['ID', 'Title', 'Assigned To', 'Assigned', 'Due', 'Completed'],
        colModel:[
            {name:'id', label:'ID', jsonmap:'id', hidden: true,  editrules: { edithidden: true }},
            {name:'title', jsonmap:'title', editable: true},
            {name:'assignedto', label:'Assigned To', jsonmap:'assignedto', editable: true},
            {name:'assigned', jsonmap:'assigned', editable: true},
            {name:'due', jsonmap:'due', editable: true},
            {name:'completed', jsonmap:'completed', editable: true}
        ],
        jsonReader: {
            repeatitems: false
        }
    });  
});
4

3 回答 3

3

不,您不能通过 jsonReader 执行此操作。在内部,网格会:

        ts.p.page = data[ts.p.jsonReader.page];

...这不适用于虚线子属性。

相反,您需要通过将数据类型设置为函数来手动获取网格数据。然后,您可以使用 $.ajax 获取数据,并在它返回时调用 grid.addJsonData,就像网格一样,除了传递整个响应之外,您将传递响应的子属性。

于 2009-06-29T18:19:12.183 回答
1

这篇文章和链接真的很有帮助。我还不清楚它是如何工作的,但我想我会发布这个来帮助别人减轻他们的痛苦:)

这是 getRecords 的返回 JSON:

{"id":-1,"result":{"page":"1","total":"1","re​​cords":"2","rows":[{"id":"13" ,"invdate":"2007-10-06","name":"客户 3","amount":"1000.00","tax":"0.00","total":"1000.00","note": ""},{"id":"12","invdate":"2007-10-06","name":"Client 2","amount":"700.00","tax":"140.00", "total":"840.00","note":"no tax"}]}}

这是工作代码:

jQuery(document).ready(function(){ 
    jQuery("#list4").jqGrid({ 
        contentType: "text/plain; charset=utf-8",
        datatype: function(postdata)
        {
            $.ajax({
                url: 'http://localhost/Booga/Baba.ashx/getRecords',
                data: "{}", // For empty input data use "{}",
                dataType: "json",
                type: "GET",
                contentType: "application/json; charset=utf-8",
                complete: function(response, status)
                {
                    if(status=='success')
                    {
                        var mygrid = jQuery("#list4")[0];
                        var o = eval("(" + response.responseText + ")");// TODO don't use eval.  it's insecure, but older browsers support it...
                        mygrid.addJSONData(o.result);
                    }
                }
            })
        },                
    colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
    colModel:[
        {name:'id',index:'id', width:55},
        {name:'invdate',index:'invdate', width:90, jsonmap:"invdate"},
        {name:'name',index:'name asc, invdate', width:100},
        {name:'amount',index:'amount', width:80, align:"right"},
        {name:'tax',index:'tax', width:80, align:"right"},      
        {name:'total',index:'total', width:80,align:"right"},       
        {name:'note',index:'note', width:150, sortable:false}       
    ],
        jsonReader: {
            repeatitems: false
        }
    });  
});

顺便说一句,有谁知道为什么使用 eval 是不安全的?看看我的代码的评论。我从 forum.asp 链接中获取了该部分。

于 2010-07-02T15:23:35.267 回答
1

即,它在工作 JSON 周围添加了一个“{id:'-1','result':{ /* ... snip ... */ }}” 包装器。

这是 JayRock 处理 SMD 响应方式的副作用……“id”是“响应标识符”,有助于异步通信。

因此,如果您触发了一堆异步请求(并且不要等待响应),您可以指定“请求 ID”,JayRock 将尊重它......因此您可以将响应与请求对齐。

我希望这有点道理。

于 2012-02-09T22:05:09.737 回答