私はdbaseman が説明するよりもやや似た方法でそれをやっています。
基本的にBackUrl
、クライアントをリダイレクトする各 URL と、ユーザーがクリックする可能性がある各リンクに、クエリ文字列パラメーターを追加します。このBackUrl
パラメーターには、現在のページの完全なURL (すべてのパラメーターを含む) が含まれます。
そのため、ユーザーが後続のリダイレクトまたはリンクをクリックするたびに、文字列がどんどん長くなっていきます。URL が長すぎる場合があります。
私の解決策は、実際の URL を格納してBackUrl
クエリ文字列パラメーターに戻すのではなく、ハッシュ コードだけを格納することです。サーバー側では、ハッシュ コードと実際の URL を記憶するための文字列辞書 (ユーザーのセッション内) があります。
私のウェブサイトで「戻る」ボタンをクリックすると、この辞書内でルックアップを行い、指定されたハッシュの辞書で見つかった一致する URL にリダイレクトします。
このアプローチの欠点は、ディクショナリが時間の経過とともに大きくなり、決して縮小しないことです。ただし、私の現実世界のすべてのプロジェクトでは、これは決して問題ではありませんでした。さらに、セッションが破棄されると解放されます。
したがって、例は次のようになります。
- では、ユーザーをでは
task1.aspx
なく にリダイレクトします。task1-1.aspx
task1-1.aspx?BackUrl=24378
- サーバー側の辞書エントリを保存し、 にマッピング
24378
しtask1-1.aspx
ます。
- では、ユーザーをでは
task1-1.aspx?BackUrl=24378
なく にリダイレクトします。task1-2.aspx
task1-2.aspx?BackUrl=93748
- サーバー側の辞書エントリを保存し、 にマッピング
93748
しtask1-1.aspx?BackUrl=24378
ます。
- 等
次に、ページに戻るボタンを配置できます。
- ユーザーがその戻るボタンをクリックすると、
void BackButton_Click
関数が呼び出されます。
- その関数では
Request["BackUrl"]
、ハッシュ コードを取得するために使用します (例: 24378
)。
- ハッシュ コードを使用して辞書を調べ、実際の URL を取得します。
Response.Redirect
そのURLに。
それが基本的な考え方です。
擬似コード:
より明確にするためのいくつかの擬似コード。
Page
辞書の場合、次のように、派生基本クラス内にヘルパー プロパティを記述します。
protected Dictionary<string, string> BackUrls
{
get
{
var dic = Session["backdic"] as Dictionary<string, string>;
if ( dic == null )
{
dic = new Dictionary<string, string>();
}
return dic;
}
}
その後、ディクショナリに書き込みまたは読み取りを行うことで、ディクショナリにアクセスできます。
例: 辞書への書き込み:
private void goForwardToNextTask()
{
var hash = Math.Abs(Guid.NewGuid().GetHashCode());
// Store current page's full URL.
BackUrls[hash] = Request.RawUrl;
Response.Redirect( "task1-2.aspx?BackUrl=" + hash );
}
そして辞書から読む:
private void goBackward()
{
var hash = Request["BackUrl"];
// Backward translation.
Response.Redirect( BackUrls[hash] );
}
(すべての例では、エラーとサニティ チェックが省略されています)。