2013-04-22 14 views
7

Ho un filtro azione personalizzato, che all'interno di OnActionExecuting, in base a determinati criteri, disconnette un utente e li reindirizza alla home page del sito. Il codice (di nuovo messo a nudo) per la parte di reindirizzamento è al di sottoImpostazione di TempData all'interno di ActionFilterAttribute

filterContext.Controller.TempData.Add("key", "Message"); 

    filterContext.Result = new RedirectResult("/"); 

Come sopra, sono anche l'impostazione di un messaggio TempData. Poiché l'utente è stato disconnesso, quando ha colpito la pagina iniziale, l'attributo [Authorize] li reindirizzerà alla pagina di accesso GET. Nella vista di accesso, sto visualizzando tutti i messaggi dall'interno di tempData. Tuttavia in questa situazione il tempData è vuoto.

Questo è un comportamento molto simile a come funziona il mio POST di accesso (se non valido, reindirizza a casa, che reindirizza per accedere e visualizza il messaggio tempData impostato nel post di accesso). Questo codice può essere visto sotto

TempData.Add("key", errorMessage); 

    return Redirect("/")); 

Il motivo che sto facendo in questo modo, invece di reindirizzare specificamente alla pagina di login è perché questo codice è distribuita su molti siti, in modo da non so cosa l'url di accesso GET è .

Qualcuno ha qualche informazione sul perché questo funziona per il POST di login ma non per il reindirizzamento di ActionFilter?

Edit:

Se rimuovo la chiamata di logout all'interno del filtro azione personalizzata, il TempData è ancora impostato all'interno dell'azione casa - tuttavia questo doesnt spiegare perché funziona per Login POST, ma non il filtro azione?

risposta

4

Quindi, quando stavo disconnettendo l'utente dal sistema, stavo anche abbandonando la sessione (chiamando HttpContextBase.Session.Abandon()) e reimpostando l'id della sessione di cookie. Questi stavano influenzando il comportamento TempData. Rimuovendo queste chiamate, tempData viene ora impostato e visualizzato correttamente.

-1

impostando il risultato su new RedirectResult("/") causerà l'interruzione dell'elaborazione del server corrente e invierà al client una risposta, che indica al client di richiedere un nuovo URL, quello che hai detto in RedirectResult. La seconda richiesta è quindi diversa e non contiene i valori dell'elaborazione precedente. Provare a utilizzare Redirect("/"); o Server.Transfer("/"); per servire la nuova rotta nella stessa richiesta client.

+0

Questo è il comportamento che sto cercando: voglio che il client richieda un nuovo URL. Il motivo per cui TempData era vuoto era dovuto all'abbandono della sessione. – Rob