Scambiare informazioni tra controller in ASP.NET MVC

di Marco De Sanctis, in ASP.NET MVC, C#,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi