Passare ViewData aggiuntivi a una vista parziale fortemente tipizzata


174

Ho una vista parziale tipizzata in modo forte che prende un'immagine del prodotto e quando viene visualizzata vorrei anche fornirle alcuni ViewData aggiuntivi che creo dinamicamente nella pagina di contenimento. Come posso passare sia il mio oggetto fortemente tipizzato che il mio ViewData personalizzato alla vista parziale con la chiamata RenderPartial?

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

Risposte:


251

RenderPartial accetta un altro parametro che è semplicemente un ViewDataDictionary. Ci sei quasi, chiamalo così:

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

Tieni presente che questo sostituirà i ViewData predefiniti che hanno tutte le altre viste per impostazione predefinita. Se stai aggiungendo qualcosa a ViewData, non sarà in questo nuovo dizionario che stai passando alla vista parziale.


2
Sto provando a fare questo e sta tornando "impossibile convertire il vuoto in oggetto".
Programmato il

4
@programad Prova a rimuovere @ da @ Html.RenderPartial (), questo risolto il problema per me, ma stavo chiamando RenderPartial () su una linea all'interno di un blocco di codice @ {}.
danjarvis,

5
Raccomando di controllare la risposta di ctorx di seguito. Aggiunge ulteriori dati al ViewData esistente.
raRaRa,

162

Per estendere ciò che womp ha pubblicato, è possibile passare nuovi dati di visualizzazione mantenendo i dati di vista esistenti se si utilizza il sovraccarico del costruttore ViewDataDictionarysimile in questo modo:

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

3
questo può essere molto utile se è necessario conservare TemplateInfo.HtmlFieldPrefixil controllo figlio che verrà ripristinato altrimenti
Simon_Weaver

12
Questa è sicuramente la soluzione migliore. Perdere ViewData significa che si perde ModelState e tutte le convalide. +1
Kevin Farrugia,

Questo sembra funzionare solo se non si passa un TemplateInfo.HtmlFieldPrefix in ViewDataDictionary. Posso solo passare una variabile come illustrato nella risposta o passare un TemplateInfo.HtmlFieldPrefix ma non entrambi.
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" } });}

Pagina parziale (_Header):

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

2
Questa sembra la risposta più completa (sebbene il .ToString () non sia necessario).
Colin,

9

Penso che questo dovrebbe funzionare no?

ViewData["currentIndex"] = index;

6
Sebbene questo non sia un modo molto efficace per farlo, mi ha aiutato a capire come recuperare un valore di dati di vista dalla risposta di Womp.
Mathias Lykkegaard Lorenzen,

6

Crea un'altra classe che contenga la tua classe fortemente tipizzata.

Aggiungi le tue nuove cose alla classe e restituiscile nella vista.

Quindi, nella vista, assicurati di ereditare la tua nuova classe e modificare i bit di codice che ora saranno in errore. vale a dire i riferimenti ai tuoi campi.

Spero che questo ti aiuti. In caso contrario, fammi sapere e posterò un codice specifico.


4

Il modo più semplice per passare dati aggiuntivi è quello di aggiungere i dati al ViewData esistente per la vista come osserva @Joel Martinez. Tuttavia, se non vuoi inquinare ViewData, RenderPartial ha un metodo che accetta tre argomenti e la versione a due argomenti che mostri. Il terzo argomento è ViewDataDictionary. Puoi costruire un ViewDataDictionary separato solo per il tuo parziale contenente solo i dati extra che vuoi trasferire.


1

Anche questo dovrebbe funzionare.

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

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

Grazie! Questo è veramente utile quando si sta estendendo il dizionario Viewdata per i partial bambino ecc
developius

1

So che questo è un vecchio post, ma mi sono imbattuto in un problema simile utilizzando il core 3.0, spero che aiuti qualcuno.

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

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

0

È possibile utilizzare la variabile dinamica ViewBag

ViewBag.AnotherValue = valueToView;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.