2010-05-27 35 views
7

Tôi sử dụng jquery để gửi đến một hành động điều khiển MVC trả về một bảng thông tin. Người dùng của trang kích hoạt điều này bằng cách nhấp vào các liên kết khác nhau.Tại sao gọi abort() trên ajax yêu cầu gây ra lỗi trong ASP.Net MVC (IE8)

Trong trường hợp người dùng quyết định nhấp vào một loạt các liên kết này liên tiếp nhanh chóng, tôi muốn hủy mọi yêu cầu ajax trước đó có thể chưa hoàn tất.

Tôi đã thấy rằng khi tôi làm điều này (mặc dù tốt đẹp của nó từ POV của khách hàng) tôi sẽ nhận được lỗi trên ứng dụng web nói rằng

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

Bây giờ bài ajax deffinately đi trong tất cả các các thông số, và nếu tôi không thử và hủy bỏ yêu cầu ajax, nó hoạt động tốt.

Nhưng nếu tôi hủy yêu cầu bằng cách gọi hủy bỏ() trên đối tượng XMLHttpRequest mà ajax() trả về trước khi kết thúc, tôi nhận được lỗi từ ASP.Net MVC.

Ví dụ:

//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" 
}); 

Tôi đã nhận thấy điều này chỉ xảy ra là IE8. Trong FF nó dường như không cuase một vấn đề.

Có ai biết cách hủy yêu cầu ajax trong IE8 mà không gây ra lỗi cho MVC không?

Cảm ơn bạn đã được trợ giúp.

Trả lời

3

IE có thể đang gửi một phần cơ quan yêu cầu đến máy chủ trước khi hủy, cung cấp cho máy chủ đủ yêu cầu để bắt đầu xử lý, nhưng không phải tất cả các thông số cần thiết. Bạn có thể kiểm tra điều này bằng cách nhìn vào hoạt động của IE trong một proxy (như fiddler) --- nếu bạn nhận được một phần của yêu cầu, thì IE đang xử lý các lỗi abort(). Nếu trường hợp đó xảy ra, bạn có thể muốn kết thúc yêu cầu AJAX cũ và chỉ ngăn OnSuccess thực hiện bất kỳ điều gì, thay vì hủy bỏ nó.

EDIT:

var req; // current/latest request 

var OnSuccess = function(data, textStatus, XMLHttpRequest) { 
    if (XMLHttpRequest != req) return; 
    // latest request has succeeded 
} 

req = $.ajax(...); 

Giữ một tham chiếu đến các yêu cầu mới nhất, như bạn làm bây giờ, nhưng không hủy bỏ nó. Thay vào đó, OnSuccess kiểm tra xem đối tượng yêu cầu được truyền cho nó có giống với "yêu cầu mới nhất" hay không; nếu chúng khác nhau, một yêu cầu khác đã can thiệp và nó đã qua.

+0

Tôi nghi ngờ bạn là chính xác. Nhưng tôi không chắc chắn làm thế nào để viết lại mã JS của tôi để OnSuccess được bỏ qua cho các yêu cầu hủy bỏ nhưng chạy cho các yêu cầu không bị hủy bỏ. Ông có thể cho tôi một ví dụ? – user169867

+0

Tôi thích nó. Tôi nghĩ rằng sẽ làm việc. Cảm ơn nhiều! – user169867

+0

Không sao cả! Hy vọng nó hoạt động ra ngoài. – kevingessner

Các vấn đề liên quan