【问题标题】:Loading json data into jqgrid using setGridParam使用 setGridParam 将 json 数据加载到 jqgrid
【发布时间】:2011-07-25 12:38:23
【问题描述】:

我在使用 setGridParam 设置 jqgrid 的 url 时遇到了一些问题。

我收到消息:“f 未定义”。

我的设置:

       $("#prices").jqGrid({
    colModel: [
           ...
        ],
    pager: jQuery('#pricePager'),
    ajaxGridOptions: { contentType: "application/json" },
    mtype: 'POST',
    loadonce: true,
    rowTotal: 100,
    rowNum: -1,
    viewrecords: true,
    caption: "Prices",
    height: 300,
    pgbuttons: false,
    multiselect: true,
    afterInsertRow: function (rowid, rowdata, rowelem) {
        // ...
    },
    beforeSelectRow: function (rowid, e) {
      // ...
    },
    onSelectRow: function (rowid, status) {
       // ...
    }
}); 

获取数据:

$("#prices").setGridParam({ datatype: 'json', page: 1, url: '@Url.Action("GridDataPrices")', postData: JSON.stringify(selections) });

$("#prices").trigger('reloadGrid');

响应是未编码的 json:

{"total":1,"page":1,"records":100,"rows":[{"id":160602948,"StartDate":"\/Date(1311717600000)\/","Duration":7,"Price":1076.0000,"Code":"code"},{"id":160602950,...}]}

但是,我使用 firebug 收到以下消息:

“f 未定义”

我首先使用 addJSONData 完成了这项工作,但因为我想保留本地排序,所以不得不替换它。

提前致谢。

【问题讨论】:

  • 您可以尝试使用$("#prices").jqGrid('setGridParam', {...}); 而不是$("#prices").setGridParam({...});。您应该将rowNum: -1 替换为rowNum: 10000(一些较大的正数)。我建议您另外使用jquery.jqGrid.src.js 而不是jquery.jqGrid.min.js,直到您没有错误为止。在这种情况下,名称将是可读的(名称“f”什么也没说)。此外,我建议您永远不要使用 afterInsertRow 并改用 gridview:true。它可以显着提高 jqGrid 的性能。
  • 感谢您的回答。我修改了选项并使用源文件来定位确切的问题。消息更加清晰:obj is undefined [Break On This Error] ret = obj[expr];。发生这种情况的地方:getAccessor : function(obj, expr)。还没找到原因。
  • 函数的参数:expr: "setGridParam"。对象显然是问题所在,但由于这是我第一次探索 jQgrid 的源代码,所以不太清楚它应该包含什么。
  • 删除数据类型选项 (datatype: 'json') 会使错误消失,但数据不会加载到网格中。
  • 在哪一行代码中出现错误?您可以在调试器(IE 或 Visual Studio 的开发者工具)中看到这一点。 getAccessor 方法将用于两个 porpoise:1) 从服务器响应中读取 JSON 数据 2) 在 $("#prices").jqGrid('setGridParam',... 对象中的 $("#prices").jqGrid('setGridParam',... 等情况下。您的问题中未包含的代码部分可能存在错误。

标签: jqgrid


【解决方案1】:

上传代码后,一切都会变得清晰。您的主要错误如下:

  • 你应该在 jqGrid 中包含datatype: 'local'。默认值为“xml”。
  • JSON 数据具有命名属性,因此您必须使用 jsonReader: { repeatitems: false }(有关详细信息,请参阅 the documentation
  • 您在colModel 中使用“ArrivalCodeWay”,在 JSON 数据中使用“ArrivalCodeWay”。所以你应该修复相应的jqGrid列的名称
  • 要从"\/Date(1312840800000)\/" 格式解码date,您应该在相应列中包含formatter:'date'
  • 以同样的方式,我发现将formatter:'int', sorttype:'int' 包含在“持续时间”列中,将sorttype:'number', formatter:'number', formatoptions: { decimalPlaces:4, thousandsSeparator: "," } 包含在“价格”列中。
  • 如果您使用JSON.stringify,则应包含json2.js,以确保您的代码适用于所有网络浏览器。

修改后的演示(包括其他一些小改动)你可以找到here。如果你点击“点击我”按钮,网格包含将被加载。

【讨论】:

  • Oleg,感谢您调查我的问题,非常感谢!主要问题是不存在的 JsonReader 选项。 (不知道我经常使用 jqgrid)。关于'datatype:'local'':我相信我在stackoverflow的某个地方读到jqgrid在loadonce为true时自动将数据类型设置为local。
  • @Brecht:jqGrid 将datatype 更改为'local' 在第一次加载后。那么您是否没有定义datatype: 'local' jqGrid 将尝试从url 获取数据并将其解释为'xml' 数据。由于数据格式错误,不会显示任何内容。如果您稍后需要加载数据,您应该手动设置datatype: 'local'。顺便说一句,如果您的主要问题得到解决,您可以将答案标记为“已接受”(有关详细信息,请参阅here)。
  • 奥列格,如果可以的话,我有一个相关的问题。我使用 addJsonData 在网格中填充一些数据。这将禁用本地排序。我可以以与上述相同的方式实现这一点,但是我无法执行服务器调用来获取我的数据,因为我的数据与另一个组件的一些其他数据一起被接收。使用 addJsonData 时是否可以启用本地排序?我已经阅读了your post 关于此事的信息,但除了设置 url 并重新加载网格之外,我没有看到任何其他解决方案。
  • @Brecht:如果我理解你是正确的,你不能修改提供 JSON 数据的服务器代码。当 JSON 数据有附加字段时,这不是问题。 jqGrid 将仅获取您在列中定义的字段并忽略其余字段。可能您可以在单独的问题中更好地描述您的问题。您可以包含从服务器接收到的测试 JSON 数据和您目前使用的 jqGrid。我将尝试回答如何在不使用 addJsonData 的情况下实现填充 jqGrid,以便您可以使用本地数据分页、排序和过滤/搜索。
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2015-08-16
  • 2012-03-22
  • 1970-01-01
相关资源
最近更新 更多