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


174

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

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

回答:


251

RenderPartialは、単にViewDataDictionaryである別のパラメーターを取ります。あと少しで完了です。次のように呼び出します。

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

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


2
私はこれをやろうとしていて、「voidをオブジェクトに変換できません」を返しています。
programad 2012年

4
@programad @ Html.RenderPartial()から@を削除してみてください。これで問題が解決しましたが、@ {}コードブロック内の行でRenderPartial()を呼び出していました。
danjarvis

5
以下のctorxの回答を確認することをお勧めします。彼は既存のViewDataにデータを追加します。
raRaRa 2016年

162

以下のようなコンストラクタオーバーロードを使用する場合は、ポストされたwompを拡張するために、既存のビューデータを保持しながら、新しいビューデータを渡すことができますViewDataDictionary

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

3
あなたが保持する必要がある場合、これは非常に役立ちますTemplateInfo.HtmlFieldPrefixそれ以外の場合はリセットされ、子コントロールに
Simon_Weaver

12
これは間違いなく優れたソリューションです。ViewDataが失われると、ModelStateとすべての検証が失われます。+1
Kevin Farrugia、2015

これは、ViewDataDictionaryでTemplateInfo.HtmlFieldPrefixを渡さない場合にのみ機能するようです。回答で示されている変数のみを渡すか、TemplateInfo.HtmlFieldPrefixを渡すことができますが、両方を渡すことはできません。
Ferox 2016年

45
@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" } });}

部分的なページ(_Header):

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

2
これは最も完全な答えのようです(ただし、.ToString()は不要です)。
Colin


6

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

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

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

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


4

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


1

これも機能するはずです。

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

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

ありがとう!あなたは子パーシャルなどのためのViewData辞書を拡張しているとき、これは本当に便利です
developius

1

私はこれが古い投稿であることを知っていますが、コア3.0を使用して同様の問題に直面したときに遭遇しました。

@{
Layout = null;
ViewData["SampleString"] = "some string need in the partial";
}

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.