4

我对这个出色的 jqgrid 插件以及我尝试将它与 WCF 数据服务(不是真的,但非常相似的 odata4j 服务)一起使用时遇到了一点问题。顺便说一句,如果有人正在考虑将 jqgrid 与 odata 服务一起使用,请给我发邮件,我找到了难题的答案,例如,如何配置网格 xmlreader 以读取 odata xml 结构,从而击败 jquery 命名空间搜索问题(提示:

包括jquery.xmlns.js

.....
$.xmlns.m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
$.xmlns.d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
.....
var feedXmlReaderOptions = {
    root: "feed",
    row: "entry",
    repeatitems: false,
    id: "feed>entry>id"
};
....
    colModel: [
    {
        name: "clmNumKey", 
        index: "clmNumKey", 
        width: 150, 
        xmlmap: "d|clmNum",
        editable: true
    }
    ....
)

无论如何,问题在于 odata 服务需要处理编辑操作(DELETE、PUT、MERGE)的方法作为普通 POST 上的自定义请求标头发送,而不是作为 http 方法。原因似乎是大多数防火墙不允许 PUT 和 DELETE http 方法通过,因为这就是您可以例如在服务器上放置新文件以及删除文件的方式,以防您猜到有效路径。长话短说……内联或表单编辑不会触发 loadBeforeSend 事件……我可以看到它是在网格的完整数据请求上触发的,但我只有在serializeEditData从编辑表单提交时才会触发该事件。我很担心,因为我进入了 jqgrid 源文件 ( grid.formedit.js,grid.inlineedit.js)并且我无法使用 beforesend 关键字获得任何点击,只有 serializeeditdata 显示在那里。我错过了什么吗?xhr还有另一种方法可以在网格使用的 ajax 对象上设置我需要的标题吗?该xhr对象是否被网格暴露?

下面你有我必须处理编辑事件的代码......再次, loadBeforeSend 没有被触发......

提前谢谢你,塞尔班

$.extend($.jgrid.edit, {
    closeAfterEdit: true,
    closeAfterAdd: true,
    ajaxEditOptions: {
        contentType: "application/json"
    },
    mtype: 'POST',
    loadBeforeSend: function(xhr)
    {
        xhr.setRequestHeader("X-HTTP-Method", "MERGE");
        return xhr;
    },        
    serializeEditData: function (data) {
        delete data.oper;
        return JSON.stringify(data);
    }
});                                                  
4

1 回答 1

3

没有loadBeforeSend可以设置的参数$.jgrid.edit。的值定义了editGridRow$.jgrid.edit的默认选项

要指定loadBeforeSend在相应的 Ajax 请求期间应该使用的回调,您应该使用ajaxEditOptions并指定beforeSend(参见$.ajax):

$.extend($.jgrid.edit, {
    closeAfterEdit: true,
    closeAfterAdd: true,
    ajaxEditOptions: {
        contentType: "application/json",
        beforeSend: function (jqXHR, settings) {
            jqXHR.setRequestHeader("X-HTTP-Method", "MERGE");
        }
    },
    //mtype: 'POST', - it's already default
    serializeEditData: function (data) {
        delete data.oper;
        return JSON.stringify(data);
    }
});
于 2012-04-23T20:08:37.940 回答