Trong vòng Application_Error, bạn thực sự có thể truy cập ScriptManager để xác định xem yêu cầu hiện tại có phải là một postback không đồng bộ hay không. Đối tượng toàn cục HttpContext.Current.Handler thực sự trỏ đến trang đang được bảo trì, chứa đối tượng ScriptManager, nó sẽ cho bạn biết nếu yêu cầu hiện tại là không đồng bộ.
Tuyên bố sau đây xác minh họa làm thế nào để truy cập vào các đối tượng ScriptManager và nhận được thông tin này:
ScriptManager.GetCurrent(CType(HttpContext.Current.Handler, Page)).IsInAsyncPostBack
Tất nhiên, tuyên bố rằng sẽ thất bại nếu các yêu cầu hiện tại không phải dành cho một trang, hoặc nếu không có ScriptManager trên trang hiện tại, vì vậy đây là một cặp mạnh mẽ hơn các chức năng bạn có thể sử dụng bên trong Global.asax để làm cho việc xác định:
Private Function GetCurrentScriptManager() As ScriptManager
'Attempts to get the script manager for the current page, if there is one
'Return nothing if the current request is not for a page
If Not TypeOf HttpContext.Current.Handler Is Page Then Return Nothing
'Get page
Dim p As Page = CType(HttpContext.Current.Handler, Page)
'Get ScriptManager (if there is one)
Dim sm As ScriptManager = ScriptManager.GetCurrent(p)
'Return the script manager (or nothing)
Return sm
End Function
Private Function IsInAsyncPostback() As Boolean
'Returns true if we are currently in an async postback to a page
'Get current ScriptManager, if there is one
Dim sm As ScriptManager = GetCurrentScriptManager()
'Return false if no ScriptManager
If sm Is Nothing Then Return False
'Otherwise, use value from ScriptManager
Return sm.IsInAsyncPostBack
End Function
Chỉ cần gọi IsInAsyncPostback() từ bên trong Application_Error để có được một boolean chỉ ra hiện trạng .
Bạn nhận được lỗi ASP.NET chung tại máy khách vì cố gắng chuyển/chuyển hướng yêu cầu async sẽ tạo ra nhiều lỗi hơn, thay thế và do đó làm xáo trộn lỗi ban đầu. Bạn có thể sử dụng mã ở trên để ngăn việc chuyển hoặc chuyển hướng trong các trường hợp như vậy.Cũng lưu ý một khám phá khác mà tôi đã thực hiện: Mặc dù bạn có thể truy cập đối tượng ScriptManager bằng phương pháp này, vì một số lý do thiết lập thuộc tính AsyncPostBackErrorMessage của nó từ bên trong Application_Error không hoạt động. Giá trị mới không được chuyển cho khách hàng. Do đó, bạn sẽ vẫn cần xử lý sự kiện OnAsyncPostBackError của ScriptManager trong lớp trang.
http://www.codedigest.com/Articles/ASPNETAJAX/115_Error_Handling_in_ASPNet_Ajax_Applications.aspx –
Rất tiếc, chúng tôi đã sử dụng AllowCustomErrorsRedirect = false và cung cấp AsyncPostBackErrorMessage. Vì vậy, tôi không thấy bài viết có liên quan như thế nào. Đã cập nhật câu hỏi để bao gồm việc sử dụng trình xử lý OnAsyncPostBackError. – BlueFox