Come RedirectToAction in ASP.NET MVC senza perdere i dati di richiesta

voti
115

Utilizzando ASP.NET MVC vi sono situazioni (come la forma di presentazione) che possono richiedere una RedirectToAction.

Una situazione del genere è quando si verificano errori di convalida dopo un invio di un modulo e la necessità di reindirizzare torna alla forma, ma vorrebbe l'URL in modo da riflettere l'URL della forma, non la pagina azione che essa sottomette.

Come richiedo il modulo per contenere i originariamente POSTdati di ED, per una maggiore comodità d'uso, così come scopi di convalida, come posso passare i dati attraverso il RedirectToAction()? Se uso il parametro Viewdata, i miei POSTparametri verranno modificati in GETparametri.

È pubblicato 05/08/2008 alle 06:33
fonte dall'utente
In altre lingue...                            


5 risposte

voti
76

La soluzione è quella di utilizzare la proprietà TempData per memorizzare i componenti richiesta desiderata.

Per esempio:

public ActionResult Send()
{
    TempData["form"] = Request.Form;
    return this.RedirectToAction(a => a.Form());
}

Poi nella vostra azione "Form" si può 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);
}
Risposto il 05/08/2008 a 06:43
fonte dall'utente

voti
36

Tenete a mente che TempData memorizza la raccolta modulo in sessione. Se non ti piace che il comportamento, è possibile implementare la nuova interfaccia ITempDataProvider e usare qualche altro meccanismo per la memorizzazione dei dati temporanei. Io non lo farei se non si sa per certo (tramite la misurazione e la profilatura) che l'uso di stato sessione è male voi.

Risposto il 07/08/2008 a 06:12
fonte dall'utente

voti
13

Date un'occhiata a MvcContrib , si può fare questo:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Risposto il 05/04/2009 a 10:36
fonte dall'utente

voti
8

C'è un altro modo che evita TempData. Il modello che piace implica la creazione di 1 azione sia per l'originale rendering e ri-rendering del modulo valido. E '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();

Questo è il modello più o meno. Un po 'pseudoy. Con questo è possibile creare 1 visita per gestire il rendering la forma, ri-visualizzazione dei valori (dal momento che il modulo sarà riempito con valori precedenti), e mostrando i messaggi di errore.

Quando l'annuncio a questa azione, se valida trasferisce il controllo su di un'altra azione.

Sto cercando di rendere questo modello semplice nel quadro di convalida di .NET , come si costruisce il supporto per MVC.

Risposto il 25/08/2008 a 23:06
fonte dall'utente

voti
2

Se si desidera passare i dati al un'azione riorientata, il metodo si può utilizzare è:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Risposto il 30/11/2013 a 09:39
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more