Come reindirizzare all'azione in ASP.NET MVC senza perdere i dati della richiesta
-
08-06-2019 - |
Domanda
Utilizzando ASP.NET MVC ci sono situazioni (come l'invio di moduli) che potrebbero richiedere a RedirectToAction
.
Una di queste situazioni è quando riscontri errori di convalida dopo l'invio di un modulo e devi reindirizzare al modulo, ma desideri che l'URL rifletta l'URL del modulo, non la pagina di azione a cui viene inviato.
Poiché richiedo che il modulo contenga il file originariamente POST
dati modificati, per comodità dell'utente, nonché a fini di convalida, come posso trasmettere i dati attraverso il RedirectToAction()
?Se utilizzo il parametro viewData, my POST
i parametri verranno modificati in GET
parametri.
Soluzione
La soluzione consiste nell'utilizzare la proprietà TempData per archiviare i componenti Request desiderati.
Ad esempio:
public ActionResult Send()
{
TempData["form"] = Request.Form;
return this.RedirectToAction(a => a.Form());
}
Quindi nella tua azione "Form" puoi andare:
public ActionResult Form()
{
/* Declare viewData etc. */
if (TempData["form"] != null)
{
/* Cast TempData["form"] to
System.Collections.Specialized.NameValueCollection
and use it */
}
return View("Form", viewData);
}
Altri suggerimenti
Tieni presente che TempData memorizza la raccolta dei moduli in sessione.Se non ti piace questo comportamento, puoi implementare la nuova interfaccia ITempDataProvider e utilizzare qualche altro meccanismo per archiviare i dati temporanei.Non lo farei a meno che tu non sappia con certezza (tramite misurazione e profilazione) che l'uso dello stato della sessione ti sta danneggiando.
Dare un'occhiata a MVCContributo, Puoi farlo:
using MvcContrib.Filters;
[ModelStateToTempData]
public class MyController : Controller {
//
...
}
Esiste un altro modo per evitare tempdata.Il modello che mi piace prevede la creazione di 1 azione sia per il rendering originale che per il nuovo rendering del modulo non valido.Funziona più o meno così:
var form = new FooForm();
if (request.UrlReferrer == request.Url)
{
// Fill form with previous request's data
}
if (Request.IsPost())
{
if (!form.IsValid)
{
ViewData["ValidationErrors"] = ...
} else {
// update model
model.something = foo.something;
// handoff to post update action
return RedirectToAction("ModelUpdated", ... etc);
}
}
// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();
Più o meno lo schema è questo.Un po' pseudoy.Con questo puoi creare 1 vista per gestire il rendering del modulo, visualizzare nuovamente i valori (poiché il modulo verrà riempito con i valori precedenti) e mostrare i messaggi di errore.
Quando si pubblica questa azione, se è valida, trasferisce il controllo a un'altra azione.
Sto cercando di rendere questo modello semplice nel file quadro di convalida .net mentre sviluppiamo il supporto per MVC.
Se desideri passare i dati all'azione reindirizzata, il metodo che potresti utilizzare è:
return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like public ActionResult ModelUpdated(int id);