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:

  1. Es Speichern, Abbrechen und Löschen, die linkbuttons auf der Seite
  2. Kann es andere linkbuttons auf der Seite das ausführen von server-side-Funktionen, während Sie auf der gleichen Seite
  3. 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

Schreibe einen Kommentar