我对这个出色的 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);
}
});