ユーザーがブラウザの戻るボタンまたは更新ボタンをクリックしたかどうかを確認する方法
-
08-07-2019 - |
質問
ユーザーがブラウザの戻るボタンまたは更新ボタンをクリックしたかどうかを確認する必要があります。
[戻る]または[更新]ボタンをクリックすると、ページをエラーページにリダイレクトする必要があります。これを行う方法。
ASP.netページのjavascriptでこれを行う必要があります
解決
まず、ユーザーが[戻る]を使用するか、何らかの理由でページを更新する必要がある場合にエラーメッセージを表示することは、非常に悪い考えです。代わりに、透過的に対処する必要があります。輸送レベルの問題のためにページが完全に表示されないことを考えてください。ユーザーが選択できる唯一のオプションは、リロードするか戻ることです。
質問に答えるには、ユーザーのナビゲーションを自分で追跡する必要があります。つまり、サーバー側です。ここでjava-scriptを忘れてください。ユーザーがWebサイトにアクセスすると、そのユーザーに関連付けられたセッションにその情報を保存できます(これらの一意のセッションを保持する方法はいくつかありますが、ここでは詳しく説明しません)。 ユーザーが最近アクセスしたページを内部構造に保存すると、2回アクセスされたページや、「間違った」ページへのナビゲーションを簡単に特定できます。方向。
「allowed」のグラフを作成することにより、これを簡単に一般化できます(また、たとえば、ユーザーがURLをめちゃくちゃにジャンプしたり、一度に複数のステップに戻ることに対して、全体をより堅牢にします)。ユーザーがウェブサイトにアクセスしているときにナビゲーションとトラバースを行います。
ユーザーが「間違った」ことをしている場合の正しい動作ナビゲーション(後退、== 2回の再読み込みなど)は、彼を軌道に乗せることです。エラーメッセージを出さないように彼は逃げられません!彼はリロードしたり戻ったりすることを許可されていないため、オプションは残っていません。
他のヒント
できません。ブラウザは、独自のUIイベントをサーバーに送信しません。取得できるのはHTTPリクエストのみで、1つは他のリクエストとほとんど同じです。戻るボタンをクリックしたか、最後のURLを再入力した可能性があります。それが原因である問題を教えてください。httpプロトコルで動作するようにプロジェクトを少し改善するのに役立ちます。
セッションに保存されているGUIDまたはタイムスタンプを使用してPageTokenを実装し、値をフォームの非表示フィールドと比較します。 PageTokenクラス。非表示フィールドの値とセッション変数が一致しない場合は、同期が取れていないため、それを処理します。秘Theは、ページ上のすべてのイベントをマップすることです。
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);
}
}
通常のコードの前のイベントメソッド:
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;
}
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
なし
一般的なコードでは、&lt; body&gt;
<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>
何らかのアクションやデータの再送信を避けるために、ポストバックのためにこれを実行したいと思いますか?皮肉なことに、これはasp.net webformsの前の問題ほど大きくはありませんでした...通常、同じURLではなく別のURLに投稿する必要があったためです(実際にはasp.net mvcに似ています)。
私が使うのが好きだったトリックの1つは、最も技術的な点では遅いにもかかわらず...入力ページと投稿ページを作成することでした。投稿ページのHTML出力は、ブラウザーの履歴内の現在のURL(投稿ページの)を結果ページ(または必要に応じて元の参照ページ)に置き換えた小さなjavascriptを備えた超最小限のHTMLでした。結果は、ユーザーが「戻る」ボタンをクリックして、元の入力ページに送信されるか、または「更新」をクリックすると、すでに新しい結果ページに移動したときです。
<html><body onload="location.replace('someURL.asp')"></body></html>
送信ボタンにプロパティを設定することで、Java / Struts1で実行しました。送信ボタンがクリックされた場合、ボタンテキストはActionFormのプロパティで送信されます。ユーザーが情報を更新した場合、値は設定されていなかったため、ユーザーがボタンをクリックしていないことがわかりました。プロパティが空のこのケースでは、戻ってページフローの最初のページをレンダリングしました。 ASP.NetのYMMV。
これは、ユーザーが戻る/進むボタンを使用してページに到達したかどうかを単に検出します...唯一の問題はIE8以前にあり、ブラウザバージョンではこれを処理できません。
if(performance.navigation.type == 2)
{
//Do your code here
}
.NET 3.5は、ブラウザの戻る(および進む)ボタンを非常にうまく処理できます。 Googleで検索:&quot; Scriptmanager EnableHistory&quot;。 ブラウザの履歴にエントリを追加するユーザーアクションを制御でき(ScriptManager-&gt; AddHistoryPoint)、ユーザーがブラウザーの[戻る]または[進む]ボタンをクリックするたびにASP.NETアプリケーションがイベントを受け取ります。