miso_soup3 Blog

主に ASP.NET 関連について書いています。

ページングされた一覧ページと詳細・編集ページの行き来

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番はブラウザの戻るボタンさんだと思います。