12
votes

Asp.net, jQuery, formes sales et window.onbeforeunload

Dans mon application Web ASP.NET, j'essaie de créer une manière universelle d'utilisateurs d'avertissement avant de naviguer à côté d'un formulaire lorsqu'il a apporté des modifications, en utilisant JQuery. Jolies choses standard, mais après avoir cherché beaucoup de recherches, je n'ai pas encore trouvé une technique qui fonctionne.

Voici ce que j'ai à ce stade: p>

    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;}


2 commentaires

Vous pouvez simplement tricher et vérifier le code SO source pour voir ce qu'ils font.


Ainsi utilise à l'avant -1load, mais c'est MVC == Aucun post-packs == n'a pas le problème particulier de l'herbe.


5 Réponses :


2
votes

Vous pouvez toujours créer une classe de page héritée qui a un personnalisé / oncharload méthode ajoute dans l'exécution immédiate JavaScript.

Ensuite, vous n'avez pas à le gérer à un niveau spécifique de la commande, mais plutôt le niveau de formulaire / page.


1 commentaires

Pas clair sur ce que vous suggérez. Qu'est-ce que cette méthode / méthodes ferait-elle?



2
votes

intéressant, mais ... pourquoi ne faites-vous pas tout avec jQuery? XXX PRE>

MAINTENANT, si cela provoque toujours le même problème ( Décharger code> déclenchement avant Soumettre code>), vous pouvez essayer un autre arborescence d'événement em>, donc au lieu d'appeler __ dopostback code> directement que vous faites ... p>

setTimeout(function( ) {
    __doPastBack(defaultSubmitControl || $('form :submit[id]').get(0).id, '');
}, 1);  // I think using 0 (zero) works too


0 commentaires

0
votes

Je m'occupe de cela aussi, mais ce que j'ai trouvé jusqu'à présent, une solution qui utilise tous les contrôles HTML forts> au lieu de contrôles Web ASP.NET, avez-vous pensé à cela?

  <script type="text/javascript">
    $(document).ready(function () {
      $("form").dirty_form();
      $("#btnCancel").dirty_stopper();
    });             
  </script>


0 commentaires

1
votes

Vous devez travailler en suivant essentiellement la position de la souris. Gardez à l'esprit que vous pouvez toujours obtenir des valeurs positives à votre valeur Y (d'où ma Voici le JavaScript que j'ai ajouté Pour suivre les modifications de la souris et capturer l'événement OnBeForeRunload: P>

    <form name="Show">
        <input type="hidden" name="MouseX" value="0" size="4">
        <input type="hidden" name="MouseY" value="0" style="display:block" size="0">
    </form>


0 commentaires

8
votes

Je suis tombé sur ce poteau pendant que Googling pour une solution pour faire la même chose en MVC. Cette solution, adaptée de l'herbe ci-dessus, semble bien fonctionner. Comme il n'y a rien de spécifique MVC à ce sujet, il devrait également fonctionner aussi bien pour PHP, ASP classique, ou tout autre type d'application utilisant HTML et JQUERY.

var isDirty = false;

$(document).ready(function () {
    $(':input').bind("change select keydown", setDirty);
    $('form').submit(clearDirty);

    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; }


0 commentaires