Как остановить кнопки «Назад» и «Обновить» от повторной отправки формы? - PullRequest
22 голосов
/ 20 марта 2009

Я занимаюсь веб-разработкой.

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

Это включает в себя вверху слева кнопку «Назад» и «Обновить» браузера, «правый клик-> Обновить / Назад», нажмите клавишу «F5». Это должно быть сделано только на определенных страницах cgi, а не на всех.

Можно ли это сделать с помощью Javascript? Или любой другой метод?

Ответы [ 13 ]

0 голосов
/ 17 декабря 2013

Просто поместите этот javascript в раздел html страницы aspx над разделом head

<script type = "text/javascript" >
function disableBackButton()
{
window.history.forward();
}
setTimeout("disableBackButton()", 0);
</script>

Нам нужно поместить его в html-раздел страницы, который мы хотим запретить пользователю посещать, нажав кнопку назад

Полный код страницы выглядит следующим образом

<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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>Untitled Page</title>
<script type = "text/javascript" >
function disableBackButton()
{
window.history.forward();
}
setTimeout("disableBackButton()", 0);
</script>
</head>
<body onload="disableBackButton()">
<form id="form1" runat="server">
<div>
This is First page <br />
<br />
Go to Second page
<br />
<br />
<asp:LinkButton ID="LinkButton1" runat="server"
PostBackUrl="~/Default2.aspx">Go to Second Page
</asp:LinkButton></div>
</form>
</body>
</html>

Если вы используете Firefox, используйте вместо onload

Если вы хотите отключить кнопку «назад», используя код позади страницы aspx, то вам нужно написать нижеприведенный код Код C # позади

protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string strDisAbleBackButton;
strDisAbleBackButton = "<script language="javascript">\n";
strDisAbleBackButton += "window.history.forward(1);\n";
strDisAbleBackButton += "\n</script>";
ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "clientScript", strDisAbleBackButton);
} 

Этого также можно добиться, отключив кэширование в браузере или кеш, написав эту строку кода либо в событии Page_load, либо в событии Page_Init

protected void Page_Init(object Sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
Response.Cache.SetNoStore();
}

При этом пользователь получит сообщение об истечении срока действия страницы при нажатии кнопки назад браузера

Демо-версия:

enter image description here

0 голосов
/ 22 ноября 2013

Я нашел выше сообщение / перенаправить / получить объяснения немного двусмысленно

Вот то, что я следовал, и, надеюсь, это поможет кому-то в будущем

http://wordsideasandthings.blogspot.ca/2013/04/post-redirect-get-pattern-in-php.html

По существу, процесс, основанный на вышеуказанном решении:

  1. Отправить со страницы FORM на страницу обработки (или для себя)
  2. Обработка базы данных или обработки платежей и т. Д.
  3. При необходимости сохранить сообщение обратной связи с пользователем в переменной сеанса, возможные сообщения об ошибках и т.д.
  4. Выполнить перенаправление заголовка на страницу результатов (или на страницу оригинальной формы). При необходимости отобразить пользовательское сообщение со страницы обработки. Например, «Ошибка при оплате кредитной картой» и сброс переменных сеанса.

Перенаправление с чем-то вроде:

header("HTTP/1.1 303 See Other");
header("Location: http://$_SERVER[HTTP_HOST]/yourfilehere.php");
die();

Перенаправление заголовка инициирует запрос GET к «yourfilehere.php», потому что перенаправление - это просто «запрос» на выборку данных с сервера, а НЕ POST, который передает данные на сервер. Таким образом, перенаправление / GET предотвращает дальнейшую обработку БД / платежей после обновления. Состояние ошибки 301 поможет при нажатии кнопки назад.

Полезное чтение:

  1. http://en.wikipedia.org/wiki/URL_redirection#HTTP_status_codes_3xx
  2. http://www.theserverside.com/news/1365146/Redirect-After-Post
  3. http://wordsideasandthings.blogspot.ca/2013/04/post-redirect-get-pattern-in-php.html
  4. https://en.wikipedia.org/wiki/HTTP#Request_methods
  5. http://en.wikipedia.org/wiki/Post/Redirect/Get
0 голосов
/ 20 марта 2009

Решение vartec: s решает проблему перезагрузки, а не проблему возврата, поэтому вот решение этой проблемы:

  1. Страница формы устанавливает переменную сеанса, например, сеанс ("fromformpage") = 1
  2. Страница обработки проверяет переменную сеанса, если ее = "1", затем обрабатывают данные и перенаправляют на страницу результатов, если она отличается от = 1, а затем просто перенаправляют на страницу результатов.
  3. Страница результатов устанавливает для переменной сеанса значение "".

Тогда, если пользователь нажимает кнопку «Назад», страница обработки не будет выполнять процесс снова, только перенаправит на страницу процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...