ASP.NET MVC-TempData-良いまたは悪い習慣


96

AcceptVerbsASP.NET MVCのフォームエントリを処理するために、Scott Guのプレビュー5ブログの投稿で詳述されている方法を使用しています。

  • ユーザーはGETを介して空のフォームを取得します
  • ユーザーはPOSTを介して同じアクションに入力されたフォームを投稿します
  • アクションはデータを検証し、適切なアクションを実行して、新しいビューにリダイレクトします

だから私は使う必要はありませんTempData。とは言っても、このプロセスに「確認」ステップを追加する必要があるため、を使用する必要があるようですTempData

何らかの理由で、私は使用を嫌っていますTempData-それは周りに設計されるべきものだということです。

これはまったく正当な懸念ですか、それとも私はそれを補っていますか?


1
「確認」ステップをJavaScriptダイアログにすることを検討してください。サーバーのラウンドトリップが少なく、この問題に遭遇することはありません。
ajma

回答:


26

tempデータは、ユーザーに通知するためのファイアーアンドフォーゲットメカニズムであると私は考えています。彼らが最近行ったことを思い出させるのは素晴らしいことですが、ユーザープロセスで必須のステップにすることもためらっています。その理由は、ページを更新すると、消えてしまうと思います。まあ私はそれが本当にどれほど信頼できるか明確に定義されていないので、私もそれを使うのをためらっていると思います。

問題は、確認ステップの前にアクションが別のページにリダイレクトされていることでしょうか。代わりに、最初に送信した後で、確認ダイアログを生成する十分な処理を行ってから、確認の質問を含む元のページを返すことができるのではないかと思います。検証を行う方法に似ていますが、検証ルールは確認ステップが実行されたかどうかを確認します(他の検証がパスするまで確認UIが非表示になります)。


77

TempDataに嫌悪感を抱く必要はありません...しかし、正しく使用しないと、デザインが悪いことを示している可能性があります。RESTful URLを使用している場合、TempDataはPOSTアクションからGETアクションにメッセージを転送するためのベストプラクティスです。このことを考慮:

URL Products / Newにフォームがあります。Forms Posts to Products / Createは、フォームを検証して製品を作成します。成功すると、コントローラーはURL Products / 1にリダイレクトし、エラーが発生すると、製品/新規にリダイレクトしてエラーメッセージを表示します。

Products / 1は製品の標準のGETアクションですが、挿入が成功したことを示すメッセージを表示したいと考えています。TempDataはこれに最適です。Post ControllerのTempDataにメッセージを追加し、ifロジックをビューと完了に追加します。

失敗時には、フォームコレクションに入力された値とエラーメッセージのコレクションをポストアクションのTempDataに追加し、最初のアクションのProdcuts / Newにリダイレクトしています。ビューにロジックを追加して、以前に入力した値とエラーメッセージをフォーム入力に入力しました。きれいに見える


に直接投稿できるのに、なぜ余分な作業を行うのProducts/Newですか?どのような付加価値がありProducts/Createますか?
mpen

2
@ Mark、Products / Createを使用すると、ユーザーがポストバックを介してアクションを完了し、後で更新(またはブックマークして戻る)すると、誤ってアクションが再実行される状況を回避できます。詳細については、en.wikipedia.org
wiki / Post / Redirect / Get

2
@ehdv:でも本当にそうなの?成功した場合は別のページにリダイレクトされ、失敗した場合はフォームエラーが表示され、アクションは実行されないため、害はありません。それは、私が頻繁にやりたがっている迷惑な「あなたが本当に再投稿してよろしいですか」というメッセージを防ぐだけです。それはあなたのデザイン次第ではないかと思いますので、私はあなたのポイントを見ることができます。
mpen 2011

31

TempDataを使用する前にためらうことはよくあると思います。TempDataはセッションに格納されます。これは、次の場合に影響を与える可能性があります。

  1. 現在、サイトでセッションを使用していません
  2. 高スループットにスケーリングする必要があるシステムがあります。つまり、セッション状態を完全に回避したい
  3. Cookieを使用したくない(現時点でMVCがCookieなしのセッションをどの程度サポートしているかはわかりません)

サイトに高可用性が必要な場合は、セッション状態の適用に関する追加の考慮事項がありますが、これらはすべて解決可能な問題です。


16
TempDataはデフォルトのプロバイダーですが、セッションに保存する必要はありません。これがおそらくメソッドdocにないためです。カスタムプロバイダーを作成する方法の例として、Cookieプロバイダーもあります。
FinnNk、2010

3

最初にTempData ["model"]をチェックしてそれを返すGetModelメソッドがあります。それ以外の場合、GetModelはデータベースから適切なデータをロードします。

同じモデルデータを必要とする別のビューを返す必要があるアクションがある場合、データベースから余分な負荷を節約できます。


ええ、私はこれに遭遇しました:(1)レコードが存在することを検証し、有効であれば、ページにリダイレクトします(2)レコードをロードしてユーザーに表示します。そのため、データベースは検証と表示のためにヒットします。TempDataを使っているところがほとんどですが、意見をチェックしたい気がしました。私はあなたの方法がそれを含むのが好きです。
匿名、

このシナリオでは、適切なキャッシュメカニズムを使用することをお勧めします。
nicodemus13 14年

3

MVC3のセッションレスコントローラーを確認してください。セッションを使用すると、1人のユーザーの要求の並列実行が妨げられ、パフォーマンスが低下することがわかりました。

tempdataはデフォルトでセッションを使用するため、この機能を使用することはできません。tempdataにcookieを使用するように切り替えることはできますが、(少なくとも私にとっては)少し厄介です。ただし、ビューステートよりもきれいなので、それほど大きな問題ではないかもしれません。


2
あなたはセッションレスコントローラーについて正しく、TempDataはセッションを使用します。ちょっと待って!セッションは悪いことではなく、セッションレスとセッションコントローラーを組み合わせて使用​​できます。(ブラウザーから)サーバーに対して多数のAJAX呼び出しを行っている場合は、Session_less_コントローラーが本当に必要です。あなたがちょうど1ページを打つとき-一度に.. uセッションレスである必要はありません。実際には、サーバーに1度しかアクセスしないので、何のメリットもありません。したがって、組み合わせることができます。
Pure.Krome

2

なぜそんな嫌悪感があるのですか?これは単にその仕事をしてそれをうまく作ることです:)

強く型付けされていないために気に入らない場合は、強く型付けされたインターフェースを提供するラッパーをいつでも作成できます。


2

これはViewDataを使用するようなもので、おそらくセキュリティリスクではありません。ただし、TempDataではなくViewDataを使用します。比較についてはこちらを確認してください:http ://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

設計に応じて、ユーザー/バスケットまたは必要なものを常にデータベースのtempdataに保存し、完了したかどうかを示す「IsReady」フィールドを用意して、後で取り込みたい場合に拡張できるようにすることができます。人々は自分のブラウザを閉じることができることに注意してください。


2
注:リンク先の記事はその時点では最新でしたが、MVC1についてのみ正確です。TempDataはMVC2で大幅に変更されました。
mikemanne、2011年

@mikemanne、ええ。しかし、答えは2008年後半からです。しかし、おそらく答えを更新する必要がありますか?
Filip Ekberg

0

すべての良い答えです。メッセージを渡すためにこれをご覧になりましたか。

TempDataとSessionは、ほとんどのセッションがメモリに格納されているため、RESTfulアーキテクチャの最良のアイデアを放棄しています。したがって、サーバーファームを使用する場合、ユーザーセッションは1つのサーバーに存在し、次の要求は別のサーバーに送信されます。

ここでメッセージを渡すためのTempDataの使い方を見てみましょう。

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

Mabyeこれは、別のページアラートへのリダイレクトにのみ使用される場合、クエリ文字列アプローチを使用するように適合させることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.