Вопрос по jquery, asp.net, javascript – Как определить, является ли страница, выгруженная в ASP, PostBack

4

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

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

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

            if (prompt) {

                //prompt
                return true;
            }
            else {

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

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

Есть идеи?

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

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

 function DoNotPrompt() {
              prompt = false;
        }

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

OnClientClick="DoNotPrompt()

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

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

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

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

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

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

Ваш Ответ

3   ответа
1

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

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

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

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

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

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

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

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

Похожие вопросы