2010-02-24 9 views
5

Sto creando un HttpModule che deve conoscere il valore di Thread.CurrentThread.CurrentCulture come impostato in un'applicazione MVC. Tale valore è attualmente impostato da BaseController, ma quando viene attivato il metodo HttpModule.PostRequestHandlerExecute(), viene ripristinato ciò che la Cultura era prima del rendering della pagina.Perché Thread.CurrentThread.CurrentCulture Cambia tra il rendering della pagina e HttpModule.PostRequestHandlerExecute?

ho duplicato questo con la creazione di una semplice applicazione web con questi passaggi:

  1. Module.PreRequestHandlerExecute: Impostare la cultura alla A
  2. Page Load: La cultura è attualmente A. Set cultura a B
  3. Module .PostRequestHandlerExecute: la cultura thread corrente è A. mi aspettavo che fosse B, ma è stato cambiato tra il rendering della pagina e PostRequestHandlerExecute

Qualsiasi idea del perché .Net cha questo valore o come posso aggirarlo? Il thread è lo stesso, quindi qualcosa in .Net deve essere esplicitamente ripristinato la cultura.

risposta

2

Se si imposta semplicemente la cultura per un thread in esecuzione, qualsiasi operazione che si traduce in un cambio di thread (come un'altra parte del ciclo di vita della pagina in asp.net) comporterebbe il ritorno alla cultura predefinita.

L'approccio raccomandato è qui ...

http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

Questa pagina discute 3 opzioni ...

  1. Impostare la cultura per l'intera applicazione.
  2. Impostazione della cultura a livello di pagina.
  3. Impostazione della cultura a livello di programmazione per richiesta.

Vale la pena notare che tutti i moduli vengono caricati come parte di una richiesta di pagina, quindi cambiare la cultura a livello di pagina dovrebbe cambiarlo per tutti i moduli su quella richiesta.

+0

* * * modifica le impostazioni locali per tutti i moduli della richiesta, ma non lo fa. Questo è il problema. Vedere il passaggio 3 nella domanda originale. Non c'è passaggio tra il rendering della pagina e l'attivazione post-richiesta nel modulo. –

+1

non c'è il cambio di thread nel codice ma non lo si può garantire nel codice .Net. Credo che sia necessario impostare la cultura a livello di richiesta e non il livello di thread che la mia risposta risolve. In altre parole, impostare o ottenere la cultura sul thread corrente non ti darà quello che vuoi. è necessario configurare l'intera richiesta e il modo per farlo è implementare manualmente l'evento di cultura di inizializzazione sovrascrivendo. ... Capisci? – War

Problemi correlati