【问题标题】:Declaring a global variable in ASP.NET codebehind在 ASP.NET 代码隐藏中声明全局变量
【发布时间】:2011-03-18 11:25:31
【问题描述】:

我想声明一个Dictionary<string, object> 变量,但不知道在哪里/如何。字典中的值将是页面中的对象(ListBoxes、DropDownLists 等),所以我不能在其他地方完全创建一个帮助类。有什么方法可以让代码隐藏中的每个方法都可以访问这个变量?

【问题讨论】:

  • 你的意思是在类级别(页面)声明,这使得它在所有方法中都可用?
  • 您应该根据您接受的答案更改问题的标题,看起来您不需要全局变量,您需要页面内的实例变量。

标签: c# asp.net class-design code-behind access-modifiers


【解决方案1】:

您可以在三个地方存储数据。在应用程序级别,这使得所有会话都可以访问数据。会话级别,使该特定用户的所有页面都可以使用数据。或者,在回发之间,使其可用于当前页面的页面级别。请参阅以下示例:

在应用程序级别存储
封装存储的示例类:

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

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

    }

}

使用示例(在页面加载事件中): 这将增加所有会话的值。要尝试它,请在您的机器上打开两个浏览器,并打开相同的 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;
        }

    }
}

使用示例(在页面加载事件中): 当前用户会话的值递增。当另一个会话在服务器上运行时,它不会增加。

            // 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 等事件处理程序中被反序列化

所有代码都已经过测试,如果您想要完整的解决方案,请告诉我,我会通过电子邮件发送给您。

【讨论】:

    【解决方案2】:

    在类内声明变量,但在任何方法外。例如:

    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();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      关于什么样的数据,你想存储多长时间等有多种选择。看看Session StateViewStateApplication 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"] 
      

      【讨论】:

        【解决方案4】:

        您可以创建一个必须公开的类文件(例如 general.cs),以便可以轻松访问。在那个类文件中你可以定义这个全局变量。

        您可以从任何其他页面或类中访问此变量,因为它被定义为公共的,并且可以通过创建类的实例来利用此全局变量。

        【讨论】:

          【解决方案5】:

          您可以在类声明行之后的代码隐藏行中声明变量。如果您只想在一页上使用它,这将起作用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多