Как определить, является ли страница, выгруженная в ASP, PostBack

Это кажется обычным вопросом, но поиск ничего не возвращает.

У меня есть следующий код, который выполняется перед выгрузкой страницы. Проблема в том, что если выгрузка является обратной передачей, я не хочу отправлять предупреждение пользователю, но я не могу понять, как различить обратную передачу и пользователя, переходящего к другая страница, например.

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

            if (prompt) {

                //prompt
                return true;
            }
            else {

                //reset our prompt variable
                prompt = true;
            }
        })
</code>

Запуск сценария в коде позади, то есть, если Page.IsPostBack, тогда запрос установки не является опцией.

Есть идеи?

РЕДАКТИРОВАТЬ:

Вот решение, которое я выбрал:

<code> function DoNotPrompt() {
              prompt = false;
        }
</code>

Затем я добавил это ко всем элементам управления, где пользователь может сделать что-то, что приведет к обратной записи.

<code>OnClientClick="DoNotPrompt()
</code>

Затем проверил этот флаг и вернул только строку в & quot; beforeunload & quot; если пользователь действительно удалялся от страницы, то есть не назад.

Я также должен был использовать этот код: var magicInput = document.getElementById ("__ EVENTTARGET");

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

Причина в том, что у меня был пользовательский элемент управления, представляющий собой список, и я не мог добавить вышеуказанный метод. Так что использовал это, чтобы перехватить это событие и установить флаг в false.

Не самое подходящее решение.

Спасибо, Майкл

Ответы на вопрос(3)

что касается клиента, страница не поддерживает состояние от одного просмотра к другому. Постбэки полностью являются концепцией ASP.NET.

Вы можете обойти это, запустив некоторый код на стороне сервера, который определяет переменную JavaScript в зависимости от того,Page.IsPostBack правда.

Пример:

<%@ 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>
 02 мая 2012 г., 15:34
Я думаю, что он должен знать, что это постбэк, в первый раз, прежде чем этот пост произойдет. Это работает после первого сообщения обратно на второй.
 Michael Hollywood02 мая 2012 г., 15:39
@Aristos. Да, точно. Я хочу знать, прежде чем на самом деле произойдет обратная передача, поэтому выполнение кода на стороне сервера слишком поздно, так как код в функции перед загрузкой уже выполнен.
 02 мая 2012 г., 15:45
Виноват. В этом случае ответ Аристоса выглядит ближе к отметке.

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

Это проверенный код с моих страниц :)

 02 мая 2012 г., 15:33
как вы проверяете, перенаправлена ли страница или выполняется обратная передача?
 Michael Hollywood02 мая 2012 г., 15:40
Я попробую это сейчас.
 02 мая 2012 г., 15:35
@RoyiNamir Это захват отправки формы. Если он нажимает на ссылку, это не влияет, не делает пост обратно. Что попытаться заархивировать здесь, так это не показывать сообщение на пост назад. Все остальные считаются. Я использую тот же код и трюк для своих страниц.
 02 мая 2012 г., 15:42
@MichaelHollywood единственное отличие состоит в том, что я используюwindow.onbeforeunload = function() {} и не связываться с JQuery. Надеюсь, что это работа для вас.
 Michael Hollywood02 мая 2012 г., 17:14
Нет, я все еще заблокирован. Я должен сказать, что это не потому, что выше не был правильный ответ, но что сложность моей проблемы больше, чем мой вопрос. На этой странице есть несколько основных элементов управления ASP.Net, вид сетки, где пользователи могут добавлять / удалять / редактировать строки, а также настраиваемые элементы управления. Теперь куча из них заставит страницу вернуться к коду на сервере (а не просто к отправке), и для каждого из них событие запускается и перехватывается beforeunload. Проблема в том, что когда мы публикуем сообщения, мне не нужно предупреждать пользователя. Поэтому мне нужно расширить дело «Отправить», чтобы охватить все постбэки на этой странице.
Решение Вопроса

но вы можете определить, была ли страница отправлена обратно элементом управления ASP, путем опроса__EVENTTARGET скрытый ввод.

Этот вход устанавливается ASP, когда страница отправляется обратно с помощью элемента управления ASP.

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

if (magicInput && magicInput.value) {
   // the page is being posted back by an ASP control
}
 02 мая 2012 г., 20:14
ну +1 потому что это работа для майкла.
 02 мая 2012 г., 15:31
Хорошо, я думаю, что это идея - я просто не проверял это, должен быть уверен, что во всех случаях __EVENTTARGET изменяется перед возвращением сообщения. Здесь я вижу изменение при вызове __doPostBack.
 Michael Hollywood02 мая 2012 г., 17:32
Я пробовал это, но, как вы говорите, по какой-то причине он не захватывает все постбэки. Например, когда пользователь редактирует строки в нашей сетке.
 02 мая 2012 г., 15:30
@Aristos magicInput будетnull (falsey), если он не был найден в DOM, и его значением будет пустая строка (falsey), если он был найден, но не был установлен. оператор проверяет, что скрытый ввод существует и имеет значение.

Ваш ответ на вопрос