web-dev-qa-db-de.com

Zusätzliche ViewData an eine stark typisierte Teilansicht übergeben

Ich habe eine stark typisierte Teilansicht, die ein ProductImage verwendet. Wenn es gerendert wird, möchte ich auch einige zusätzliche ViewData bereitstellen, die ich dynamisch auf der enthaltenden Seite erstelle. Wie kann ich mit dem Aufruf "RenderPartial" 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++;
}
157
Nathan Taylor

RenderPartial verwendet einen anderen Parameter, der einfach ein ViewDataDictionary ist. Sie sind fast da, nennen Sie es einfach so:

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

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

224
womp

Um das zu erweitern, was womp gepostet hat, können Sie View View View View [View Data] weitergeben, wobei die View Data-Daten beibehalten werden, wenn Sie die Konstruktorüberladung der ViewDataDictionary verwenden:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
147
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" } });}

Teilseite (_Header):

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

Ich denke das sollte nicht funktionieren?

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

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

Fügen Sie der Klasse Ihr neues Material hinzu und geben Sie es 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, dann lass es mich wissen und ich werde einen spezifischen Code posten.

6
griegs

Die einfachste Möglichkeit, zusätzliche Daten zu übergeben, besteht darin, die Daten zu den vorhandenen ViewData als @Joel Martinez-Notizen für die Ansicht hinzuzufügen. Wenn Sie ViewData jedoch nicht verschmutzen möchten, verfügt RenderPartial über eine Methode, die drei Argumente sowie die angezeigte Version mit zwei Argumenten akzeptiert. Das dritte Argument ist ein ViewDataDictionary. Sie können ein separates ViewDataDictionary für Ihr Partial erstellen, das nur die zusätzlichen Daten enthält, die Sie übergeben möchten.

4
tvanfosson

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

Html.RenderPartial ( "ProductImageForm", Image, This.ViewData ); 

Das sollte auch funktionieren.

0
MithunChopda

Sie können die dynamische Variable ViewBag verwenden

ViewBag.AnotherValue = valueToView;
0
Jack1987