2011-06-09 57 views
3

我有一个wcf服务为大量的报告,返回json数据到我的jqgrid。一切按预期工作。但是,由于每个报表查询都有大量的用户输入,我选择使用与我在服务器上设置的系列“输入模型”相匹配的json字符串。我不想在我的路线中混淆冗长的复杂查询字符串。在jqGrid上设置Url loadBeforeSend

问题:如何添加jqGrid查询字符串参数做我的json字符串我上传到服务器?我试过'loadBeforeSend',但我似乎无法重写ajax url。我无法使用url参数的函数,因为网格参数尚不可用。有任何想法吗?谢谢。

我jqGrid的功能(简称为简洁起见):

function loadGrid() { 
     var tbl = $('#tbl'); 
     tbl.jqGrid({ 
      loadBeforeSend: function() { 
       var ai = { 
        dateFrom: dbDateTime($('#at-datefrom').val()), 
        dateTo: dbDateTime($('#at-dateto').val()), 
        sidx: tbl.getGridParam('sortname'), 
        sord: tbl.getGridParam('sortorder'), 
        page: tbl.getGridParam('page'), 
        rows: tbl.getGridParam('rowNum') 
       }; 
       var newUrl = getBaseURL() + 'ReportingService.svc/report/?json=' + JSON.stringify(ai); 
       tbl.jqGrid().setGridParam({ url: newUrl });//Everything works perfect up to this point. All the values are in my json string and my url is correct. 
      }, 
      url: '', //Empty because I need to override it 
      datatype: 'json', 
      mtype: 'GET', 
      ajaxGridOptions: { contentType: 'application/json' }, 
      loadError: function (xhr, status, error) { alert(status + "" + error); } 
     }).navGrid('#attendance-pager', { edit: false, add: false, del: false }); 
    } 

回答

2

如果您使用mtype: 'GET'和neew只是设置附加参数将被附加到URL,您可以使用jqGrid的postData参数。如果将postData定义为函数,则将获得最佳结果(有关详细信息,请参见here)。

还有一个方法是使用beforeRequest其中this将被设置到电网DOM元素,你可以为每个this.p.url访问(如果需要改变)的jqGrid的url参数。您当然可以使用$(this).jqGrid('setGridParam','url',yourNewUrl);而不是直接更改this.p.url

我不建议你在你的情况下使用datatype作为函数。顺便说一下,如果使用datatype作为功能,则不能使用beforeRequest

+0

为什么你不推荐使用数据类型函数?到目前为止,它一直在为我工作。感谢Oleg。 – trevorc 2011-06-14 20:52:24

+0

@nameEqualsPNamePrubeGoldberg:您的问题的答案可能会很长。这种方式有许多缺点。主要原因是有更直接的方式,你不使用。你的问题就像一个问题,为什么你应该使用钥匙到门上,而不是使用窗口。答案是:因为你有门的钥匙,而门是通过门设计的方式。这是最直接和最简单的方法。你之前通过窗户进入了房子,它工作。好的,但通过窗户的方式只能用于极端情况,而不能用于有序情况。 – Oleg 2011-06-14 21:01:57

+0

@nameEqualsPNamePrubeGoldberg:jqGrid旨在读取XML数据和几乎任何类型的JSON数据。如果你有其他类型的数据,你应该使用数据类型作为函数。 – Oleg 2011-06-14 21:05:59

0

我讨厌回答我的问题,但这个answer马修提供完美的作品。这个问题有点模棱两可,但无论如何。

简而言之,您需要从'datatype'参数中调用外部ajax函数。因为jqGrid现在被加载(尽管没有任何数据),你可以从用户输入(即记录集的页面3,'desc'等)捕获参数数据并将其添加到你的json字符串中。

这使得您的服务中一个真正简单的uri路线。希望这可以帮助某人。