2011-03-18 51 views
1

我想聲明一個Dictionary<string, object>變量,但不知道在哪裏/如何。字典中的值將來自Page(ListBoxes,DropDownLists等)的對象,所以我不能在其他地方準確地創建一個輔助類。有什麼辦法可以讓代碼隱藏的每個方法都可以訪問這個變量嗎?在ASP.NET代碼隱藏聲明一個全局變量

+0

您的意思是在類級別(頁面)聲明,這使得它在所有方法中都可用? – V4Vendetta 2011-03-18 11:36:25

+0

你應該根據你接受的答案來改變你的問題的標題,看起來你不需要全局變量,你需要一個頁面內的實例變量。 – 2011-03-18 12:00:36

回答

3

聲明該類中的變量,但在任何方法之外。例如:

namespace WebApplication1 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     private Dictionary<string, object> myDictionary; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      myDictionary = new Dictionary<string, object>(); 
      myDictionary.Add("test", "Some Test String as Object"); 
     } 

     protected void TextBox1_TextChanged(object sender, EventArgs e) 
     { 
      myDictionary.Add("TextBox1Value", TextBox1.Text); 
     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      TextBox1.Text = myDictionary["test"].ToString(); 
     } 
    } 
} 
0

您可以創建一個必須公開的類文件(比如general.cs),以便可以輕鬆訪問它。在這個類文件中,你可以定義這個全局變量。

您可以從任何其他頁面或類中訪問此變量,因爲它定義爲public,並且可以通過創建類的實例來利用此全局變量。

0

您可以在類聲明行之後的代碼行中聲明變量。如果你只是想在一個頁面上使用它,這將工作。

3

上有什麼樣的數據,你想要多長時間儲存​​等等看Session StateViewState多個選項,根據您的全局變量要求我Application State

可以想到兩種可能性。

  1. 使用靜態類和靜態變量,如下面的代碼所示。

    internal static class GlobalData 
    { 
        public static Dictionary<string, object> SomeData { get; set; } 
    } 
    

現在使用它

 //initialize it once in Application_Start or something. 
     GlobalData.SomeData = new Dictionary<string, object>(); 

     //use it wherever you want. 
     object o = GlobalData.SomeData["abc"]; 

2使用Application狀態來存儲您的全局數據。如下。

 //Store it in application state 
     Application["YourObjectUniqueName"] = new Dictionary<string, object>(); 

     //access it wherever using 
     Application["YourObjectUniqueName"]["abc"] 
9

有三個地方可以存儲數據。在應用程序級別,使數據可供所有會話訪問。會話級別,使數據可供該特定用戶的所有頁面使用。或者,可以在當前頁面上使用的頁面級別,在回發之間。請參見下面的例子:

在應用級別存儲
樣品類來封裝存儲:

public static class ApplicationData 
{ 
    private static Dictionary<string, object> _someData = new Dictionary<string, object>(); 

    public static Dictionary<string, object> SomeData 
    { 
     get 
     { 
      return _someData; 
     } 

    } 

} 

使用Sample(在頁面加載事件): 這將增加所有會話的價值。要嘗試它,請在您的計算機上打開兩個瀏覽器並使用相同的URL。注意如何爲每個用戶的請求增加值。

  // Application Data Usage 
     if (ApplicationData.SomeData.ContainsKey("AppKey")) 
     { 
      ApplicationData.SomeData["AppKey"] = (int)ApplicationData.SomeData["AppKey"] + 1; 
     } 
     else 
     { 
      ApplicationData.SomeData["AppKey"] = 1; 
     } 
     Response.Write("App Data " + (int)ApplicationData.SomeData["AppKey"] + "<br />"); 

存儲會話級: 樣品類來封裝存儲:

public class SessionData 
{ 
    private Dictionary<string, object> _someData; 

    private SessionData() 
    { 
     _someData = new Dictionary<string, object>(); 
    } 

    public static Dictionary<string, object> SomeData 
    { 
     get 
     { 
      SessionData sessionData = (SessionData)HttpContext.Current.Session["sessionData"]; 
      if (sessionData == null) 
      { 
       sessionData = new SessionData(); 
       HttpContext.Current.Session["sessionData"] = sessionData; 
      } 
      return sessionData._someData; 
     } 

    } 
} 

使用Sample(在頁面加載事件): 值增加爲當前用戶的會話。當另一個會話在服務器上運行時,它不會增加。

  // Session Data Usage. 
     if (SessionData.SomeData.ContainsKey("SessionKey")) 
     { 
      SessionData.SomeData["SessionKey"] = (int)SessionData.SomeData["SessionKey"] + 1; 
     } 
     else 
     { 
      SessionData.SomeData["SessionKey"] = 1; 
     } 
     Response.Write("Session Data " + (int)SessionData.SomeData["SessionKey"] + "<br />"); 

頁級存儲

內頁:

private Dictionary<string, int> _someData; 

    private Dictionary<string, int> SomeData 
    { 
     get 
     { 
      if (_someData == null) 
      { 
       _someData = (Dictionary<string, int>)ViewState["someData"]; 
       if (_someData == null) 
       { 
        _someData = new Dictionary<string, int>(); 
        ViewState.Add("someData", _someData); 
       } 
      }        
      return _someData; 
     } 
    } 

用法示例

在按鈕點擊網頁加載處理

 if (!this.IsPostBack) 
     { 
      incrementPageState(); 
      Response.Write("Page Data " + SomeData["myKey"] + "<br />");  
     } 
    private void incrementPageState() 
    { 
     // Page Data Usage 
     if (SomeData.ContainsKey("myKey")) 
     { 
      SomeData["myKey"] = SomeData["myKey"] + 1; 
     } 
     else 
     { 
      SomeData["myKey"] = 1; 
     } 
    } 

protected void hello_Click(object sender, EventArgs e) 
    { 
     incrementPageState(); 
     Response.Write("Page Data " + SomeData["myKey"] + "<br />");  

    } 

請記住,該ViewState是不是反序列化頁面加載,但它會在事件處理程序一樣Button.Click

的所有代碼已經過測試,如果你想要完整的解決方案進行反序列化,讓我知道,我會通過電子郵件發送給你。