MVC環境でリターンURLを処理するスマートな方法
-
29-10-2019 - |
質問
ユーザーが[戻る...]リンクをクリックしたり、編集中のレコードを保存したりするなどのアクションを実行した後、前のページへのリダイレクトを処理することが何度も発生する問題です。
以前は、どのページに戻るかを知る必要があるときはいつでも、現在のビューにreturnURL
パラメーターを提供していました。
ジェネラコディセタグプレ
これは、この状況を処理するための非常にクリーンな方法ではありません。戻りURLに、URLに含める必要のある検索文字列などのパラメータが含まれている場合があるためです。 ジェネラコディセタグプレ
また、訪問したすべてのページにreturnURL
を渡す必要があるため、ユーザーがreturnURL
を使用してページに戻る前に、別のページに進むことができる場合に問題が発生します。
ページを更新したい場合があるため、ブラウザの戻る機能を呼び出すだけでは十分ではありません。前のページで保存した編集内容を表示します。
私の質問は、特にMVC環境で、この種の状況を処理するための賢い方法を見つけた人はいますか?
注:私はASP .NET MVCを使用しているので、可能であればそれに関連する回答を求めていますが、どんなアイデアでも歓迎します。
解決
Cookieを設定したり、セッション変数を使用したりすることの何が問題になっていますか?あなたがそうしない唯一の理由は、あなたがあなたを呼び出すページを制御しない場合です。その場合、あなたの唯一のオプションはクエリ文字列、投稿値、またはリファラーです。
他のヒント
質問に自分の答えを追加して、他の人がそれが良い考えだと思うかどうかを確認するかもしれないと思いました。
TempViewDataを使用してコントローラーに渡すだけです: ジェネラコディセタグプレ
次に、これと同様の方法でアクセスします(実際のバージョンでは、キーがTempData
にあり、returnURL
が実際のURLであることを確認します):
ジェネラコディセタグプレ
最初のページの変更を超えて続行する必要がある場合(つまり、検索ページ->編集ページ->セクションページの編集)、もう一度追加します ジェネラコディセタグプレ
ブログの投稿を確認してください:
@Mystere Manが述べたように、Cookieまたはセッションを使用できます。しばらく前に同じような状況にあったとき、私はクッキーを取りに行きました。
URLが/{controller}/{action}/{id}/returnurl/{*url}
である新しいルートを登録してから、 url をパラメーターとして受け入れるアクションでRedirectToAction
を使用してみてください
それでも、独自の「戻る」ボタンを作成するべきではないと主張します。
インターセプターまたはアスペクトを使用する:
- 各リクエストを何らかの方法でインターセプトし(例:
@Before
アスペクト)、リクエストされたURLをセッションに保存し、毎回上書きします - ビューレイヤーで、必要に応じてそのSessionオブジェクトにアクセスします。この場合はバックリンクにアクセスします。
この種の設計では、使用したい場合は常に最新のリクエストを利用できます。こちらが.NETでアスペクト/インターセプターを作成する例。さらに、 PostSharp は.NETアスペクトプロジェクトです。
現在、迅速で汚い方法は私を避けています...それで私は実用的な方法を使用しています。
概念レベルでは、ページの「バックアビリティ」は、現在表示しているページによって決定される必要があります。コントローラーでキャプチャされたパラメーターがViewModelを介してビューに渡された場合、ビューはこれを(ほとんどの場合)推測できます。
例:
Foo
にアクセスしたら、Bar
にアクセスしていくつかのものを表示します。戻るボタンは、Foo
に戻るはずです。
コントローラー ジェネラコディセタグプレ
ViewModels ジェネラコディセタグプレ
表示(部分)ジェネラコダイスタグコード
BarViewは、モデルから戻る必要がある場所を解釈できるようになりました(// No pun intended... or maybe it was. :)
を使用)。
BarView上(MVC2構文を使用): ジェネラコディセタグプレ
Html.ActionLinkも使用できます。
または:
保護されたプロパティfooId
を持つことができるBaseViewModelからViewModelを継承できます。必要に応じて設定してください。
例:
ViewModelの場合: ジェネラコディセタグプレ
表示中: ジェネラコディセタグプレ
これは、ページを離れることなく表示され、jQueryを使用してダイアログ/ウィザードワークフローを作成することなく表示する部分のアクションによって処理されますか?
その後、ダイアログの「Fide」ボタンに対応するだけで元のビューを更新する必要があります。
「編集中のレコードの保存」に関する質問の一部については、post-redirect-get(PGR)パターンが当てはまると思います。
慣れていない場合は、この場所を読むとよいでしょう。
- URLに含めるために
Url.Encode(returnUrl)
を使用してreturnUrlをエンコードします。 - リダイレクトの準備ができたら、
Url.Decode(returnUrl)
を使用し、実際のリダイレクトの値を使用します。