jqGrid + POST +默认参数+ serializedGridData

时间:2014-12-07 05:39:46

标签: json mongodb post jqgrid payload

我需要从期望URL +参数+序列化有效负载的服务器(即消息体)加载网格。我正在使用POST方法,服务器期望这与JSON有效负载一起使用。

序列化有效负载是MongoDB的JSON字符串,它指示mongo如何查找我们关心的数据。我设计RESTful接口以jq格式响应,jqGrid期望使用分页,我希望jqGrid将“page”,“rows”等的值附加为查询字符串:{{1} }

这是我的网格设置

baseURL?rows=10&page=1

我在这里留下了一些东西来展示我的尝试。我尝试使用serializedGridData函数更新URL,没有运气,无论出于什么原因它似乎被忽略。 我在请求之前尝试更新URL,但仍然没有运气。

最初我只是设置postData =序列化数据,假设仍会附加默认的分页参数。事实并非如此。

postData的文档只是说“查看操作的API方法”没有链接(没有链接在WIKI ?? !!!来吧!!)

我已经阅读了我在这里找到的每一个Oleg答案,似乎没有解决这个场景,我觉得很难理解,这一定是一个非常常见的用例。

这就是我的服务器如何响应初始数据请求(不需要分页)

   grid.jqGrid({
       ajaxGridOptions: {
           contentType: "application/json",
       },
       altRows: true,
       autoWidth: true,
       caption: "Results for " + ADC_Idl.buildQueryTitle(),
       colNames: displayNames,
       colModel: columnModel,
       datatype: "json",
       height: "auto",
       mtype: "POST",
       pager: '#pager5',
       //postData: ADC_Idl.buildQueryPayload(),
       serializeGridData: function (postData) {
           grid.jqGrid("setGridParam", "url", ADC_Idl.buildQueryURL() + "?" + jQuery.param(postData));
           return ADC_Idl.buildQueryPayload();
       },
       beforeRequest: function() {
           grid.jqGrid("setGridParam", "url", ADC_Idl.buildQueryURL() + "?page=" +
                       grid.jqGrid("getGridParam", "page") + "&rows=" +
                       grid.jqGrid("getGridParam", "rowNum") );                                          
       },
       rowList: [10, 20, 30],
       rowNum: 10,
       url: ADC_Idl.buildQueryURL(),
       viewrecords: true,
       jsonReader: {
           repeatitems: false
       }

为简洁而截断。

经过三天尝试我能想到的一切,我正在恳求一些jqGrid专家帮忙!!

谢谢!

更新

想出来,奥列格的评论让它变得更好。张贴为答案!

1 个答案:

答案 0 :(得分:0)

我发布这个问题后几乎立刻就发现了StackOverflow的另一篇文章,

的jqGrid( “setGridParam” ... 设置然后获取格式不同,它除了更新的哈希与get ... UGH的参数列表之外。

一旦我修好了,就行了!

使用Oleg的一些建议(谢谢!)我有一个更好的解决方案,因为代码更清晰,感觉更少hacky。

  grid.jqGrid({                                                             
        ajaxGridOptions: {
            contentType: "application/json",
        },
        altRows: true,
        autoWidth: true,
        caption: "Results for " + ADC_Idl.buildQueryTitle(),
        colNames: displayNames,
        colModel: columnModel,
        datatype: "json",
        height: "auto",
        gridview: true,
        mtype: "POST",
        pager: '#pager5',
        postData: ADC_Idl.buildQueryPayload(),
        beforeRequest: function() {
            var gridParameters = jQuery(this).jqGrid("getGridParam");
            var baseURL = gridParameters.url.split("?").shift();
            var queryString = {
                page: gridParameters.page,
                rows: gridParameters.rowNum
            };

            gridParameters.url = baseURL + "?" + jQuery.param( queryString );
        },
        rowList: [10, 20, 30],
        rowNum: 10,
        url: ADC_Idl.buildQueryURL(),
        viewrecords: true,
        jsonReader: {
            repeatitems: false,
            id: "_id"
        }
    });

相关部分是:

  • postData:我用它来让jqGrid调用我的有效负载构建器,它返回JSON.stringify(有效负载对象)
  • beforeRequest:使jqGrid获取用于定义网格的url并删除已附加的任何params,然后使用最新的页面和行值更新它们。
  • jasonReader:添加了“id:”_ id“,因为这是mongodb用于id的关键。
  • gridview:true - 这显然是网格显示的速度? Oleg推荐,我做到了,他在这里有一篇非常详细的文章:Oleg's explaination of gridview: true

还建议我提供我的colModel,但我不能,这个代码用于在用户提交针对mongodb的查询时动态构建jqGrid。网格是作为对用户输入的响应而构建的,因此它不是我必须共享的内容。