为每个jqGrid ajax调用添加参数

时间:2012-05-29 09:55:19

标签: jquery asp.net-mvc jqgrid

当页面上有一个jqGrid时,我想扩展它以传递一个额外的参数。到目前为止我的最佳尝试:

...
    $('[role=grid]').jqGrid('setGridParam', { 'serializeGridData':MyGridOnBeforeRequest });

    function MyGridOnBeforeRequest (postData) {
        var newPostData = $.extend(postData, {
            specialParam: "foo"
        });
        return $.param(newPostData);
    }
...

我这样做是因为看起来jqGrid忽略了你对jQuery的ajax处理做的任何改变。

感谢。

2 个答案:

答案 0 :(得分:3)

一般情况下,您发布的代码应该可以使用,而会在下一个网格重新加载时使用新的serializeGridData

你发布的方式使用serializeGridData只是有点奇怪。改为使用postData参数就足够了:

var postData = $('#grid').jqGrid('getGridParam', "postData");
$.extend(postData: {specialParam: "foo"});

此外,在原始代码中,您使用$.extend(postData, {specialParam: "foo"}); 修改原始postData。这不错,但一般来说代码

function myGridOnBeforeRequest (postData) {
    return $.extend({}, postData, {specialParam: "foo"});
}

甚至

function myGridOnBeforeRequest (postData) {
    return $.extend(true, {}, postData, {specialParam: "foo"});
}

会更干净。实际上并不需要使用$.param。如果你返回一个对象,那么jQuery.ajax会自动为你调用$.param

另一种非常常见的方法是使用postData参数直接定义网格,该参数类似于

postData: {
    specialParam: function () { return "foo"; }
}

在您可以在函数中实现更多逻辑的方式中,您可以使用函数体内部外部scote中的一些变量,或者从页面上现有的控件中获取一些值(请参阅here以获取细节)。如果您可以在不使用specialParam的情况下实施动态 getGridParam

最后一句话。已经从myGridOnBeforeRequest的颜色(将其与您问题中的MyGridOnBeforeRequest的颜色进行比较)可以看出它将以另一种方式进行解释。如果函数的名称以大写字母开头,则表示与您定义新类MyGridOnBeforeRequest构造函数的常用名称转换相对应。您必须将其用作var test = new MyGridOnBeforeRequest();:使用new。只需与var now = new Date();进行比较。严格建议保留标准的JavaScript名称转换。

答案 1 :(得分:1)

如果某些设置不会发生太大变化,可以将其添加到 $.jgrid.defaults使用类似的内容

function getSpecialParam()
{
    return 'foo';
}
$.jgrid.defaults = $.extend($.jgrid.defaults,
    {
        postedData:{
            specialParam:getSpeicalParam
        }
    });