在ASP.NET代码隐藏中声明一个全局变量

mub*_*bar 1 c# asp.net class-design access-modifiers code-behind

我想声明一个Dictionary<string, object>变量,但不知道在哪里/如何.字典中的值将是来自Page(ListBoxes,DropDownLists等)的对象,因此我无法在其他地方创建辅助类.有什么办法可以让代码隐藏中的每个方法都可以访问这个变量吗?

Jus*_*gey 9

您可以在三个地方存储数据.在应用程序级别,它使所有会话都可以访问数据.会话级别,使数据可供该特定用户的所有页面使用.或者,在回发之间的页面级别,使其可用于当前页面.见下面的例子:

存储在应用程序级
样本类中以封装存储:

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

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

    }

}
Run Code Online (Sandbox Code Playgroud)

用法示例(在页面加载事件中):这将增加所有会话的值.要试用它,请在您的计算机上打开两个浏览器并使用相同的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 />");
Run Code Online (Sandbox Code Playgroud)

存储在会话级别:用于封装存储的示例类:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

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

            // 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 />");
Run Code Online (Sandbox Code Playgroud)

页面级存储

在页面内:

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

样本用法

在页面加载处理程序中

        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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

点击按钮:

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

    }
Run Code Online (Sandbox Code Playgroud)

请记住,ViewState在页面加载时没有反序列化,但它会在Button.Click等事件处理程序中反序列化.

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