ASP.NET Core(2.1)で TempData の動作確認しようと思った際のにメモです。
メモ
- ASP.NET Core 2.0 以降、Cookie ベースの TempData プロバイダーがデフォルト
- ミドルウェア コンポーネントの設定必要
- 現時点ではプリミティブなデータ型しか対応していない(今後も?)
初めて使うならドキュメント読むのが無難(そりゃそうだ....)。
環境
ASP.NET Core 2.1 と書いていますが、動作確認をした際の Nuget のバージョンは以下です。
プロジェクトの作成
ASP.NET Core MVC のプロジェクトを作成して、C#のバージョンを7.1以上にしましょう(プロジェクトのプロパティ > ビルド
> 詳細設定
で言語バージョンで設定するやつ)。言語バージョンを上げるのは、TmpData と直接は無関係で、後のサンプルコードで必要になるだけです。
ミドルウェアの設定
Startup.cs
を開いて、 以下のように
ConfigureServices
メソッドで2箇所Configure
メソッドで1箇所
コードを追加してミドルウェアを設定します。
ミドルウェアの設定は順序も重要になってくるので、そのあたりのエクセプションが出たり動作がおかしい時はドキュメントを確認しましょう(ってか使う前にまずドキュメントみるべきですかねw)。
TempData の利用
プリミティブな型しかあつかわないし今後もその予定っぽいことが GitHubの issue でも書いてあったので、ViewModel的なものを TempData で使いたいなら Json形式の文字列にして保存したり取り出して使う感じです。
今回は、動作確認用に以下のクラスを使います。
サクッと動作確認をしたかったので、HomeControllerで、無意味にリダイレクトするメソッド Redirect
と、Index
メソッドをこんな感じで書いてみました。
Redirect
で TempData にデータを入れて、Index
メソッドで取り出します。
デバッグしないと特になんの意味ももたない実装ですが、まぁ動作確認には十分ですね。
ブレークポイントを各メソッドにおいてデバッグ実行して、home/redirect
にアクセスすると、TempData のやり取りが想定通りにできるのが確認できます。
拡張メソッド化
DRYにするのに、ITempDataDictionary
の拡張メソッドを作ってしまいましょう。どこにでもありそうなやつですね。
(ここで C#7.1 の Default Literals が使いたかったので言語バージョンをアップデートしたってやつです。)
これで、Controller側はシンプルなコードになりますねー♪
参考
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/app-state?tabs=aspnetcore2x#tempdata