2010-05-27 80 views
7

错误我使用jQuery来发布到MVC控制器操作,返回一个信息表。该页面的用户通过点击各种链接触发。为什么在AJAX请求调用abort()会导致ASP.Net MVC(IE8)

如果用户决定快速连续单击这些链接的一堆,我想取消任何以前的ajax请求,可能还没有完成。

我发现,当我做到这一点(虽然从客户的POV其罚款)我会在Web应用程序的错误说

"The parameters dictionary contains a null entry for parameter srtCol of non-nullable type 'System.Int32'"

现在阿贾克斯后deffinately通过在所有的参数,如果我不尝试并取消ajax请求,它工作得很好。

但是,如果我通过调用ajax()在完成前返回的XMLHttpRequest对象上的abort()来取消请求,我会从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的错误?

感谢您的任何帮助。

回答

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

+0

我怀疑你是对的。但我不确定如何重写我的JS代码,以便中止请求时忽略OnSuccess,但为未中止的请求运行。你能举个例子吗? – user169867 2010-06-03 19:52:00

+0

我喜欢它。我认为这将起作用。非常感谢! – user169867 2010-06-04 17:19:32

+0

没问题!希望它能解决问题。 – kevingessner 2010-06-04 17:33:05

相关问题