Есть три места, где вы можете хранить данные. На уровне приложения, который делает данные доступными для всех сеансов. Уровень сеанса, который делает данные доступными для всех страниц для этого конкретного пользователя. Или уровень страницы, который делает ее доступной для текущей страницы между постбэками Смотрите примеры ниже:
Хранение на уровне приложения
Образец класса для инкапсуляции хранилища:
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
Весь код был протестирован, если вы хотите получить полное решение, дайте мне знать, я вышлю его вам по электронной почте.