ページングされた一覧ページと詳細・編集ページの行き来
ASP.NET MVC で、ページングに対応した一覧ページから、
編集(詳細)ページへ遷移した後、もう一度一覧ページに戻るとき、
表示していた○ページ目へ戻るようにしたい、といった時の
実装方法について書きます。
図で表すとこんな感じです。
QueryString や セッションデータを使わなくても、
ActionLinkは、現在のルートデータを参照してくれる この機能を使えば、
僅かなコードで実装できます。
最初に QueryString での実装方法を紹介した後、ルートデータを使った実装方法を書きます。
QueryString で実装する場合
もし QueryString でページ番号の受け渡しを行う場合は、
まず一覧ページにて、編集(詳細)リンクを表示するときに、
現在のページ番号をパラメータとして渡します。
ルーティングを特に変更していない場合は、
『~/Person/Edit/1?page=3』みたいに後ろに QueryString がくっ付いてリンクが貼られます。
次に、編集ページの送信後のアクションメソッドで、
QueryString の page の値を受け取れるよう、引数に int page を定義し、
一覧へ戻る RedirectToAction メソッドで、ページ番号を表すパラメータ page に その値を設定します。
これで、指定したページ番号の一覧へ遷移できます。
詳細ページの場合は、もう少し大変です。
詳細アクションメソッドで、QueryString の page の値を受け取る引数を定義し、
View 側でその値を使い、一覧へ戻るリンクを生成するために、ViewBag に渡します。
次に View 側で、一覧へ戻るリンクを生成するときに、
パラメータとしてページ番号を渡します。
以上が、QueryString を使った場合の実装方法の例です。
問題は特にないと思いますが、いろんなところでページ番号の受け渡しがあるので少々煩わしいです。
次のルートデータを使った実装方法では、すごくシンプルにできます。
ルートデータを使った実装
ルートデータを使う場合は、以下の様に
パラメータ page を使ってルーティング設定を行うだけでできます。
一覧、詳細、編集のルートそれぞれに、page のURLパラメータを指定し、
ルートデータ page にページ番号が入る状態にします。
こうすると、先ほどみたいに ActionLink や RedirectToAction で page = 1 を設定したり、アクションメソッドの引数に page を定義したりしなくても、表示していたページの一覧へ遷移することができます。
理由は、ActionLinkは、現在のルートデータを参照してくれる にも記載した通り、ActionLink や RedirectToAction でリンクを生成する時に、現在のルートデータを参照してリンクを生成してくれるためです。
が、1番はブラウザの戻るボタンさんだと思います。