2010-11-19 4 views
4

У меня есть форма с сервером Side control, например button..and также написали событие на этом .. Теперь время выполнения после нажатия кнопки я обновил страницу, нажав F5.Page_load выполняет хорошо, но Button1_Click() событие также стрельба ... Так как я могу остановить выполнение мероприятий в этом scenario.Please предложить мнеПредотвращение обновления страницы при нажатии F5

+0

Я не веб-программист, но я даю ему попробовать на мозговой штурм. Разве это не история о PostBack и т. П.? Будет ли это работать, если вы проверите, является ли это PostBack и т. Д.? –

ответ

11

Короткий ответ: не возможно

Longer Ответ: нет веб-сайт не может блокировать функциональность браузера поскольку это будет серьезной проблемой безопасности для браузера.

+0

привет ... Joel..cureently, когда я сохранил запись ... я показываю сообщение sucess на той же странице. И если irefresh страница (ctrl + F5) или F5..один больше записей вставлен. поэтому, с теми же деталями, вставляются две строки. Я запретил вставлять повторяющиеся записи. –

+1

Способ использования этого случая - отправить сообщение другому URL-адресу, обработать, а затем перенаправить на первую страницу с сообщением об успешности или ошибке в строке запроса. К сожалению, модель ASP.NET после обратной связи делает это практически невозможным. Все, что вы можете сделать, это перенаправить после успешного перехода на страницу стиля «спасибо» (которая полностью отделена от первой страницы). Таким образом, если пользователь обновит это, он не будет повторно отправлен. По сути, вы никогда не должны показывать результат в том же ответе, что и сообщение, которое инициировало действие. –

+1

Кроме того, сделайте некоторое исследование Idempotency. Вы должны сделать свои действия идемпотентными :-) http://en.wikipedia.org/wiki/Idempotent –

6

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

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

2

Вы могли бы потенциально использовать:

window.onbeforeunload = function() 
{ 
    return false; 
} 

Это будет отображать подсказку спрашивая пользователя, если они хотят, чтобы перемещаться в сторону и не может быть желательным. (Кроме того, я не знаю, какой объем поддержки)

1

На самом деле это не обновление страницы, которое вы хотите заблокировать, ее страница повторно POST.

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

Но вы можете уловить его на стороне сервера, потому что сервер может хранить некоторую информацию для управления запросом.

Самый простой способ это поставить своего рода RequestID в скрытом поле на Page Load, хранить его где-нибудь в Session. И контролируйте его значение на следующем POST, чтобы выполнить запрос, затем переопределите его, чтобы избежать повторного ответа POST с тем же RequestID.

Может быть, есть лучший способ :)

Ваша «проблема» похоже на пользователь дважды щелкните поведение хоррор: ASP.Net double-click problem

1

Вы должны обновить страницу на нажатии кнопки? Не могли бы вы перемотать кнопку, чтобы сделать ajax-вызов для отправки данных? Если да, то вам не нужно беспокоиться о повторной отправке страницы при обновлении.

2

Плакат использует ASP.NET WebForms. В MVC, используя шаблон Post-Redirect-Get, это не будет проблемой.

Но это была решена для WebForms с 2004 года (и даже до того, что - я написал простое решение билет в 2001 году) с этой статьей: http://msdn.microsoft.com/en-us/library/ms379557.aspx

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

2
<script type="text/javascript" language="javascript"> 
    function checkKeyCode(evt)// for F5 disable 
    { 

     var evt = (evt) ? evt : ((event) ? event : null); 
     var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); 
     if (event.keyCode == 116)//disable F5 
     { 
      evt.keyCode = 0; 
      return false 
     } 
     if (event.keyCode == 123) { 
      evt.keyCode = 0; 
      return false 
     } 
     if (event.keyCode == 93) { 
      evt.keyCode = 0; 
      return false 
     } 
     if (event.altKey == true && event.keyCode == 115) //disable alt-F4 
     { 
      evt.keyCode = 0; 
      return false 
     } 



     //alert(event.keyCode); 
    } 

    document.onkeydown = checkKeyCode; 

</script> 

Опубликуйте этот скрипт на своей главной странице или где вы хотите заблокировать кнопку F5.

0

я получил некоторый код, который не позволяет вам нажать F5 и/или Ctrl + R:

<!DOCTYPE html> 
<html> 
<head> 
<title> 
Key code test! 
</title> 
<script type="text/javascript"> 
var x, ctrlKeyPressed = false; 
function keyDown(e){    
x = e.charCode || e.keyCode; 
document.getElementById("key").innerHTML = x; 
if(x == 17) { 
ctrlKeyPressed = true; 
} 
if(ctrlKeyPressed && x == 82) { 
e.preventDefault(); 
} else if(x == 116) { 
e.preventDefault(); 
} 
} 
function keyUp(e) { 
x = e.charCode || e.keyCode; 
if(x == 17) { 
ctrlKeyPressed = false; 
} 
} 
window.onload = function() { 
document.onkeydown = function (e) { 
keyDown(e); 
}; 
document.onkeyup = function (e) { 
keyUp(e); 
}; 
} 
</script> 
</head> 
<body> 
Press a key! 
<br/> 
Key code: <div style="display:inline;" id="key">Nothing</div> 
</body> 
</html> 
Смежные вопросы