ボタンのようなサーバー側コントロールを使用してフォームを作成しました..また、その上にイベントを書きました..ボタンをクリックした後、実行時にF5.Page_loadを押してページを更新しました.Page_loadは正常に実行されていますが、button1_click()イベントも発生しています.. .このシナリオでこのイベントの実行を停止するにはどうすればよいですか.私に提案してください
9 に答える
短い答え: ありえない
より長い回答: Web サイトがブラウザの機能をブロックすることはできません。これは、ブラウザにとって重大なセキュリティ上の問題となるからです。
Web 開発へようこそ。ページの更新と再投稿を停止する方法はありません。これは完全にブラウザの動作です。
ただし、回避策があります。できる簡単なことの 1 つは、ボタン クリックを処理した後、ブラウザをページにリダイレクトして、更新時にボタンの押下の再投稿が含まれないようにすることです。明らかに、これには(ビューステートではなく)他の状態管理システムが必要になる場合があります。おそらく、状態をセッションに保存できます。
<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 ボタンをブロックする場所に投稿します。
ポスターは ASP.NET WebForms を使用しています。MVC では、Post-Redirect-Get パターンを使用すると、これは問題になりません。
しかし、これは 2004 年以降の Web フォームで解決されています (そしてそれ以前にも - 私は 2001 年に簡単なチケット ソリューションを書きました) 。
基本的に、作成者は各リクエストに関連付けられた一意のチケットを作成し、最初のポストバックでチケットの有効性を削除します。その後の偶発的な (または悪意のある) ポストバックは無視されます。基本ページにまとめられているため、Webforms ソリューションに簡単に追加できます。
あなたは潜在的に使用することができます:
window.onbeforeunload = function ()
{
return false;
}
これにより、別の場所に移動するかどうかをユーザーに尋ねるプロンプトが表示されますが、これは望ましくない可能性があります。(しかも、サポートの範囲がわからない)
ブロックしたいのは実際にはページの更新ではなく、ページの再読み込みPOST
です。
既に述べたように、更新はブラウザが最後のアクションで行ったことを再生するため、クライアント側では不可能です。
ただし、サーバーはリクエストを制御するためにいくつかの情報を保持できるため、サーバー側でトラップできます。
最も簡単な方法は、一種のRequestIDを の非表示フィールドに配置しPage Load
、 のような場所に保存することSession
です。次に、その値を制御しPOST
てリクエストを有効にし、それをオーバーライドしてPOST
、同じRequestIDとの再使用を回避します。
たぶんもっと良い方法があります:)
あなたの「問題」は、ユーザーのダブルクリックの恐怖行動に似ています: ASP.Net ダブルクリックの問題
ボタンをクリックするたびにページを更新する必要がありますか? ボタンを再配線して、データを送信するための ajax 呼び出しを行うことができますか? その場合、更新時にページが再送信されることを心配する必要はありません。
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>