ASP.NET, jQuery, dirty-Formulare und Fenster.onbeforeunload
In meinem ASP.NET web-app, die ich versuche zu schaffen, eine Universelle Art und Weise der Warnung der Anwender vor der Navigation Weg von der einen form, wenn Sie änderungen vorgenommen haben, mithilfe von jQuery. Ziemlich standard Sachen, aber nach viel recherche habe ich noch eine Technik finden, die funktioniert.
Hier ist, was ich an dieser Stelle:
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;}
Diese arbeiten so weit als Warnung der Benutzer von der Navigation Weg. Das problem ist, dass ich die Warnung auf jeder derselben-Seite postback. Es gibt eine Reihe von Dingen auf meine Formulare, die möglicherweise auslösen eines Postbacks:
- Es Speichern, Abbrechen und Löschen, die linkbuttons auf der Seite
- Kann es andere linkbuttons auf der Seite das ausführen von server-side-Funktionen, während Sie auf der gleichen Seite
- Kann es andere Steuerelemente mit autopostback=true, die haben auch server-side-Funktionen mit Ihnen verbunden, aber die führen nicht dazu, dass der Benutzer die Seite verlassen.
Keines dieser Dinge sollte provozieren eine Abmahnung, weil der Benutzer nicht die Seite verlassen. Mein code versucht zu entführen addToPostBack ( mehr details auf, dass in dieser Frage ), deaktivieren Sie die isDirty-bit-vor dem posten zurück, aber das problem ist, dass im IE onbeforeunload
feuert, bevor die __doPostBack-anscheinend, weil der IE feuert onbeforeunload sofort, wenn ein link angeklickt wird (wie hier beschrieben).
Natürlich, ich könnte den Draht bis jedes dieser Steuerelemente zu deaktivieren Sie die isDirty-bit, aber ich würde es vorziehen, eine Lösung, die arbeitet auf der form-Ebene und verlangt nicht, dass ich berühre, jedes einzelne Steuerelement ein postback auslösen könnte.
Hat jemand einen Ansatz, funktioniert in ASP.NET und die, die nicht die Verdrahtung von jeder Steuerung, die verursachen könnten ein postback?
InformationsquelleAutor der Frage Herb Caudill | 2009-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stieß ich auf diesen Beitrag beim Googeln nach einer Lösung für das gleiche zu tun, was in MVC. Diese Lösung, angepasst von Kraut ' s vor, die gut zu funktionieren scheint. Da gibt es nichts MVC-Inhaltsangaben, es sollte genauso gut funktionieren für PHP, Classic ASP, oder jede andere Art von Anwendung, die HTML-und JQuery.
InformationsquelleAutor der Antwort Kevin Crumley
Konnte man immer erstellen Sie eine inheirited Seite der Klasse, die eine benutzerdefinierte OnLoad/OnUnload-Methode fügt hinzu, dass im unmittelbaren Ausführung javascript.
Dann müssen Sie nicht haben, um es bei einer Kontrolle bestimmte Ebene, sondern vielmehr die form/page-Ebene.
InformationsquelleAutor der Antwort Jonathan
Interessant, aber..., warum nicht tun Sie alles, was mit jQuery?
Nun, wenn das immer noch verursacht das gleiche Problem (
unload
auslösen, bevorsubmit
), könnten Sie versuchen, eine andere event treeso dass anstelle der Berufung__doPostBack
direkt Sie tun...Habe ich noch nicht versucht, und es ist aus der Spitze von meinem Kopf, aber ich denke, es könnte ein Weg sein, um es zu lösen.
InformationsquelleAutor der Antwort void
Bekam dies funktioniert indem man im Grunde die Verfolgung der position der Maus. Denken Sie daran, Sie können immer noch positiven Werte der Y-Wert (daher mein < 50 Zeile code), aber so lange, wie Sie Ihre submit-buttons sind mehr als 100 Pixel nach unten, Sie sollten in Ordnung sein.
Hier ist das Javascript habe ich Hinzugefügt, um track-änderungen der Maus und erfassen die onbeforeunload-Ereignis:
Dann fügen Sie einfach Folgendes Formular auf Ihrer Seite:
Und das ist es! Es könnte ein wenig bereinigen (entfernen Sie die MouseX, etc), aber das war in meiner bestehenden ASP.net 3.5 Anwendung und dachte, ich würde post, um jemandem zu helfen. Funktioniert im IE 7 und Firefox 3.6, noch nicht versucht Chrome noch.
InformationsquelleAutor der Antwort Mark Kadlec
ich bin auf der Suche nach diesem auch, aber was ich finde so weit ist, eine Lösung mit allen html-Steuerelemente statt asp.net web-Steuerelemente, haben Sie daran gedacht?
InformationsquelleAutor der Antwort Nick Kahn