2011-12-16 10 views
1

これはあるMVC 2峠ViewDataをMVCにユーザーコントロール

これは私のユーザーコントロール

Foo = <%= ViewData["Foo"] %> 

<ul id="menu" class="topTabMenu"> 
    <% foreach (X.Site s in X.AllSites) { %> 
    ... 

の一部であり、これは、私はそれを呼んでいる方法です:

<% Html.RenderPartial("MenuTabsPartial", Model, new ViewDataDictionary(new { Foo = "Bar" })); %> 

ViewData["Foo"]に「バー」を表示させるにはどうすればよいですか?いくつかの単純なデータをこの部分に渡すより良い方法がありますか?

私はすでに他のモデルのためにModelを使用しているので、モデルに渡すことはではありません。は動作しません。手動でTempDataをにこの値を割り当てる

EDIT

は、作業を行います。私は代わりにTempDataを使うべきですか? ViewDataはコントローラからのみ設定できますか? ViewData上のMicrosoftのドキュメントによると

答えて

1

、それは:

は、データが コントローラとビューの間を通過するために含まれている辞書を取得または設定します。

したがって、この定義だけでは、ViewDataはコントローラからしか設定できないと言っていいでしょう。 TempDataがあなたのために働くなら、私はそれを使用します。ダイナミクスを恐れていない場合は、ViewBagを試すこともできます。

編集:ViewBagについての私のコメントを無視して、あなたの質問にMVC2というタグが付いていなかったと思います。

+0

私はこれらのドキュメントを見ていたはずです。ありがとうございました。私たちがMVC3にアップグレードすれば、私はViewBag全体になります。もう一度おねがいします –

1

匿名オブジェクトでViewDataDictionaryを作成できるかどうかはわかりません。別のViewDataDictionaryを使用してオーバーロードを試みます。これにより、ViewData ["foo"]に "Bar"が表示されます。

Html.RenderPartial("MenuTabsPartial", Model, new ViewDataDictionary(new ViewDataDictionary { { "Foo", "bar" } })); 

私はこれを1回または2回実行しましたが、実際にモデルに渡すことを検討する必要があります。あなたのモデルがまだのモデルモデルでない場合は、現在の "モデル"と "Foo"の2つのプロパティでモデルを作成することをお勧めします。コントローラーがこれを設定し、それをビューに渡します。

class MyViewModel 
{ 
    public TypeOfMainModel MainModel {get; set;} //put your current model here 
    public string Foo {get; set;} 
} 

このビューをビューモデルとして使用してください。あなたの部分をレンダリングする場合次に、あなただけのモデル全体を渡すことができ、または(あなたの部分図は、文字列のみを必要に応じて)おそらくちょうどそれにはFooを与える:

Html.RenderPartial("MenuTabsPartial", Model.Foo); 

選択はあなた次第ですが、そのビューモデルのコンテナを作成しますビューに必要なものがすべて保持されており、パーシャルビューが私の好みのアプローチです。

+0

私は通常Viewに必要なものすべてを持つ堅牢なViewModelを作成することをお勧めしますが、これは従来のシステム(MVC 2)であり、TempDataは正しいパスだと思います。 +1、ありがとう –

関連する問題