ExtJS4 - 在ASP.NET中重新配置网格 - JSON结构问题

时间:2012-03-20 14:58:06

标签: asp.net json grid extjs4

ASP.NET的安全功能之一被证明是一个可扩展的山峰 - 当我尝试动态重新配置网格面板时,返回JSON响应时添加“d”属性似乎令人困惑,导致它失败时试图生成新的列结构。

我遵循了nicholasnet的这个解决方案: http://www.sencha.com/forum/showthread.php?179861-Dynamic-grid-columns-store-fields

并且它可以很好地工作,直到JSON有效负载包裹在“d”属性中,例如

{"d":{
    "metaData": {
        "root": "data",
        "fields": [{
            "type": "int",
            "name": "id",
            "hidden": true,
            "header": "id",
            "groupable": false,
            "dataIndex": "id"
        }, ...omitted for brevity...]
    },
    "success": true,
    "data": [{
        "id": "1",
        "controller": "Permissions",
        "description": "Allow to see permission by roles",
        "administrator": true,
        "marketing": false
    }]
  }  
}

我无法弄清楚如何告诉ExtJS绕过这个问题。 我尝试将AJAX阅读器的“root”属性设置为"d.data",但这会导致网格显示正确的行数但根本没有数据。

我已经在JSON中列元数据("name", "header", "dataIndex")所需的所有属性描述符,所以我不认为JSON结构是原因。我目前的主要领导是在事件处理程序上:

    store.on
({
    'load' :
    {
         fn: function(store, records, success, operation, eOpts)
        {
            grid.reconfigure(store,store.proxy.reader.fields);
        },
        scope: this
   }
},  this);  

当我传递“d”包装的JSON时,fields部分中的historyStore.proxy.reader.fields未定义。任何人对于为什么会这样或如何解决这个问题都有任何想法?

编辑:我的商店/代理

Ext.define('pr.store.Store-History', {
    extend: 'Ext.data.Store',
    model: 'pr.model.Model-History',
    proxy: {

        type: 'ajax',
        url: '/data/history.json',
        reader: {
            type: 'json',
            root: 'd'
        }
}
});

1 个答案:

答案 0 :(得分:1)

Ext.define('pr.store.Store-History', {
    extend: 'Ext.data.Store',
    model: 'pr.model.Model-History',
    proxy: {

        type: 'ajax',
        url: '/data/history.json',
        reader: {
            type: 'json',
            root: 'data',
            readRecords: function(data) {
                //this has to be before the call to super because we use the meta data in the superclass readRecords
               var rootNode = this.getRoot(data);
               if (rootNode.metaData) {
                   this.onMetaChange(rootNode.metaData);   // data used to update fields
               }

              /**
               * @deprecated will be removed in Ext JS 5.0. This is just a copy of this.rawData - use that instead
               * @property {Object} jsonData
               */
              this.jsonData = rootNode;
              return this.callParent([rootNode]);    // data used to get root element and then get data from it
          },
        }
    }
});

<强>更新 您没有在阅读器中获取字段,因为从数据获取字段的默认代码无法处理您的包装数据,因此您需要更改“readRecords”函数来处理您的自定义数据