web-dev-qa-db-ja.com

ASP.NET MVC-TempData-良いか悪いか

ASP.NET MVCのフォームエントリを処理するために、Scott GuのPreview 5ブログ投稿で詳述されているAcceptVerbsメソッドを使用しています。

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

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

何らかの理由で、TempDataを使用することに嫌悪感を抱いています。

これは妥当な懸念事項なのでしょうか、それともそれを補っているのでしょうか?

95
anonymous

一時データは、ユーザーに通知するための簡単なメカニズムであると考えています。彼らが最近やったことを思い出させるのは素晴らしいことですが、私はそれを何らかのユーザープロセスの必須ステップにすることもためらっています。その理由は、彼らがページを更新すると、それはなくなると信じています。まあ、私はそれが本当にどれほど信頼性があるかを明確に定義していないので、それを使うことをためらっていると思います。

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

25

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

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

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

失敗時には、formCollectionに入力された値とエラーメッセージのコレクションをPost ActionのTempDataに追加し、最初のAction Prodcuts/Newにリダイレクトしました。ビューにロジックを追加して、以前に入力した値とエラーメッセージをフォーム入力に入力しました。素敵できれいなようです!

76
JasonD

TempDataを使用する前にheすることをお勧めします。 TempDataはセッションに保存され、次の場合に意味があります。

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

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

31
John Rayner

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

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

3
Todd Smith

MVC3で セッションレスコントローラー を確認してください。セッションを使用すると、単一のユーザーのリクエストの並列実行が妨げられるため、パフォーマンスが低下することが判明しました。

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

3
aaimnr

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

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

2
Filip Ekberg

なぜあなたはそのような嫌悪感を持っていますか?このことは単純に仕事をして、うまくやることです:)

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

2
maxnk

すべての良い答えは、メッセージを渡すためにこれを見たことがありますか。

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

ここでは、メッセージを渡すためのTempDataのこの使用法について説明します。

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

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

0
WarrenDodsworth