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、JayrockjQuery、およびjqGridだけです。これは上記の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"、 "records": "2"、 "rows":[{"id": "13" 、"invdate": "2007-10-06"、 "name": "Client 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"、 "合計": "840.00"、 "注":"税抜き"}]}}

そしてこれは動作するコードです:

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 に答える