为什么在ajax请求上调用abort()会导致ASP.Net MVC(IE8)出错

use*_*867 7 ajax asp.net-mvc jquery

我使用jquery发布到返回信息表的MVC控制器动作.页面的用户通过单击各种链接来触发此操作.

如果用户决定快速连续点击一堆这些链接,我想取消任何以前可能尚未完成的ajax请求.

我发现当我这样做时(尽管客户端的POV很好)我会在Web应用程序上遇到错误

"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"
});
Run Code Online (Sandbox Code Playgroud)

我注意到这只发生在IE8上.在FF中似乎不是一个问题.

有谁知道如何在IE8中取消ajax请求而不会导致MVC错误?

谢谢你的帮助.

kev*_*ner 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(...);
Run Code Online (Sandbox Code Playgroud)

像现在一样保留对最新请求的引用,但不要中止它。相反,OnSuccess 检查传递给它的请求对象是否与“最新请求”相同;如果它们不同,则表明另一个请求已介入,并且该请求会通过。