Lewati ViewData Tambahan ke Tampilan Parsial Sangat Diketik

174

Saya memiliki Tampilan Parsial yang sangat diketik yang menggunakan ProductImage dan ketika ditampilkan, saya juga ingin memberikan beberapa ViewData tambahan yang saya buat secara dinamis di halaman yang berisi. Bagaimana saya bisa meneruskan objek yang sangat diketik dan ViewData khusus saya ke tampilan sebagian dengan panggilan RenderPartial?

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

Jawaban:

251

RenderPartial mengambil parameter lain yang hanya berupa ViewDataDictionary. Anda hampir sampai di sana, sebut saja seperti ini:

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

Perhatikan bahwa ini akan mengesampingkan ViewData default yang dimiliki semua Tampilan Anda lainnya secara default. Jika Anda menambahkan sesuatu ke ViewData, kamus baru ini tidak akan Anda lewati ke tampilan parsial Anda.

womp
sumber
2
Saya mencoba melakukan ini dan mengembalikan "tidak dapat mengonversi void ke objek".
programad
4
@programad Cobalah menghapus @ dari @ Html.RenderPartial (), ini memperbaiki masalah itu untuk saya, tapi saya memanggil RenderPartial () pada baris dalam blok kode @ {}.
danjarvis
5
Saya sarankan memeriksa jawaban ctorx di bawah ini. Dia menambahkan data tambahan ke ViewData yang ada.
raRaRa
162

Untuk memperluas apa yang diposting, Anda bisa meneruskan Data Tampilan baru sambil mempertahankan Data Tampilan yang ada jika Anda menggunakan konstruktor yang berlebihan ViewDataDictionaryseperti:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
ctorx
sumber
3
ini bisa sangat berguna jika Anda perlu mempertahankan TemplateInfo.HtmlFieldPrefixkontrol anak yang akan direset sebaliknya
Simon_Weaver
12
Ini jelas merupakan solusi yang lebih baik. Kehilangan ViewData berarti Anda kehilangan ModelState dan semua validasi. +1
Kevin Farrugia
Ini tampaknya berfungsi hanya jika Anda tidak memberikan TemplatInfo.HtmlFieldPrefix di ViewDataDictionary Anda. Saya hanya bisa meneruskan variabel seperti yang diilustrasikan pada jawaban, atau meneruskan TemplateInfo.HtmlFieldPrefix tetapi tidak keduanya.
Ferox
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" } });}

Halaman Sebagian (_Header):

<div class="row titleBlock">
    <h1>@ViewData["HeaderName"].ToString()</h1>
    <h5>@ViewData["TitleName"].ToString()</h5>
</div>
muthuvel
sumber
2
Ini sepertinya jawaban yang paling lengkap (meskipun .ToString () tidak perlu).
Colin
9

Saya pikir ini tidak harus bekerja?

ViewData["currentIndex"] = index;
Joel Martinez
sumber
6
Meskipun ini bukan cara yang sangat kuat untuk melakukannya, itu memang membantu saya mencari cara untuk mengambil nilai data tampilan dari jawaban Womp.
Mathias Lykkegaard Lorenzen
6

Buat kelas lain yang berisi kelas sangat Anda ketik.

Tambahkan barang baru Anda ke kelas dan kembalikan di tampilan.

Kemudian dalam tampilan, pastikan Anda mewarisi kelas baru Anda dan mengubah bit kode yang sekarang akan menjadi kesalahan. yaitu referensi ke bidang Anda.

Semoga ini membantu. Jika tidak, beri tahu saya dan saya akan mengirimkan kode tertentu.

grieg
sumber
4

Cara termudah untuk melewatkan data tambahan adalah menambahkan data ke ViewData yang ada untuk tampilan sebagai catatan @ Joel Martinez. Namun, jika Anda tidak ingin mencemari ViewData Anda, RenderPartial memiliki metode yang membutuhkan tiga argumen serta versi dua argumen yang Anda perlihatkan. Argumen ketiga adalah ViewDataDictionary. Anda dapat membuat ViewDataDictionary terpisah hanya untuk parsial Anda yang hanya berisi data tambahan yang ingin Anda sampaikan.

tvanfosson
sumber
1

Ini juga harus bekerja.

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

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 
MithunChopda
sumber
Terima kasih! Ini sangat berguna ketika Anda memperluas kamus ViewData untuk parsial anak, dll.
developius
1

Saya tahu ini adalah posting lama tapi saya menemukan ketika dihadapkan dengan masalah serupa menggunakan core 3.0, semoga membantu seseorang.

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

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

Anda dapat menggunakan variabel dinamis ViewBag

ViewBag.AnotherValue = valueToView;
Jack1987
sumber