在我的ASP.NET Web應用程序中,我試圖創建一種通用的方式來警告用戶,然後再導入表單jQuery的。相當標準的東西,但經過大量的搜索,我還沒有找到一種可行的技術。ASP.NET,jQuery,髒表單和window.onbeforeunload
這裏是我在這一點上:
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;}
這工作就從警告離開頁面的用戶。問題是我在每個相同頁面的回發中收到警告。有一些關於我的形式的東西,可能會觸發回發:
- 有保存,取消,並在頁面上刪除了LinkButton
- 有可能是頁面上的其他了LinkButton是執行服務器端功能同時停留在同一頁面
- 可能還有其他autopostback = true的控件也具有附加的服務器端功能,但不會導致用戶離開頁面。
這些東西都不會引發警告,因爲用戶不會離開頁面。我的代碼嘗試劫持addToPostBack(more details on that in this question)以在回發之前清除isDirty位,但問題在於IE_onbeforeunload
在__doPostBack之前觸發,顯然是因爲IE在單擊鏈接時立即在未加載的情況下觸發(as described here)。
當然,我可以連接這些控件中的每一個來清除isDirty位,但我更喜歡在表單級別上運行的解決方案,並且不需要我觸摸每一個可能觸發回發。
有沒有人有辦法在ASP.NET中工作,並不涉及每個控件可能會導致回發?
你可以只是作弊和檢查SO源代碼,看看他們做什麼。 – Powerlord 2009-08-05 18:49:52
SO使用beforeunload之前,但它的MVC ==沒有回傳==沒有Herb的特殊問題。 – 2009-08-05 19:08:57