2011-03-18 80 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

的所有代码已经过测试,如果你想要完整的解决方案进行反序列化,让我知道,我会通过电子邮件发送给你。