2010-12-14 14 views
0

モデルがあります(例:List<string>)。リストを構築する関数は非決定論的であり、要求の存続期間中に出力をコントローラとビューの両方で参照する必要があります。それは要求ごとであるため、静的でもシングルトンでもありません。ASP.NET MVCでコントローラとビューの間で共有データを処理するにはどうすればいいですか?

これは共通の構造であり、任意のビューまたはコントローラから参照できます。

私たちはビューからコントローラにアクセスすることはできません(原理的には同意します)ので、コントローラにそのコントローラを保持することはできません。現在、ViewData辞書に保存していて、コントローラーまたはビューで初期化しています(コントローラーがそれを必要としない場合)。

この目的のためにViewDataを使用すると、最初にコントローラーが消費するように作成されていないため、理想的でない可能性があります。コントローラとビューの間で共通の要求ごとのデータを共有するためのより良い方法はありますか?そうでない場合は、ViewDataを付けます。

HttpContext.Items辞書がありますが、この目的に合っているかどうかはわかりません。

+1

"HttpContext.Items辞書がありますが、この目的に合っているかどうかわかりません。" - ぴったりだ。それを使用してください。 –

+0

"最初に実行されるビューまたはコントローラで初期化します。"どのようにコントローラの前にビューを実行できますか? –

+2

実際にはAFAIK ViewDataは* HttpContext.Current.Itemsです。そして、いつから「ViewDataがコントローラによって消費されるように作成されましたか」? * View *によって消費されます。ここでは、データはコントローラによって提供されます。 – RPM1984

答えて

1

出力が要求

MVCの動作方法の寿命の間、コントローラとビューの両方で参照する必要がある、コントローラ内のアクションコードが実行され、得られたデータでありますビューエンジンに渡され、ビュー(データ)またはViewDataディクショナリへの呼び出しとともに渡された情報を使用してページを描画します。

私はあなたが何をしようとしているのか分かりませんが、それは技術的なものよりも悪いアプローチの問題であるように思えます(私は間違っているかもしれません)。

ビューがレンダリングされている間にコントローラが必要な理由を説明できますか? Listに関連付けられているロジックが必要な場合(それを処理する、または何かを行う)、リスト<T>を拡張する新しいクラスを作成し、コントローラの代わりにそのクラスにロジックを追加し、そのオブジェクトを渡しますView()またはViewData []を使用して、Viewにクラスを追加します。

+0

シンプルな、私は両方のレンダリングの決定とコントローラロジック、例えば 'OnActionExecuting'。しかし、データを変更すると、サービスから2回取得することはできません。 –

+1

Mmmm ...私はあなたが何をしようとしているのか理解し始めていると思う。私が正しく取得した場合は、コントローラのアクション、イベント、および属性内で共有するプロパティを含む新しいコントローラクラスをコントローラクラスに拡張し、そのプロパティをViewData []を使用してViewに送信します。 – salgiza

+0

それは私にも意味がありました。しかし、コントローラがそのデータを全く必要としない可能性が高い。コントローラとビューの両方がそれを参照していない場合、サービスを呼び出すべきではありません(遅延初期化とも呼ばれます)。だから私たちはコントローラで常に初期化していません。 –

0

コントローラの操作は常に最初に呼び出す必要があります。同じビュー/部分ビューを呼び出すコントローラが複数ある場合は、そのコードを1つのメソッドにリファクタリングして呼び出す必要があります。

実際に「一度アクセス」タイプの情報がTempDataでも、ViewDataがこのために設計されている場合は、ViewDataがこれを行うソリューションです。

+0

私の答えを編集して、コントローラがビューの後に実行されなかったことを明確にしました。コントローラがデータにまったくアクセスできないことがあり、それを構築するのはビューの責任となります。 –

+0

私の答えではない、私の質問:) –

0

あなたは何をしようとしていますか?

コントローラーからビューにいくつかのデータを渡す方法について質問しているようですが、これはやや些細な作業です。 MVC3の場合は、ViewData、yes、ViewBagを使用するか、ViewModelsを使用してください。

やや特殊な場合がありますか? 「ControllerとViewからの参照」とはどういう意味ですか?データはどこから来ていますか?通常は、ControllerはViewのデータを準備し、それをActionResult(またはより良いViewModelとして)として渡します。ビューは、コントローラをバイパスしてデータを取るべきではありません。

+0

Vasilioはあなたの興味のために感謝しますが、これはコメントではなく、答えにフィットします:)私はデータを提供するサービスクラスを持っています。このデータは生産に時間がかかり、2回生産することはできません。だから私は一度だけそれを引っ張る必要があります。ただし、データはコントローラとビューの両方で使用できます。私はすでに「オンデマンド」で構築しているので、どこに配置するかを考えようとしています。 –

+0

ご覧のとおり、私はこのサイトを使い始めました。残念ながら、私はコメントを追加することはできません、答えのみが許可されます。彼らがなぜこのようにしたのかわかりませんが、私はふりをしません:) –

+0

質問:なぜコントローラはViewによって開始された何かを知るべきですか?コントローラは、一般的に、データがどこに由来していても(Repos、Servicesなど)Viewのすべてのデータを準備します。コントローラが1回のリクエストでViewからのデータを必要とする場合は、おそらくアーキテクチャをレビューする理由になります。とにかく、より具体的なタスクの詳細は、正解を提供するのに役立ちます。 –

関連する問題