2010-02-24 61 views
5

我正在創建一個HttpModule,它需要知道在MVC應用程序中設置的Thread.CurrentThread.CurrentCulture的值。該值目前由BaseController設置,但是當我的HttpModule.PostRequestHandlerExecute()方法觸發時,它將恢復到文件在頁面呈現之前的狀態。爲什麼Thread.CurrentThread.CurrentCulture頁面呈現和HttpModule.PostRequestHandlerExecute之間有變化?

  1. Module.PreRequestHandlerExecute:集文化,一個
  2. 的Page_Load:

    我已經通過創建具有這些步驟的簡單Web應用程序重複這種文化是目前A.集文化到B

  3. 模塊.PostRequestHandlerExecute:當前的線程文化是A.我期望它是B,但它在頁面呈現和PostRequestHandlerExecute之間發生了變化

任何想法爲什麼.Net cha這個價值還是我可以繞過它的?線程是一樣的,所以.NET中的某些東西必須明確地恢復文化。

回答

2

如果您只是爲正在運行的線程設置文化,那麼導致線程切換的任何操作(例如asp.net中的頁面生命週期的另一部分)都會導致恢復到默認文化。

推薦的方法是在這裏...

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

本頁面討論3個選項...

  1. 設置文化爲整個應用程序。
  2. 在頁面級設置文化。
  3. 根據請求以編程方式設置文化。

值得注意的是,任何模塊都是作爲頁面請求的一部分加載的,所以在頁面級別更改文化應該會改變該請求上的所有模塊。

+0

它*應*更改請求上的所有模塊的區域設置,但它不會。那就是問題所在。請參閱原始問題中的第3步。在頁面呈現和模塊中的請求後觸發之間沒有線程切換。 – 2010-05-21 19:16:21

+1

你的代碼中沒有線程切換,但你不能保證在.Net代碼中。我相信你需要在請求級別設置文化,而不是我的答案解決的線程級別。換句話說,在當前線程上設置或獲取文化不會給你想要的東西。您需要配置整個請求,並且執行該操作的方法是通過重寫手動實現init culture事件。 ... 你明白嗎? – War 2010-05-23 15:10:05

相關問題