如何显示嵌套的json数据/ extjs4?

时间:2011-09-29 15:47:03

标签: c# json nested extjs4 tuples

我有一个返回7个值的函数,我使用一个元组来返回它们,因为它们没有相同的类型 那我就把它分开了 所以我可以在我的js脚本中读取我生成的json,我可以通过ItemN

访问它

看看代码:

 public JArray getJsonData( )
    {             

        //my queries here//  

        var vl = new List<Tuple<string, string,  string, int, int, double, string >>();

        vl.Add(new Tuple<string, string,  string,int, int, double, string>
             (item.Date , item.Adress,  name, item.login, pwd, role, id));                
        }

        JArray o = JArray.FromObject(vl);

        return o;          
    }

我的extjs4商店:

var myStore2 = new Ext.data.JsonStore({

fields: ['Item1', 'Item2', 'Item3', 'Item4', 'Item5', 'Item6', 'Item7'] ,

data: []
});

问题是现在我需要返回另一个元素,使它们在我的元组中成为8个元素 所以我得到了这个有趣的错误

the eight element of an eight tuple must be a tuple

所以我将我的八个元素添加为请求的元组。

问题是现在我得到了这种json格式:(注意结尾的'Rest')

{Item1:"27-09-2011",Item2:"LA",Item3:"armance",Item4:"astrocybernaute",Item5:"P@ssw0rd",Item6:"Admin",Item7,Rest : {Item1 : 26 }}

问题是我不知道如何在我的extjs4商店中访问它。 Item8当然不起作用,Rest不起作用,item1也没有!!

任何想法PLZ?

谢谢你的时间

编辑这是Matt Greer建议后的新店

Ext.define('MyModel', {
extends: 'Ext.data.Model',
fields: [
        { name: 'Item1' },
        { name: 'Item2' },
        { name: 'Item3' },
        { name: 'Item4' },
        { name: 'Item5' },
        { name: 'Item6' },
        { name: 'Item7' },
        { name: 'Item8', mapping: 'Rest.Item1' }
]
 });

 var myStore2 = new Ext.data.JsonStore({
 model: 'MyModel',
 proxy: {
     type: 'ajax',
     url: '',
     autoLoad :true,
     reader: {
         type: 'json'
             } 
        }
 });

但它仍无效

我想指出Store.loadData不尊重字段映射

问题在于,sencha团队改变了loadData的行为,并且它不是以明确的方式记录的内容。

将以下内容添加到您的代码库中(在应用代码上方,但在ext-all.js下方):

Ext.override(Ext.data.Store, {
loadDataViaReader : function(data, append) {
    var me      = this,
        result  = me.proxy.reader.read(data),
        records = result.records;

    me.loadRecords(records, { addRecords: append });
    me.fireEvent('load', me, result.records, true);
}            
});

然后使用:

mystore2.loadDataViaReader(data)

2 个答案:

答案 0 :(得分:1)

我不确定Tuple错误来自哪里。 .NET支持octuples,如here

所示

试一试

var myTuple = Tuple.Create(3,4,5,8,12,4,12,99);

myTuple应该是8个整数的八元组。

但是,如果您仍然遇到该错误并且必须在Ext中解决它,则可以使用映射。您需要定义一个Model,并在Model的字段中使用映射来获取最后一个值:

Ext.define('MyModel', {
    extends: 'Ext.data.Model',
    fields: [
            { name: 'field1' },
            // fields 2 through 7
            { name: 'field8', mapping: 'Rest.Item1' }
    ]
 });

 var myStore = new Ext.data.JsonStore({
    model: 'MyModel',
    // ...
  });

我从未真正尝试过在商店中定义字段,我认为Ext会自动为您创建一个模型。所以你也可以在商店中进行映射。

答案 1 :(得分:1)

当我们使用loadData方法以及使用的代理是Memory代理时,您的解决方案就会运行。

事实上,似乎 EXTJS在内存代理时无法映射数据。但是当它的Ajaxs代理时,它可以映射数据和字段

使用内存代理实例

var fields = [
            {name: 'id', mapping: 'id'},
            {name: 'code', mapping: 'code'},
            {name: 'code', mapping: 'exercice'},
            {name: 'code', mapping: 'code'},
            {name: 'typeDocument', mapping: 'typeDocument'},
            {name: 'utilisateur', mapping: 'editionJobs[0].utilisateur'},
            {name: 'dateCreation', mapping: 'editionJobs[0].dateCreation'},
            {name: 'jobId', mapping: 'editionJobs[0].id'},
            {name: 'avenant', mapping: 'editionJobs[0].avenant'},
            {name: 'etat', mapping: 'editionJobs[0].etat'}
        ];

        var data = [];


        store = new Ext.data.Store({
            fields: fields,
            proxy: {
                type: 'memory',
                reader: {
                    type: 'json',
                    root: 'listDossier'
                }
            },
            listeners: {
                load: function(store, records, options) {
                    store.fireEvent('datachanged', store);
                }
            }
        });

Ext.getCmp('listeEditionDossierGridPanel').getStore().loadDataViaReader(listDossier); // OK, thx for the method ;)
    Ext.getCmp('listeEditionDossierGridPanel').getStore().loadData(listDossier); // Not ok

Ajax Proxy的其他例子:

var fields = [
                {name: 'code', mapping : 'code'},
                {name: 'avis', mapping : 'demande.avis'},
                {name: 'commentaire', mapping : 'demande.commentaire'},
                {name: 'id', mapping: 'demande.id'}
            ];

store = new Ext.data.Store({
                    fields: fields,
                    autoLoad: true,
                    proxy: {
                        type: 'ajax',
                        extraParams: {jsonRequest:JSON.stringify(valeurs)},
                        url : 'chargerDossiersEligibles.do',
                        reader: {
                            type: 'json',
                            root: 'dossiersEligibles'
                        }
                    }
                }); 

在这种情况下,一切都很好,数据可以映射。

干杯

贝努瓦