这真的让我挠头。即是因为它仅在IE中发生,而不在Firefox中发生,而且我给人的印象是jQuery实际上是浏览器无关的。在过去的几个小时中,我一直在研究这个问题,至少已经确定了正在发生的事情。
这个jqGrid:
$("#DocumentListByPartRecordsGrid").jqGrid(
{
datatype: 'local',
colNames: ['<b>Id</b>', '<b>Document Name</b>', '<b>Document Type</b>', '<b>Effective Date</b>', '<b>Expiration Date</b>', '<b>Delete</b>'],
colModel: [
{ name: 'ASSOCIATION_ID', Index: 'ASSOCIATION_ID', resizable: true, align: 'left', hidden: true, sortable: false },
{ name: 'FILE_NAME', Index: 'FILE_NAME', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'DOCUMENT_TYPE', Index: 'DOCUMENT_TYPE', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'EFFECTIVE_DATE', Index: 'EFFECTIVE_DATE', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'EXPIRATION_DATE', Index: 'EXPIRATION_DATE', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'Delete', Index: 'Delete',resizable: true, align: 'center', sortable: false, width:'20%' },
],
rowNum: 15,
rowList: [15, 50, 100],
imgpath: '/Drm/Content/jqGrid/steel/images',
viewrecords: true,
height: 162,
loadui: 'block',
forceFit: true
});
由该功能填充:
var mydata = '';
<% if(!string.IsNullOrEmpty(Model.PCAssociatedDocuments)) { %>
var mydata = <%= Model.PCAssociatedDocuments %>;
<% } %>
for (var i = 0; i <= mydata.length; i++){
jQuery("#DocumentListByPartRecordsGrid").addRowData(i, mydata[i], "last");
}
这是从模型中干净填充的。这不是问题。使用删除功能时会出现问题,该删除功能在控制器中的格式如下:
<a class='deleteAttachment' style='cursor: pointer;' href='#' onclick='javascript:PCDocumentDelete(" + s.AssociationId.ToString() + ", " + pcId + ");'>Delete</a>
并调用此函数
function PCDocumentDelete(id, pcid) {
if (confirm("Are you sure you want to delete this document?")) {
$.blockUI({
message: "Working...",
css: {
background: '#e7f2f7',
padding: 10
}
});
$.ajax(
{
url: '/DRM/Pc/DeleteAssociation?associationId=' + id + '&pcid=' + pcid,
async: true,
dataType: "json",
success: function(result) {
if (result.Success == true) {
//Reload grid
$.ajax({ async: false });
$("#DocumentListByPartRecordsGrid").setGridParam({ url: "/Drm/Pc/DeAssociatePartRecordsWithDocument?pcid=" + pcid, datatype: 'json', myType: 'GET', page: 1 });
$("#DocumentListByPartRecordsGrid").trigger("reloadGrid");
$.unblockUI();
$.showGlobalMessage('Specified document has been successfully disassociated from this part record.');
}
else {
$.unblockUI();
$.showGlobalMessage('An error occurred deleting the attachment.');
}
},
error: function(res, stat) {
alert(res.toString());
alert(stat.toString());
}
});
return false;
}
else {
return false;
}
}
(showGlobalMessage是一个内部函数,可创建格式特别的blockUI)
Ajax在控制器中调用了一个方法,但是问题在我们做得那么远之前就出现了,因此除非有人认为它很重要,否则我不会发布该代码。通常由于种种原因,发生的事情是,调用PC / DeleteAssociation的第一个ajax突发以304(未修改)响应返回。我知道,当没有任何变化需要刷新时,就会发生这种情况。但这不是一个收获,应该将其视为帖子,而且我的印象是,除非另有指示,否则jquery.ajax旨在不生成304个响应。我显然在这里错过了一些东西,而且盯着它看得太久了,以至于无法自己抓住它。有人看到我错过了吗?谢谢。
我看不到,您将ajax请求指定为POST。所以基本上添加:
$.ajax({ type: 'POST' });
如果仍然失败(由于某些浏览器AJAX怪异),则可以尝试设置cache: false
:
$.ajax({ type: 'POST', cache: false });
顺便说一句,所有缓存:false会在请求URL中添加一些随机内容。
编辑1:
关于
...而且我的印象是,除非另有指示,否则jquery.ajax旨在不生成304个响应
jQuery在这里没有生成任何响应。304标头只是一个HTTP标头。HTTP AJAX请求是普通的HTTP请求,并且可以返回任何有效的头。如果服务器以304响应,则XHR对象将简单地提供来自服务器的本地缓存响应。但是,对用户来说完全透明。
编辑2:
删除了有关防止缓存的建议。在我看来就像伏都教。
编辑3:
再次添加该位,因为显然有必要。环顾网络,IE似乎在某种程度上非法缓存了AJAX POST。
- 始终使用POST来调用修改状态的方法,而不是GET。在这种情况下,这足以防止IE缓存请求。
- IE会积极地缓存ajax请求(请参阅http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/和https://blog.httpwatch.com/2009/08/07/ajax-caching-两个重要事实/)。为防止这种情况,您可以:
- 添加缓存清除参数
($.ajaxSetup({ cache: false });
会自动执行此操作。 - 始终使用POST请求(在大多数情况下可能不合适)。
- 打开AJAX请求服务器端的缓存头。第一个链接演示了如何在groovy中使用它。类似的方法应适用于任何框架。
- 添加缓存清除参数
缓存清除是解决方案!
在我的情况下,应用程序使用带有自定义标头的单个服务调用作为代理,以将浏览器桥接到服务器的私有部分(每个调用都到达相同的url,但是使用自定义标头告诉代理服务将哪个服务传递给传递给)。在Chrome和FF上一切正常,但IE始终从页面上的首次调用返回数据。jQuery.ajax中的cache = false选项是修复程序,因为IE只是查看了被调用的同一url,甚至没有理会是否使用了任何自定义标头,或者是否甚至在体内传递了不同的数据,并且说“哦,我知道这个,在这里..”,并回了第一通电话的回复。使用缓存清除技术,URL看起来与IE不同,因此它通过IE发送。
文章标签:ajax , http-status-code-304 , jquery
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!