2009-08-04 13 views
30
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult CreateUser([Bind(Exclude = "Id")] User user) 
{ 
     ... 
     db.SubmitChanges(); 
     ViewData["info"] = "The account has been created."; 
     return RedirectToAction("Index", "Admin"); 
} 

Questo non mantiene il testo "informazioni" nel viewdata dopo il redirectToAction. Come posso aggirare questo problema nel modo più elegante?mantiene viewdata su RedirectToAction

La mia idea attuale è quella di mettere le cose dal controller Index in un [NonAction] e chiamare quel metodo sia dall'azione Index che dall'azione CreateUser, ma ho la sensazione che ci debba essere un modo migliore.

Grazie.

risposta

57

È possibile utilizzare TempData.

TempData["info"] = "The account has been created.".

TempData esiste esattamente per questa situazione. Usa Session come memoria, ma non sarà in giro dopo la seconda risposta.

Da MSDN:

Un utilizzo tipico di un oggetto TempDataDictionary è passare dati da un metodo d'azione quando reindirizza a un altro metodo di azione. Ad esempio, un metodo di azione potrebbe memorizzare informazioni su un errore nella proprietà TempData del controller (che restituisce un oggetto TempDataDictionary) prima di chiamare il metodo RedirectToAction. Il prossimo metodo di azione può quindi gestire l'errore e visualizzare una visualizzazione che visualizza un messaggio di errore.

+0

Interessante, mai sentito. :-) –

+2

è un peccato che tu debba usare "TempData" anche nella vista, e non puoi continuare a usare ViewData lì. Ma funziona bene, quindi grazie. –

+0

Vedere il metodo di estensione della copia http: //blog.eworldui.net/post/2008/06/MVC-Post-Redirect-Get-Sample-Updated.aspx –

10

Utilizzare ViewData se i dati devono essere accessibili in View durante questa "richiesta". Usa `TempData 'se i tuoi dati sono per la richiesta" successiva "(ad esempio POST-REDIRECT-GET design pattern).

+3

+1 per il modello PRG –

2

Se avete bisogno di questo più di una volta, una bella soluzione sarebbe la creazione di ActionFilterAttributes cui esportazione/importazione del TempData al Viewdata e viceversa. In questo modo puoi anche trasmettere il tuo ModelState in modo molto efficace (dimostrato here - # 13). Con alcune modifiche a quel pezzo di codice avresti una soluzione pulita, penso.

0

Poiché TempData sembra utilizzare lo storage e qualsiasi forma di ITempDataProvider che non è "in-process", richiede che l'oggetto sia serializzabile, TempData sembra tristemente inadeguato nelle situazioni di Web farm ... (ViewDataDictionary non è esso stesso serializzabile ...) Qualcuno ha qualche suggerimento per questo?

2

è possibile utilizzare la proprietà TempData controller, ma ha lo svantaggio che utilizza la memorizzazione delle sessioni in background. Ciò significa che avrai un lavoro extra per farlo funzionare in una web farm e in primo luogo avrai bisogno di abilitare le sessioni nella tua applicazione.

Un'alternativa è usare i cookie se hai solo bisogno di trasportare un breve messaggio. Ciò richiede una corretta crittografia del cookie. Non fare affidamento sulla proprietà TempData consente inoltre di impostare i messaggi in un contesto non MVC, ad esempio in una classica pagina ASHX.

Date un'occhiata a FlashMessage cui è possibile risparmiare un po 'di lavoro che attua da soli.