Trong ứng dụng web ASP.NET của tôi, tôi đang cố gắng tạo ra một cách phổ biến cảnh báo người dùng trước khi điều hướng khỏi biểu mẫu khi họ đã thực hiện thay đổi, bằng cách sử dụng jQuery. Công cụ khá chuẩn, nhưng sau nhiều lần tìm kiếm, tôi vẫn chưa tìm được một kỹ thuật hoạt động.ASP.NET, jQuery, dạng bẩn và window.onbeforeunload
Dưới đây là những gì tôi có vào thời điểm này:
addToPostBack = function(func) {
var old__doPostBack = __doPostBack;
if (typeof __doPostBack != 'function') {
__doPostBack = func;
} else {
__doPostBack = function() {
old__doPostBack();
func();
}
}
}
var isDirty = false;
$(document).ready(function() {
addToPostBack(function() {
alert("Postback detected.")
clearDirty();
});
$(':input').bind("change select keydown", setDirty);
window.onbeforeunload = function(e) {
var msg = "You have unsaved changes. "
if (isDirty == true) {
var e = e || window.event;
if (e) { e.returnValue = msg; }
return msg;
}
};
});
setDirty = function() {isDirty = true;}
clearDirty = function() {isDirty = false;}
này hoạt động như xa như cảnh báo người sử dụng từ hướng đi. Vấn đề là tôi nhận được cảnh báo trên mỗi lần đăng lại cùng một trang. Có một số điều về hình thức của tôi mà có thể gây ra một postback:
- Có Lưu, Hủy bỏ và Xóa linkbuttons trên trang
- Có thể có linkbuttons khác trên trang đó thực hiện chức năng server-side khi ở trên cùng một trang
- Có thể có các điều khiển khác có tính năng tự động khởi động = true cũng có các chức năng phía máy chủ được đính kèm với chúng, nhưng không dẫn đến việc người dùng rời khỏi trang.
Không có điều nào trong số này nên kích động cảnh báo vì người dùng không rời khỏi trang. Mã của tôi cố gắng để cướp addToPostBack (more details on that in this question) để xóa bit isDirty trước khi đăng lại, nhưng vấn đề là trong IE onbeforeunload
cháy trước __doPostBack, rõ ràng vì IE kích hoạt onbeforeunload ngay lập tức khi liên kết được nhấp (as described here).
Tất nhiên, tôi có thể kết nối từng điều khiển để xóa bit wasDirty, nhưng tôi muốn một giải pháp hoạt động ở cấp biểu mẫu và không yêu cầu tôi chạm vào từng điều khiển có thể kích hoạt postback.
Có ai có cách tiếp cận hoạt động trong ASP.NET và không liên quan đến việc kết nối mọi điều khiển có thể gây ra đăng lại không?
Bạn chỉ có thể gian lận và kiểm tra mã nguồn SO để xem họ làm gì. – Powerlord
SO sử dụng beforeunload, nhưng MVC == no postbacks == không có vấn đề cụ thể của Herb. –