web-dev-qa-db-ja.com

ViewBag / ViewDataライフサイクル

ViewBag/ViewData対ViewModelを使用するタイミングについて多くの記事を見てきましたが、ViewBagのライフサイクルの説明を見つけることができませんでした。

たとえば、1つのコントローラーに2つのアクションメソッドがあります。

// POST: /MyModel/Edit/5
[HttpPost]
public ActionResult Edit(MyModel _mymodel){}

そして

// GET: /MyModel/Edit/5
public ActionResult Edit(int id){}

GETアクションメソッドのViewBagに値を入力してフォームラベルを設定した場合、ユーザーが「送信」ボタンをクリックしてHTTP POSTを介してフォームがサーバーにポストバックされると、ViewBagの値はPOSTアクションメソッド。

誰かがViewBag/ViewDataのライフサイクルを説明してください(または良い記事への参照を提供してください)?

37
JTech

ViewBag/ViewDataに入れたデータは、データを入力したリクエストのライフサイクルでのみ使用できます。 MVCにはポストバックがありません。単一のリクエスト以上にわたって持続する何かが必要な場合は、Sessionを使用する必要があります。

ViewData、ViewBag、およびTempDataの違いに関する適切な記事を次に示します。 http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc- 3-アプリケーション

39
Zach Green

ここで受け入れられている答えは、ViewBag/ViewDataのライフサイクルを実際には説明していません。残念ながら、これに関する明確なドキュメントはないようです。ただし、これに基づいて:

http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx

ライフサイクルは次のように思われます。

IISリクエスト->ルーティング-> MVCハンドラー->コントローラー(ViewDataを使用)->表示(ViewDataを使用)->廃棄

したがって、ViewData(ViewBagが単にラップする)は、TempDataがインスタンス化されると同時にControllerContextで実際にインスタンス化されます。これは、ステップ4:MVCハンドラーの実行後のいくつかのステップで発生します。

コントローラーからビューへのハンドオフ中に「ページにViewDataがある場合、ViewDataが設定される」という興味深いステップが後にあります。 ViewDataはこれより前に明らかに利用可能であるため、セットはインスタンス化を意味することはできません。代わりに、コントローラー(ビューでは使用できない)からViewContext(ViewBag/ViewData、およびモデルへのビューアクセスを提供するコンテナー)に転送されることを意味するようです。

ViewDataは、おそらく残りのViewと同時に破棄されます。

また、MVCビューは内側から外側に向かってレンダリングされるため、特定のビューおよびViewBagに対する割り当ては、同様に内側から外側の順に発生することに注意することが重要です。つまり、View子ページに設定されたものはレイアウトで使用できますが、レイアウトのViewBagに何かを追加してからView子ページでそれを読み取ることはできません。

9
Chris Moschini

From [〜#〜] msdn [〜#〜] -ViewBag:動的ビューデータディクショナリ、ViewData:ビューデータのディクショナリ。

これら/これは、特定のビューの辞書です。アクションでその値を設定し、ビューで使用します。ザックが言ったように、それはその後のリクエストで戻ってきません。クエリ文字列などで、フォームフィールドとして任意のアクションにその値を送り返すことができますが、これらの値はVieBagのプロパティとして自動的に使用できません。

2
veblock

ViewBagViewDataは同じ目的で使用されます。コントローラからビューにデータを渡すために使用されます。データまたはオブジェクトを割り当てると、それらはビューでアクセス可能になります。

  • ViewDataViewDataはオブジェクトの辞書であり、文字列をキーとしてアクセスできます。
  • ViewBag:動的機能を使用します。オブジェクトが動的プロパティを追加できるようにします。
0
sudhakar