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

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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 🙂

Method 2

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
}

Method 3

JavaScript runs on the client; as far as the client is concerned, a page does not maintain state from one view to the next. Postbacks are entirely an ASP.NET concept.

You can get around this by running some code on the server-side which defines a JavaScript variable based on whether or not Page.IsPostBack is true.

Example:

<%@ Page Language="C#" AutoEventWireup="true"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Page.IsPostBack -> client</title>

    <script type="text/javascript">
        var isPostback = <%= Page.IsPostBack %>;
        console.log("IsPostBack: " + isPostback);
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button runat="server" ID="btnTest" Text="Click me..." />
    </div>
    </form>
</body>
</html>


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x