2012-02-08 17 views
34

Ho visto molti post su quando utilizzare ViewBag/ViewData vs ViewModel ma non sono stato in grado di trovare una spiegazione del ciclo di vita di ViewBag.ViewBag/ViewData Ciclo di vita

Per esempio, ho due metodi di azione in un unico controllore:

// POST: /MyModel/Edit/5 
[HttpPost] 
public ActionResult Edit(MyModel _mymodel){} 

e

// GET: /MyModel/Edit/5 
public ActionResult Edit(int id){} 

Se ho messo alcuni valori nel ViewBag nel metodo di azione GET, per impostare una qualche forma etichette, quindi quando l'utente fa clic sul pulsante "Invia" e il modulo viene registrato nuovamente sul server tramite HTTP POST, i valori ViewBag non sono più nel metodo di azione POST.

Qualcuno può spiegare (o fornire un riferimento a un buon articolo) il ciclo di vita di ViewBag/ViewData?

risposta

35

I dati inseriti in ViewBag/ViewData sono disponibili solo durante il ciclo di vita della richiesta in cui è stata popolata. MVC non ha postback. Se hai bisogno di qualcosa per persistere su più di una singola richiesta, dovresti usare Session.

Ecco un articolo decente sulle differenze tra Viewdata, ViewBag, e TempData: http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

+0

grazie per la risposta. Ho letto questo articolo e non tocca il ciclo di vita di ViewBag/ViewData ma fa leggermente su TempData. Per chiarire le cose, per "Post Back" intendevo solo che l'utente inviava un FORM, causando quindi una richiesta POST HTTP, che viene quindi gestita da un metodo di azione appropriato per i controller. – JTech

+1

L'articolo afferma "Tuttavia, una volta reindirizzati i controller, ViewBag e ViewData conterranno valori nulli." Esatto, lei non dice in modo specifico che il ciclo di vita di ViewBag e ViewData termina quando la richiesta è completa, ma lei lo sottintende. –

2

Da MSDN - ViewBag: Il dizionario visualizzazione dei dati dinamici, Viewdata: Il dizionario per i dati di visualizzazione.

Quindi questo/questo è un dizionario per una determinata vista. Tu imposti i suoi valori nella tua azione e la usi nella tua vista. Come Zach ha detto che non tornerà con la richiesta successiva. È possibile inviare i suoi valori a qualsiasi azione specificata come campo modulo, querystring, ecc., Ma questi valori non saranno automaticamente disponibili come proprietà di VieBag.

0

ViewBag e ViewData vengono utilizzati per lo stesso scopo. Sono usati per passare i dati dai controllori alla vista. Quando assegniamo a loro dati o oggetti sono accessibili nella vista.

  • ViewData: ViewData è un dizionario di oggetti e sono accessibili da stringa come chiave.
  • ViewBag: utilizza la funzione dinamica. Permette ad un oggetto di aggiungere proprietà dinamiche ad esso.
+0

Questo non è vero. Perché pensi ci siano 2? ViewBag è un sacchetto di proprietà dinamico per la vista stessa, come il titolo della pagina, i dati di localizzazione, come le etichette e può cambiare se l'azione del controllore, rende visualizzazioni diverse, come web/mobile ecc. E gli utenti devono cambiare lingua. ViewData è il modello, i dati passati alla vista per popolare la pagina con i dati, come la compilazione di controlli di input con valori o alcuni dati di risposta dell'utente. –

7

La risposta accettata qui non descrive realmente il ciclo di vita di ViewBag/ViewData. È spiacevole che non ci sia una documentazione chiara su questo. Tuttavia, sulla base di questo:

http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx

Sembrerebbe il ciclo di vita è: richiesta

IIS -> Routing -> MVC Handler -> Controller (con Viewdata) -> Visualizza (con Viewdata) - > Smaltimento

Quindi, il ViewData (che ViewBag semplicemente esegue il wrapping) in realtà verrà istanziato con ControllerContext, allo stesso tempo viene istanziato TempData. Ciò si verifica alcuni passaggi dopo il passaggio 4: Esecuzione di MVC Handler.

C'è un interessante passo successivo in cui "Se la Pagina ha ViewData, il ViewData è impostato" durante il trasferimento da Controller a Vista. ViewData è chiaramente disponibile prima di questo, quindi set non può significare istanziare. Sembra invece significare che viene trasferito dal Controller (che ricorda non è disponibile per una vista) al ViewContext (il contenitore che fornisce l'accesso Visualizza a ViewBag/ViewData e Modello).

Il ViewData è presumibilmente smaltito nello stesso momento del resto della vista.

È anche importante notare che le viste MVC vengono renderizzate dall'interno verso l'esterno, pertanto la Vista particolare e tutti i compiti assegnati al ViewBag si verificheranno nello stesso ordine dall'interno all'esterno. Ciò significa che un elemento impostato su una pagina figlio Vista sarà disponibile per un layout, ma l'aggiunta di qualcosa a un ViewBag in un layout e la successiva lettura in una pagina figlio Visualizza non andrà a buon fine.

Problemi correlati