UpdatePanel thay thế hoàn toàn nội dung của bảng cập nhật trên một bản cập nhật. Điều này có nghĩa là những sự kiện bạn đã đăng ký không còn được đăng ký vì có các yếu tố mới trong bảng cập nhật đó.
Những gì tôi đã làm để giải quyết vấn đề này là đăng ký lại các sự kiện tôi cần sau mỗi lần cập nhật. Tôi sử dụng $(document).ready()
cho tải ban đầu, sau đó sử dụng Microsoft PageRequestManager
(có sẵn nếu bạn có bảng cập nhật trên trang của mình) để đăng ký lại mỗi bản cập nhật.
$(document).ready(function() {
// bind your jQuery events here initially
});
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function() {
// re-bind your jQuery events here
});
Các PageRequestManager
là một đối tượng javascript đó là tự động có sẵn nếu một bảng cập nhật là trên trang. Bạn không cần phải làm gì khác ngoài mã ở trên để sử dụng nó miễn là UpdatePanel có trên trang.
Nếu bạn cần kiểm soát chi tiết hơn, sự kiện này chuyển các đối số tương tự như cách các sự kiện .NET được truyền đối số (sender, eventArgs)
để bạn có thể thấy điều gì đã nêu lên sự kiện và chỉ liên kết lại nếu cần.
Đây là phiên bản mới nhất của tài liệu từ Microsoft: msdn.microsoft.com/.../bb383810.aspx
Một tùy chọn tốt hơn mà bạn có thể có, tùy thuộc vào nhu cầu của bạn, là sử dụng jQuery .on()
. Các phương pháp này hiệu quả hơn so với đăng ký lại các phần tử DOM trên mỗi bản cập nhật. Đọc tất cả các tài liệu trước khi bạn sử dụng phương pháp này, tuy nhiên, vì nó có thể hoặc không thể đáp ứng nhu cầu của bạn. Có rất nhiều plugin jQuery sẽ không hợp lý để tái cấu trúc để sử dụng .delegate()
hoặc .on()
, vì vậy, trong những trường hợp đó, tốt hơn hết bạn nên đăng ký lại.