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

时间:2010-05-27 15:54:00

标签: jquery asp.net-mvc ajax

我使用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错误?

感谢您的帮助。

1 个答案:

答案 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检查传递给它的请求对象是否与“最新请求”相同;如果它们不同,另一个请求已经介入,它就会通过。