web-dev-qa-db-ja.com

追加のViewDataを厳密に型指定された部分ビューに渡す

ProductImageを取得する厳密に型指定された部分ビューがあり、レンダリングされるときに、含まれているページで動的に作成する追加のViewDataも提供したいと思います。 RenderPartial呼び出しを使用して、強く型付けされたオブジェクトとカスタムViewDataの両方を部分ビューに渡すにはどうすればよいですか?

var index = 0;
foreach (var image in Model.Images.OrderBy(p => p.Order))
{
  Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial
  index++;
}
167
Nathan Taylor

RenderPartialは、単にViewDataDictionaryである別のパラメーターを取ります。あなたはほとんどそこにいるので、このように呼ぶだけです:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary { { "index", index } }
); 

これは、他のすべてのビューがデフォルトで持っているデフォルトのViewDataをオーバーライドすることに注意してください。 ViewDataに何かを追加する場合、部分ビューに渡すのはこの新しい辞書にはありません。

237
womp

Wompが投稿したものを拡張するには、次のようにViewDataDictionaryのコンストラクターオーバーロードを使用する場合、既存のビューデータを保持しながらcan新しいビューデータを渡します。

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
156
ctorx
@Html.Partial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } })
or
@{Html.RenderPartial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } });}

部分ページ(_ヘッダー):

<div class="row titleBlock">
    <h1>@ViewData["HeaderName"].ToString()</h1>
    <h5>@ViewData["TitleName"].ToString()</h5>
</div>
39
muthuvel

私はこれが機能しないはずだと思いますか?

ViewData["currentIndex"] = index;
8
Joel Martinez

強く型付けされたクラスを含む別のクラスを作成します。

クラスに新しいものを追加して、ビューに返します。

次に、ビューで、新しいクラスを継承し、エラーになるコードのビットを変更します。つまり、フィールドへの参照です。

お役に立てれば。そうでない場合はお知らせください。特定のコードを投稿します。

6
griegs

追加データを渡す最も簡単な方法は、@ Joel Martinezが注記しているように、ビューの既存のViewDataにデータを追加することです。ただし、ViewDataを汚染したくない場合、RenderPartialには、表示する2つの引数バージョンだけでなく、3つの引数を取るメソッドがあります。 3番目の引数はViewDataDictionaryです。渡したい追加データのみを含むパーシャル用に、個別のViewDataDictionaryを構築できます。

4
tvanfosson

これも動作するはずです。

this.ViewData.Add("index", index);

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 
0
MithunChopda

動的変数ViewBagを使用できます

ViewBag.AnotherValue = valueToView;
0
Jack1987