我使用jquery发布到返回信息表的MVC控制器操作。页面的用户通过单击各种链接来触发此操作。
如果用户决定快速连续点击一堆这些链接,我想取消之前可能尚未完成的任何ajax请求。
我发现当我这样做时(尽管客户端的POV很好)我会在网络应用程序上遇到错误
"The parameters dictionary contains a null entry for parameter srtCol of non-nullable type 'System.Int32'"
现在ajax帖子确实传递了所有参数,如果我不尝试取消ajax请求它就可以了。
但是如果我通过在XMLHttpRequest对象上调用abort()取消请求,ajax()在完成之前返回,我从ASP.Net MVC得到错误。
示例:
//Cancel any pevious request
if (req)
{
req.abort();
req = null;
}
//Make new request
req = $.ajax({
type: 'POST',
url: "/Myapp/GetTbl",
data: {srtCol: srt, view: viewID},
success: OnSuccess,
error: OnError,
dataType: "html"
});
我注意到这只发生在IE8上。在FF中,它似乎不是一个问题。
有没有人知道如何在IE8中取消ajax请求而不会导致MVC错误?
感谢您的帮助。
答案 0 :(得分:3)
IE可能会在中止之前将部分请求主体发送到服务器,从而为服务器提供足够的开始处理请求,但不是所需的所有参数。您可以通过查看代理中的IE活动(如fiddler)来检查这一点 - 如果您收到请求的一部分,那么IE正在严重处理abort()
。如果是这种情况,您可能希望让旧的AJAX请求完成,并且只是阻止其OnSuccess执行任何操作,而不是中止它。
编辑:
var req; // current/latest request
var OnSuccess = function(data, textStatus, XMLHttpRequest) {
if (XMLHttpRequest != req) return;
// latest request has succeeded
}
req = $.ajax(...);
像现在一样保留对最新请求的引用,但不要中止它。相反,OnSuccess检查传递给它的请求对象是否与“最新请求”相同;如果它们不同,另一个请求已经介入,它就会通过。