Übergeben Sie zusätzliche ViewData an eine stark typisierte Teilansicht

174

Ich habe eine stark typisierte Teilansicht, die ein ProductImage verwendet, und wenn es gerendert wird, möchte ich ihm auch einige zusätzliche ViewData bereitstellen, die ich dynamisch auf der enthaltenen Seite erstelle. Wie kann ich mit dem RenderPartial-Aufruf sowohl mein stark typisiertes Objekt als auch meine benutzerdefinierten ViewData an die Teilansicht übergeben?

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

Antworten:

251

RenderPartial verwendet einen anderen Parameter, der einfach ein ViewDataDictionary ist. Du bist fast da, nenn es einfach so:

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

Beachten Sie, dass dadurch die Standard-ViewData überschrieben werden, über die alle anderen Ansichten standardmäßig verfügen. Wenn Sie ViewData etwas hinzufügen, wird es in diesem neuen Wörterbuch nicht an Ihre Teilansicht übergeben.

womp
quelle
2
Ich versuche dies zu tun und es wird zurückgegeben "kann void nicht in Objekt konvertieren".
Programmad
4
@programad Versuchen Sie, das @ aus @ Html.RenderPartial () zu entfernen. Dadurch wurde das Problem für mich behoben, aber ich habe RenderPartial () in einer Zeile innerhalb eines @ {} -Codeblocks aufgerufen.
Danjarvis
5
Ich empfehle, die Antwort von ctorx unten zu lesen. Er fügt den vorhandenen ViewData zusätzliche Daten hinzu.
RaRaRa
162

Zu erweitern, was posted womp, Sie können neue Daten anzeigen passieren , während die vorhandene View Data Halte wenn Sie den Konstruktor Überlastung der Verwendung ViewDataDictionarywie folgt:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
ctorx
quelle
3
Dies kann sehr nützlich sein, wenn Sie die TemplateInfo.HtmlFieldPrefix
untergeordnete
12
Dies ist definitiv die bessere Lösung. Der Verlust der ViewData bedeutet, dass Sie den ModelState und alle Überprüfungen verlieren. +1
Kevin Farrugia
Dies scheint nur zu funktionieren, wenn Sie kein TemplateInfo.HtmlFieldPrefix in Ihrem ViewDataDictionary übergeben. Ich kann nur eine Variable übergeben, wie in der Antwort dargestellt, oder ein TemplateInfo.HtmlFieldPrefix übergeben, aber nicht beide.
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" } });}

Teilseite (_Header):

<div class="row titleBlock">
    <h1>@ViewData["HeaderName"].ToString()</h1>
    <h5>@ViewData["TitleName"].ToString()</h5>
</div>
Muthuvel
quelle
2
Dies scheint die vollständigste Antwort zu sein (obwohl .ToString () nicht erforderlich ist).
Colin
9

Ich denke das sollte nicht funktionieren?

ViewData["currentIndex"] = index;
Joel Martinez
quelle
6
Dies ist zwar keine sehr gute Methode, hat mir jedoch dabei geholfen, herauszufinden, wie ich einen Ansichtsdatenwert aus Womps Antwort abrufen kann.
Mathias Lykkegaard Lorenzen
6

Erstellen Sie eine weitere Klasse, die Ihre stark typisierte Klasse enthält.

Fügen Sie der Klasse Ihre neuen Inhalte hinzu und geben Sie sie in der Ansicht zurück.

Stellen Sie dann in der Ansicht sicher, dass Sie Ihre neue Klasse erben und die Codebits ändern, die jetzt fehlerhaft sind. nämlich die Verweise auf Ihre Felder.

Hoffe das hilft. Wenn nicht, lass es mich wissen und ich werde einen bestimmten Code posten.

Griegs
quelle
4

Der einfachste Weg, zusätzliche Daten zu übergeben, besteht darin, die Daten zu den vorhandenen ViewData für die Ansicht hinzuzufügen, wie @Joel Martinez feststellt. Wenn Sie Ihre ViewData jedoch nicht verschmutzen möchten, verfügt RenderPartial über eine Methode, die drei Argumente sowie die von Ihnen angezeigte Version mit zwei Argumenten akzeptiert. Das dritte Argument ist ein ViewDataDictionary. Sie können ein separates ViewDataDictionary nur für Ihren Teil erstellen, der nur die zusätzlichen Daten enthält, die Sie übergeben möchten.

Tvanfosson
quelle
1

Dies sollte auch funktionieren.

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

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 
MithunChopda
quelle
Vielen Dank! Dies ist sehr nützlich, wenn Sie das ViewData-Wörterbuch für untergeordnete Partials usw. erweitern
Developius
1

Ich weiß, dass dies ein alter Beitrag ist, aber ich bin auf ihn gestoßen, als ich mit Core 3.0 auf ein ähnliches Problem gestoßen bin. Ich hoffe, es hilft jemandem.

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

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

Sie können die dynamische Variable ViewBag verwenden

ViewBag.AnotherValue = valueToView;
Jack1987
quelle