Как узнать, нажимает ли пользователь кнопку "Назад назад" или "Обновить"

Мне нужно найти, будет ли пользователь нажимать кнопку "Назад назад" или "Обновить".

Мне нужно перенаправить страницу на страницу "Ошибка", когда он нажимает кнопку "Назад" или "Обновить". Как это сделать.

Мне нужно сделать это в javascript для моей страницы ASP.net

Ответ 1

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

Чтобы ответить на ваш вопрос, вы должны сами отслеживать пользовательскую навигацию, что означает на стороне сервера. Забудьте о java- script здесь. Если пользователь посещает веб-сайт, вы можете сохранить эту информацию в сеансе, связанном с пользователем (существует несколько способов сохранения этих уникальных сеансов, и я не буду вдаваться в подробности здесь). Если вы сохраняете в своих внутренних структурах страницы, которые посещают посетитель в последнее время, легко определить посещаемую страницу дважды или переходить в "неправильное" направление.

Вы можете легко обобщить это (и сделать все это более надежным, например, против того, чтобы пользователи прыгали дико между URL-адресами или возвращались более чем на один шаг за один раз), построив график "разрешенной" навигации и пройдя его, пока пользователь посещает веб-сайты.

Правильное поведение тогда, если пользователь делает "неправильную" навигацию (например, отступать, перезагружать == посещение дважды), чтобы вернуть его в нужное русло. Чтобы не дать сообщение об ошибке, он не может убежать! Поскольку ему не разрешено перезагружать или возвращаться, у него нет вариантов.

Ответ 2

Вы не можете. Браузер не отправляет на сервер собственные события ui. Все, что вы получаете, это HTTP-запросы, и один выглядит почти как другой. Возможно, нажал кнопку "Назад" или, возможно, просто перепечатал последний URL-адрес. Расскажите нам, какие проблемы он вызывает, и мы можем помочь вам адаптировать ваш проект для работы с протоколом http немного лучше.

Ответ 3

Реализовать страницу PageToken, используя ориентир/или временную метку, сохраненную в сеансе, и сравнить значение с скрытым полем в форме. Я сделал это через PageToken Class. Если значение из скрытого поля и переменной сеанса не совпадает, вы не синхронизированы, и вы справляетесь с этим. Фокус в том, чтобы отобразить все события на вашей странице.

public void GeneratePageToken()
{
    SessionVariables currSession = new SessionVariables();
    hfMasterPageToken.Value = System.DateTime.Now.ToString();
    currSession.PageToken = hfMasterPageToken.Value;
}

public string GetLastPageToken
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return currSession.PageToken;
    }
}

public bool TokensMatch
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return (currSession.PageToken != null
            && currSession.PageToken == hfMasterPageToken.Value);
    }
}

В вашем методе Event перед вашим обычным кодом:

if (this.TokensMatch == false)
{
    //Reload the data.
    //Generates a NewPageToken (this.GeneratePageToken();)
    ReloadDataMethod();
    this.MessageToUser =
     "Data reloaded.  Click Edit or Insert button to change.";
    this.MessageType = MessageToUserType.Success;
    this.DisplayMessageToUser = true;
    return;
}

Ответ 4

С Site.Master

В Site.Master, положите после <body>

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<dx:ASPxLoadingPanel ID="MainLoadingPanel" runat="server" ClientInstanceName="MainLoadingPanel" Modal="True" />
<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    MainLoadingPanel.Show();
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            MainLoadingPanel.Hide();
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Без Site.Master

В вашем общем коде положите после <body>

<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Ответ 5

Предполагаю, что вы хотите сделать это из-за обратной связи, чтобы избежать повторной передачи каких-либо действий или данных? по иронии судьбы, это была не такая огромная проблема перед веб-формами asp.net... потому что вам обычно приходилось публиковать другой URL, а не тот же (как, например, asp.net mvc).

Один трюк, который мне нравился использовать... хотя в самых технических точках медленнее... было иметь входную страницу и страницу с сообщением. Вывод HTML на странице сообщений представлял собой некоторый супер минимальный HTML с крошечным javascript, который заменил текущий url (почтовой страницы) в истории браузера на странице результатов (или даже исходной ссылочной странице, если вы действительно хотели). В результате пользователь нажал кнопку "Назад", он будет отправлен на исходную страницу ввода или если он щелкнет по обновлению, он уже будет на новой странице результатов.

<html><body onload="location.replace('someURL.asp')"></body></html>

Ответ 6

Мы сделали это в Java/Struts1, поместив свойство на кнопку отправки. Если нажать кнопку "Отправить", текст кнопки будет отправлен в свойстве в ActionForm. Если пользователь обновил информацию, значение не было установлено, поэтому мы знали, что пользователь не нажал кнопку. В этом случае, когда свойство было пустым, мы вернулись и отобразили первую страницу потока страниц. YMMV в ASP.Net.

Ответ 7

Он просто определяет, попадает ли пользователь на вашу страницу с помощью кнопок "назад" и "вперед"... единственная проблема с IE8 и ниже, версия браузера не может справиться с этим.

if(performance.navigation.type == 2)
{
    //Do your code here
}

Ответ 8

.NET 3.5 может очень хорошо обрабатывать кнопки браузера (и вперед). Искать в Google: "Scriptmanager EnableHistory". Вы можете контролировать, какие действия пользователя будут добавлять запись в историю браузера (ScriptManager → AddHistoryPoint), и приложение ASP.NET получает событие, когда пользователь нажимает кнопки браузера Back/Forward.