Ek ViewData'yı Güçlü Yazılan Kısmi Görünüme Aktarma


174

Bir ProductImage alır güçlü yazılan bir Kısmi Görünüm var ve işlendiğinde ben de içeren sayfada dinamik olarak oluşturmak bazı ek ViewData sağlamak istiyorum. RenderPartial çağrısı ile hem güçlü bir şekilde yazılan nesneyi hem de özel ViewData'mı kısmi görünüme nasıl geçirebilirim?

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

Yanıtlar:


251

RenderPartial, yalnızca ViewDataDictionary olan başka bir parametre alır. Neredeyse oradasınız, sadece şöyle deyin:

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

Bunun, tüm diğer Görünümlerinizin varsayılan olarak sahip olduğu varsayılan ViewData'yı geçersiz kılacağını unutmayın. ViewData'ya bir şey ekliyorsanız, bu yeni sözlükte kısmi görünümünüze geçmeyeceksiniz.


2
Bunu yapmaya çalışıyorum ve "nesneye void dönüştüremiyorum" döndürüyor.
programad

4
@programad @ @ Html.RenderPartial () 'dan kaldırmayı deneyin, bu benim için bu sorunu düzeltti, ancak @ {} kod bloğundaki bir satırda RenderPartial () çağırıyordum.
danjarvis

5
Aşağıda ctorx'un cevabını kontrol etmenizi tavsiye ederim. Varolan ViewData öğesine ek veriler ekler.
raRaRa

162

Womp'un ne yayınladığını uzatmak için olabilir mevcut View Data korurken yapıcısı aşırı kullanırsanız yeni View Data geçmesi ViewDataDictionaryşöyle:

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

3
TemplateInfo.HtmlFieldPrefixaksi takdirde sıfırlanacak çocuk kontrolünde tutmanız gerekiyorsa bu çok yararlı olabilir
Simon_Weaver

12
Bu kesinlikle daha iyi bir çözümdür. ViewData'nın kaybedilmesi, ModelState'i ve tüm doğrulamaları kaybettiğiniz anlamına gelir. +1
Kevin Farrugia

Bu yalnızca ViewDataDictionary bir TemplateInfo.HtmlFieldPrefix geçmezseniz işe yarıyor gibi görünüyor. Sadece bir değişkeni cevabında ilustrated veya bir TemplateInfo.HtmlFieldPrefix geçebilir ama her ikisi de geçebilir.
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" } });}

Kısmi Sayfa (_Header):

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

2
Bu en eksiksiz yanıt gibi görünmektedir (.ToString () gereksiz olsa da).
Colin

9

Bence bu işe yaramıyor mu?

ViewData["currentIndex"] = index;

6
Bu bunu yapmanın çok güçlü bir yolu olmasa da, Womp'un cevabından bir görünüm verisi değerini nasıl alacağımı anlamama yardımcı oldu.
Mathias Lykkegaard Lorenzen

6

Güçlü yazdığınız sınıfı içeren başka bir sınıf oluşturun.

Yeni öğelerinizi sınıfa ekleyin ve görünümde döndürün.

Ardından görünümde, yeni sınıfınızı devraldığınızdan ve şimdi hatalı olacak kod parçalarını değiştirdiğinizden emin olun. yani alanlarınıza referanslar.

Bu yardımcı olur umarım. Değilse bana bildirin ve belirli bir kod göndereceğim.


4

Ek verileri iletmenin en kolay yolu, verileri görüntülemek için varolan ViewData öğesine @Joel Martinez notları olarak eklemektir. Ancak, ViewData kirletmek istemiyorsanız, RenderPartial üç argüman yanı sıra göstermek iki argüman sürümünü alır bir yöntem vardır. Üçüncü argüman bir ViewDataDictionary. Yalnızca geçmek istediğiniz fazladan verileri içeren kısmi parçalarınız için ayrı bir ViewDataDictionary oluşturabilirsiniz.


1

Bu da işe yaramalı.

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

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

Teşekkürler! Bu, çocuk kısmi vb. İçin ViewData sözlüğünü genişlettiğinizde gerçekten yararlıdır
developius

1

Bunun eski bir yazı olduğunu biliyorum ama çekirdek 3.0 kullanarak benzer bir sorunla karşılaştığımda karşılaştım, umarım birine yardımcı olur.

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

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

0

ViewBag dinamik değişkenini kullanabilirsiniz

ViewBag.AnotherValue = valueToView;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.