Reindirizza all’azione e devi passare i dati

Ho un controller che gestisce tre azioni specifiche per il mio problema.

Il primo è l’azione di modifica che restituisce una vista con un modulo HTML che l’utente può modificare le proprietà sull’elemento specificato.

Il secondo è l’azione di aggiornamento che accetta il post di ritorno dal browser e aggiorna il database. Quando l’aggiornamento ha esito positivo, eseguiamo un reindirizzamento all’azione.

Il terzo è l’azione dello show che mostra i dettagli dell’object specificato. Questa azione è il punto in cui veniamo reindirizzati dopo un aggiornamento riuscito.

Il stream è:

Mostra -> Modifica -> Aggiorna (Successo: y -> reindirizza a Mostra, n -> torna Modifica)

Quello che voglio ottenere è far intervenire un flag quando l’aggiornamento è andato a buon fine, in modo che nella prossima vista Show posso visualizzare un messaggio di conferma per l’utente. Il problema è che non sono sicuro al 100% sul modo migliore per trasportare tali dati tramite la chiamata RedirectToAction (). Un pensiero che stavo usando era una stringa di query? Stiamo già portando le variabili in giro con la stringa di query per un altro scopo ma una parte della mia è scettica ad abusarne. La chiamata al reindirizzamento è sotto.

RouteValueDictionary dict = Foo.GetRouteValues(bar); RedirectToAction("Show", dict); 

Ho letto anche questa domanda, ma sono molto interessato all’utilizzo della proprietà TempData se non è necessario.

Domanda

Grazie per alcuni suggerimenti!

EDIT: Siamo spiacenti, originariamente non ho visto la tua nota su non voler usare TempData.

In poche parole: vuoi che il tuo messaggio riappaia se il client aggiorna / ricarica la pagina in cui sono stati reindirizzati?

Se lo fai, usa la querystring, qualcosa come:

 return(RedirectToAction("Index", new { message = "hi there!" })); 

e quindi definire

 public ActionResult Index(string message) { } 

o estrarre esplicitamente Request.QueryString [“message”] e passarlo alla View tramite ViewData nel solito modo. Questo funzionerà anche su browser che non accettano i cookie dal tuo sito.

Se NON si desidera visualizzare nuovamente il messaggio, ASP.NET MVC 1.0 fornisce la raccolta TempData per questo scopo esatto.

I valori delle proprietà TempData vengono archiviati nello stato di sessione fino alla successiva richiesta dallo stesso browser , dopo di che vengono cancellati, quindi se metti qualcosa in TempData immediatamente prima di ritornare a RedirectToAction, sarà disponibile sul risultato del reindirizzamento ma verrà cancellato subito dopo.

Ecco una semplice modifica al HomeController nel progetto di avvio di ASP.NET MVC:

 public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(string submitButton) { TempData["message"] = "You clicked " + submitButton; return(RedirectToAction("Index")); } public ActionResult About() { return View(); } 

e la vista corrispondente /Views/Home/Index.aspx dovrebbe contenere qualcosa del genere:

  <% if (TempData["message"] != null) { %> 

<%= Html.Encode(TempData["message"]) %>

<% } %> <% using (Html.BeginForm()) { %> <% } %>

Noterai che il messaggio TempData viene visualizzato immediatamente dopo una sequenza POST-REDIRECT-GET, ma se aggiorni la pagina, questa non verrà più visualizzata.

Si noti che questo comportamento è stato modificato in ASP.NET MVC 2: per ulteriori informazioni, vedere “Passaggio tra i metodi di azione” in questo articolo .

Non sono mai stato un fan di TempData e inoltre non volevo passare il flag di successo nell’URL come non volevo vedere

APP / Impostazioni? SaveSuccess = true

nella barra degli indirizzi del browser.

La mia soluzione utilizza un cookie temporaneo:

 [HttpPost] public ActionResult Settings(SettingsViewModel view) { if (ModelState.IsValid) { //save Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "")); return RedirectToAction("Settings"); } else { return View(view); } } 

e nella corrispondente azione Get controlla la presenza di questo Cookie ed eliminalo:

 [HttpGet] public ActionResult Settings() { var view = new SettingsViewModel(); //fetch from db and do your mapping bool saveSuccess = false; if (Request.Cookies["SettingsSaveSuccess"] != null) { Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "") { Expires = DateTime.Now.AddDays(-1) }); saveSuccess = true; } view.SaveSuccess = saveSuccess; return View(view); } 

nb questa può essere una pendenza abbastanza scivolosa se si inizia a passare qualcosa di più complesso di una bandiera booleana