2011-10-12 6 views
24

Sono confuso con questo: Ho un'azione, ad esempio Parent, e nel file di visualizzazione corrispondente, ho chiamato un'azione child, ad esempio Child, entrambe le azioni Parent e Child si trovano nello stesso controller. ?Un'azione figlio condivide lo stesso ViewBag con la sua azione "genitori"?

e ho bisogno l'azione del bambino e l'azione Parent per condividere alcuni dati nel ViewBag.Now, che cosa devo fare qui è la mia domanda:

quando chiamo l'azione Bambino in file di vista dei genitori, ho passare il viewbag in questo modo: @ Html.Action (ViewBag). nella mia azione bambino, faccio questo:

public PartialViewResult Child(Object ViewBag) 
{ 
    //using the data in ViewBag 
} 

E 'questo il modo giusto? L'oggetto viewbag è passato per riferimento oppure è un oggetto diverso dal viewbag originale (più memoria necessaria)?

Oppure se l'azione Bambino condivide il viewbag con l'azione principale chiamante per impostazione predefinita?

Dalla risposta di Darin Dimitrov, sapevo che non posso fare qualcosa di simile: @ Html.Action (ViewBag)

Ma ho davvero bisogno di passare all'azione bambino muti-parametri, cosa posso fare?

+3

Si prega di non inserire il prefisso vostre domande con cose come "[NET MVC3]". Su [so], usiamo i tag per questo scopo. –

+0

Si potrebbe prendere in considerazione Html.Partial invece se l'azione figlio non è completamente separata dal genitore – Bochu

risposta

31

Le azioni figlio seguono un diverso ciclo di vita di controller/modello/vista rispetto alle azioni padre. Di conseguenza non condividono ViewData/ViewBag. Se si vuole passare parametri a un'azione di bambino dal genitore che si potrebbe fare questo:

@Html.Action("Child", new { message = ViewBag.Message }) 

e nell'azione bambino:

public ActionResult Child(string message) 
{ 
    ... 
} 
+1

Grazie per la risposta, ma cosa succede se voglio passare l'azione figlio più di un messaggio (parametro)? Grazie ancora :) – NextStep

+1

Non puoi semplicemente inviarlo, ad esempio, 'new {message = ViewBag.Message, param2 = somethingElse}'? –

+0

Scusa, ma ho bisogno di passare all'azione figlio le cose che fluiscono: un ID (int), un messaggio (stringa) e un oggetto (il mio oggetto personalizzato), quindi, penso che sia del tutto sbagliato pensare di usare questo approccio ? C'è modo di passare un'azione di un bambino così tante cose contemporaneamente? :) – NextStep

12

C'è una via, ma è necessario creare un costume classe astratta come classe base per le tue visualizzazioni di rasoio. Quindi esporre tutto ciò che è necessario da azioni da genitori a figli. Questo è come ottenere ViewBag del controller principale all'interno di una classe che eredita da WebViewPage

private dynamic GetPageViewBag() 
    { 
     if (Html == null || Html.ViewContext == null) //this means that the page is root or parial view 
     { 
      return ViewBag; 
     } 
     ControllerBase controller = Html.ViewContext.Controller; 

     while (controller.ControllerContext.IsChildAction) //traverse hierachy to get root controller 
     { 
      controller = controller.ControllerContext.ParentActionViewContext.Controller; 
     } 
     return controller.ViewBag; 
    } 
+1

In Azione figlio mio, sto solo chiamando 'ViewBag.Variable = ControllerContext .ParentActionViewContext.ViewBag.Variable'. C'è probabilmente un modo per scorrere e ottenere copiate tutte le variabili, ma ne avevo solo bisogno. Grazie per il punto di partenza. – bradlis7

+0

Prova a trasmettere il viewbag al dizionario se desideri eseguire il loop. – mitsbits

Problemi correlati