2012-08-04 63 views
5

這肯定是一個普遍的問題,但我找不到一個簡單的方法來做到這一點。Asp.net頁面生命週期特定的全局變量?

是否有一種方法可以在asp.net webform的生命週期中共享一個全局變量(比如實例化的代價昂貴的類),而不必將句柄傳遞給頁面的每個組件?

如果我只是創建一個靜態變量,它將被應用程序域中的所有線程訪問(問題:我的類不是線程安全的),並且很難確保每個頁面都可以在最近的副本上工作我想通過頁面生命週期的每一步緩存該類,但每次調用新頁面時我都需要一個新實例)。

另一種方法是通過頁面中的每個控件傳遞句柄,但在母版頁,頁面本身和所有用戶控件之間傳遞句柄,這會使代碼變得非常多毛。

我想知道是否沒有一個優雅的解決方案來存儲一個類只能執行此特定頁面(包括所有子用戶控件)的線程訪問的地方?

任何建議歡迎! 謝謝 Charles

回答

7

有一個簡單的答案:Items容器。它可用於單個請求的生命週期,然後它會自動銷燬。你可以用它在屬性有你想要的東西:

public class Foo { 

    const string SOMEKEY = "_somekey"; 

    public static string SingleRequestVariable 
    { 
     get 
     { 
      return (string)HttpContext.Current.Items[SOMEKEY]; 
     } 
     set 
     { 
      HttpContext.Current.Items.Add(SOMEKEY, value); 
     } 
    } 
} 

然後

Foo.SingleRequestVariable = "bar"; // somewhere 
... 
string val = Foo.SingleRequestVariable; // yet somewhere else 
+0

很好的解決方案!實際上,我可以有一個靜態函數Foo.Current進入httpcontext,檢查foo的實例是否已經存在,否則創建一個並添加它,並返回此實例。感謝您及時的回覆! – Charles 2012-08-04 22:40:59

+0

只是因爲別人可能會偶然發現這個答案......如果在變量集合方法中,你使用HttpContext.Current.Items [SOMEKEY] = value;那麼如果不在那裏,那麼將創建一個項目,或者如果它已經在那裏,則重置它的值。沒有必要重新編碼,當字典類已經爲你做。 – AgapwIesu 2016-08-08 19:46:39