Domanda

Sto eseguendo il rendering di un modulo di accesso comune utilizzando Html.RenderAction, su ogni pagina del mio sito.

Se l'utente inserisce i propri dettagli nella casella di testo e fa clic su "Invia", invia un POST a un controller che gestisce l'accesso.

Se commettono un errore, come l'inserimento di un indirizzo e-mail non valido, popolerà ModelState con un messaggio di errore e quindi reindirizzerà alla pagina in cui si trovavano prima.

Il problema è che, poiché RenderAction si presenta come una richiesta separata, sto perdendo ViewModel.

Anche quando lo inserisco in TempData, viene perso, poiché TempData viene scaricato su ogni richiesta separata.

Esiste un modo per preservare i dati tra chiamate Html.RenderAction consecutive?

In caso contrario, qualche suggerimento su come potrei essere in grado di hackerarlo? (Dovresti mettere i dati in sessione?)

È stato utile?

Soluzione

Ecco cosa ho fatto per il momento. (Questa probabilmente non è la soluzione più ideale.)

Ho creato un 'PreserveViewDataAttribute', che ho messo su qualsiasi azione per la quale voglio preservare il ViewData nella sessione.

Nel mio BaseController, ho ignorato il metodo "Reindirizzamento" con il mio metodo, che procede come segue.

  1. Ottiene un riferimento al metodo Action che lo ha chiamato (un po 'di riflessione qui)

  2. Verifica se questo metodo ha "PreserveViewDataAttribute" definito su di esso

  3. In tal caso, copia il ViewData corrente in una variabile Session. (L'etichetta della variabile è la stessa dell'attuale nome dell'azione, con "_ViewData" alla fine.)

  4. In entrambi i casi, chiama il metodo di reindirizzamento di base.

Quindi ho creato una proprietà in BaseController chiamata 'PreservedViewData', che restituisce ViewData in sessione, rilevante per l'azione corrente. (O restituisce null se non trovato).

Pertanto, per preservare ViewData per tutto il tempo che voglio, devo solo decorare la mia azione con 'PreserveViewDataAttribute', e quindi chiamare 'PreservedViewData' ogni volta che ne ho bisogno.

Fammi sapere se vuoi il codice sorgente per questo.

Altri suggerimenti

Potrebbe piacerti l'approccio di questa sezione post-reindirizzamento di Kazi Rashid.

http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top