Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell if a page unload in ASP is a PostBack

This seems like a common question but search is not returning anything.

I have the following code that executes before the page unloads.The problem is if the unload is a postback i do not want to fire my warning to the user but i can't figure out how to differentiate between a postback and a user navigating to another page for example.

// This is executed before the page actually unloads
        $(window).bind("beforeunload", function () {

            if (prompt) {

                //prompt
                return true;
            }
            else {

                //reset our prompt variable
                prompt = true;
            }
        })

Running script in the code behind i.e. if Page.IsPostBack then set prompt is not an option.

Any ideas?

EDIT:

Here is the solution I ended up with:

 function DoNotPrompt() {
              prompt = false;
        }

I then added this to all the controls where the user could do something that result in a post back.

OnClientClick="DoNotPrompt()

Then checked this flag and only returned a string in "beforeunload" if the user was really moving away from the page i.e. not a postback.

I also had to use this code: var magicInput = document.getElementById('__EVENTTARGET');

    if (magicInput && magicInput.value) {
        // the page is being posted back by an ASP control 
        prompt = false;
    }

The reason being i had a custom user control that was a list box and I could not add the above method. So used this to catch that event and set the flag to false.

Not the most elegent solution.

Thanks, Michael

like image 641
Michael Hollywood Avatar asked Oct 08 '22 23:10

Michael Hollywood


2 Answers

You can capture the submit and reset the onbeforeunload as:

jQuery(function($) {
    var form = $('form'), oldSubmit = form[0].onsubmit;
    form[0].onsubmit = null;

    $('form').submit(function() {       
        // reset the onbeforeunload
        window.onbeforeunload = null;

        // run what actually was on
        if(oldSubmit)           
            oldSubmit.call(this);           
    });
});

This is a tested code from my pages :)

like image 115
Aristos Avatar answered Oct 11 '22 00:10

Aristos


This may not cover all of the postback situations, but you can tell if the page was posted back by an ASP control by interrogating the __EVENTTARGET hidden input.

This input is set by ASP when the page is posted back by an ASP control.

var magicInput = document.getElementById('__EVENTTARGET');

if (magicInput && magicInput.value) {
   // the page is being posted back by an ASP control
}
like image 37
jbabey Avatar answered Oct 11 '22 00:10

jbabey