Alle volte può essere necessario mantenere alcune informazioni di stato nell'arco di più cicli Request/Response. Session, Cache e Cookie sono disponibili anche in ASP.NET MVC e possono essere utilizzati allo scopo ma, nel caso in cui si voglia mantenere in vita queste informazioni per il più breve tempo possibile, lo strumento che è preferibile utilizzare è il dictionary TempData, esposto dalla classe base Controller. A differenza degli storage classici infatti, il suo contenuto, a meno che non venga modificato, viene automaticamente rimosso nella request successiva a quella in cui è stato inserito.
Si tratta di un meccanismo particolarmente comodo se utilizzato, ad esempio, in corrispondenza di redirect tra una action e l'altra. Supponiamo che dopo aver eliminato un Customer si voglia riportare l'utente alla view che ne contiene l'elenco, mostrando però un messaggio che indichi il buon fine dell'operazione. L'action Delete, quindi, può utilizzare TempData per inviare un messaggio alla action Index:
public ActionResult Delete(int id) { customerRepository.Delete(id); this.TempData["message"] = string.Format("Customer {0} eliminato con successo", id); return this.RedirectToAction("Index"); }
Index, a sua volta, recupera il dato temporaneo e lo usa per popolare il model della view:
public ActionResult Index() { CustomerList model = new CustomerList(); model.Customers = ... model.Message = this.TempData["message"] as string; return this.View("Index", model); }
La view mostra l'eventuale messaggio prelevandolo dal suo model:
<h3><%= Html.Encode(this.Model.Message) %></h3>
L'aspetto interessante è che il dato viene automaticamente eliminato dopo il secondo postback (e quindi dopo essere stato utilizzato dalla Action Index). Pertanto se l'utente effettua un refresh della pagina, il messaggio sparisce come è lecito attendersi, senza che lo sviluppatore sia stato costretto ad inserire una qualsiasi logica di clean.
Un'ultima nota riguarda il fatto che TempData è, con le medesime logiche, accessibile direttamente anche dalla View:
<h3><%= Html.Encode(this.TempData["message"] %></h3>
Nel nostro esempio si è preferito sfruttare il model che ha il vantaggio di essere fortemente tipizzato, piuttosto che "inquinare" il markup con dizionari che, in caso di refactoring, sono una potenziale sorgente di bug a runtime.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Implementare il throttling in ASP.NET Core
Usare un KeyedService di default in ASP.NET Core 8
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Load test di ASP.NET Core con k6
I più letti di oggi
- anche domani dalle 17:30 seguite con noi live #build15 https://aspit.co/build15
- Webcast 'AJAX & ATLAS Overview'
- a #igds il 25 e 26/10 a Milano puoi sviluppare un gioco per #wp8 con @AppCampus. in palio 70.000 Euro: https://aspit.co/apa
- WinJS in Windows Phone 8.1
- la RC di #vs13 è compatibile con #win81 RTM, non con la Preview. l'annuncio ufficiale è su https://aspit.co/any
- Ancora un bug: esce Mono 0.23
- SSL Certificates for everyone on Azure
- Mostrare una MessageBox con un custom control
- disponibile la preview 1 ci #dotnetcore 2.1, #aspnetcore, #efcore. performance, novità e migliorie su https://aspit.co/bmf
- si continua a #netconfit con 'developing modern web apps with #aspnetcore', con il nostro @dbochicchiohttps://aspit.co/netconf-18