2011-10-03 11 views
8

Sto lavorando su un'applicazione ASP.NET MVC 3 web, dove io uso TempData per memorizzare un oggetto del modello, nello scenario in cui l'utente non è connesso aTempData non essere sgomberati

Ecco il flusso.:

  1. Usa modulo di invio.
  2. Il codice (filtro azioni speciali) aggiunge il modello a TempData, reindirizza alla pagina di accesso.
  3. utente reindirizzato indietro per ottenere l'azione, in cui si legge TempData e chiama POST l'azione direttamente

Dopo il punto 3, avrei TempData pensato che sarebbe stato eliminato?

Ecco il codice:

[HttpGet] 
public ActionResult Foo() 
{ 
    var prefilled = TempData["xxxx"] as MyModel; 
    if (prefilled != null) 
    { 
     return Foo(prefilled); 
    } 
} 

[HttpPost] 
[StatefulAuthorize] // handles the tempdata storage and redirect to logon page 
public ActionResult Foo(MyModel model) 
{ 
    // saves to db.. etc 
} 

ho trovato this article che afferma:

  1. Gli articoli sono rimossi solo dalla TempData al termine di una richiesta se essi sono stati contrassegnati per la rimozione.
  2. Gli articoli vengono contrassegnati per la rimozione solo quando vengono letti.
  3. Gli articoli possono essere deselezionati chiamando TempData.Keep (chiave).
  4. RedirectResult e RedirectToRouteResult chiama sempre TempData.Keep().

Beh, leggendolo con TempData["xxx"] non è una "lettura" e quindi dovrebbero essere taggati per la rimozione?

E l'ultimo mi riguarda un po '- dal momento che sto facendo un reindirizzamento dopo il POST (P-R-G). Ma questo non può essere evitato.

C'è un modo per dire "metti da parte questo oggetto". TempData.Remove? O sto sbagliando?

+0

È necessario eseguire un reindirizzamento completo e non restituire un secondo metodo di azione. Ecco perché non funziona. – Buildstarted

+0

@BuildStarted - ma il metodo POST * fa * un reindirizzamento una volta terminato. Non puoi eseguire un reindirizzamento a un metodo POST, non sarà un GET? – RPM1984

+0

Bene, da quello che sto leggendo in base ai dati limitati è che stai facendo un get e un reindirizzamento * in codice * a un post - che 'StatefulAuthorize' non verrà chiamato. – Buildstarted

risposta

9

Risolto aggiungendo TempData.Remove subito dopo averlo letto.

Non proprio contento di questo. Ho pensato che l'intero punto di TempData fosse che io, , non ho dovuto fare questo.

Può anche utilizzare direttamente Session.

+0

Non è questo il modo per eliminarlo. Potresti avere usato Session piuttosto che TempData. Solo il vantaggio con TempData è che gestisce i dati da solo. Come ho avuto risposta in precedenza, il valore viene cancellato solo quando l'azione risulta in 200 (come ViewResult/ContentResult/JsonResult) in tutti gli altri scenari, precisamente qualsiasi azione risultante con il codice di stato HTTP di 302 (come RedirectAction) manterrà il valore dati in TempData. Leggi i dettagli per ulteriori dettagli http://stackoverflow.com/questions/32571599/asp-net-tempdata-isnt-cleared-even-after-reading-it –

6

Ci sono 2 GET HTTP richieste coinvolte qui:

  1. La prima richiesta viene inviato dal client ed è quello che memorizza qualcosa in TempData
  2. Alla fine della prima richiesta il client invia una seconda richiesta HTTP per recuperare la pagina di accesso.

Nessuna richiesta POST è coinvolta nel proprio scenario. Il fatto che dall'azione GET Foo stiate invocando l'azione POST Foo non significa che sia stata eseguita una richiesta separata (siete ancora nel contesto della richiesta GET iniziale). È solo una chiamata al metodo C#, non una richiesta separata.

Memorizza qualcosa in TempData durante la prima richiesta e questo TempData sarà disponibile per il secondo. Quindi sarà disponibile nell'azione del controller che mostra la pagina di accesso.

Quindi è necessario leggere da TempData in azione il rendering della pagina di accesso se si desidera rimuovere TempData.

+0

Il tuo diritto. Ma non me ne importa niente sulla pagina di accesso. Sto tentando di eseguire un "post automatico" al momento dell'accesso, quindi non è necessario inviare nuovamente il modulo. Ecco perché sto "chiamando" direttamente la mia azione POST (so che non è una richiesta separata). Quindi suppongo che non dovrei usare TempData, dal momento che sono 2 richieste successive per le quali ho bisogno dei dati, non di quello successivo. – RPM1984

3

Di seguito sono riportati alcuni dei punti chiave da tenere in considerazione quando si utilizzano i dati temporanei.

1) Un accesso in lettura ai dati temporanei non rimuove gli elementi dal dizionario immediatamente, ma segna solo per la cancellazione.

2) I dati temporanei non rimuoveranno sempre l'elemento a cui è stato effettuato l'accesso. Rimuove solo l'oggetto quando un'azione provoca un codice di stato Http 200 (ViewResult/JsonResult/ContentResult, ecc.).

3) In caso di azioni che comportano un Http 302 (come qualsiasi azione di reindirizzamento), i dati vengono conservati in memoria anche quando vi si accede.

Problemi correlati