Come reindirizzare all'azione in ASP.NET MVC senza perdere i dati della richiesta

StackOverflow https://stackoverflow.com/questions/1936

  •  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 POSTdati 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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top