Объявление глобальной переменной в коде ASP.NET - PullRequest
1 голос
/ 18 марта 2011

Я хочу объявить переменную Dictionary<string, object>, но не знаю, где и как. Значения в словаре будут объектами из Page (ListBoxes, DropDownLists и т. Д.), Поэтому я не могу точно создать вспомогательный класс где-то еще. Можно ли как-нибудь сделать эту переменную доступной для каждого метода в коде?

Ответы [ 5 ]

9 голосов
/ 18 марта 2011

Есть три места, где вы можете хранить данные. На уровне приложения, который делает данные доступными для всех сеансов. Уровень сеанса, который делает данные доступными для всех страниц для этого конкретного пользователя. Или уровень страницы, который делает ее доступной для текущей страницы между постбэками Смотрите примеры ниже:

Хранение на уровне приложения
Образец класса для инкапсуляции хранилища:

 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

Весь код был протестирован, если вы хотите получить полное решение, дайте мне знать, я вышлю его вам по электронной почте.

3 голосов
/ 18 марта 2011

Существует несколько вариантов того, какие данные, как долго вы хотите хранить и т. Д. Смотрите на Состояние сеанса , ViewState , Состояние приложения

Исходя из ваших требований Global Variable , я могу представить две возможности.

  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"] 
3 голосов
/ 18 марта 2011

Объявите переменную внутри класса, но вне любого метода.Например:

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 голосов
/ 18 марта 2011

Вы можете объявить переменную в коде позади строки сразу после строки объявления класса.Это будет работать, если вы просто хотите использовать это на одной странице.

0 голосов
/ 18 марта 2011

Вы можете создать один файл класса, который должен быть общедоступным (скажем, general.cs), чтобы он был легко доступен.И в этом файле класса вы можете определить эту глобальную переменную.

Вы можете получить доступ к этой переменной с любой другой страницы или класса, так как она определена как общедоступная и может использовать эту глобальную переменную, создав экземпляр класса.

...