Протокол передачи гипертекста (HTTP) — это протокол без сохранения состояния. Когда клиент отключается от сервера, механизм ASP.NET отбрасывает объекты страницы. Таким образом, каждое веб-приложение может масштабироваться для одновременного обслуживания множества запросов без исчерпания памяти сервера.
Однако должен существовать некоторый метод для хранения информации между запросами и извлечения ее при необходимости. Эта информация, т. Е. Текущее значение всех элементов управления и переменных для текущего пользователя в текущем сеансе, называется состоянием.
ASP.NET управляет четырьмя типами состояний:
- Просмотр состояния
- Государство контроля
- Состояние сеанса
- Состояние приложения
Просмотр состояния
Состояние просмотра — это состояние страницы и всех ее элементов управления. Он автоматически поддерживается в сообщениях ASP.NET Framework.
Когда страница отправляется обратно клиенту, изменения свойств страницы и ее элементов управления определяются и сохраняются в значении скрытого поля ввода с именем _VIEWSTATE. Когда страница снова отправляется обратно, поле _VIEWSTATE отправляется на сервер с HTTP-запросом.
Состояние просмотра может быть включено или отключено для:
-
Все приложение , задав свойство EnableViewState в разделе <pages> файла web.config.
-
Страница путем установки атрибута EnableViewState директивы Page, например, <% @ Page Language = «C #» EnableViewState = «false»%>
-
Элемент управления , установив свойство Control.EnableViewState.
Все приложение , задав свойство EnableViewState в разделе <pages> файла web.config.
Страница путем установки атрибута EnableViewState директивы Page, например, <% @ Page Language = «C #» EnableViewState = «false»%>
Элемент управления , установив свойство Control.EnableViewState.
Он реализован с использованием объекта состояния представления, определенного классом StateBag, который определяет коллекцию элементов состояния представления. Пакет состояний — это структура данных, содержащая пары значений атрибутов, которые хранятся в виде строк, связанных с объектами.
Класс StateBag имеет следующие свойства:
| свойства | Описание |
|---|---|
| Имя элемента) | Значение элемента состояния представления с указанным именем. Это свойство по умолчанию класса StateBag. |
| подсчитывать | Количество элементов в коллекции состояния просмотра. |
| Ключи | Коллекция ключей для всех предметов в коллекции. |
| Ценности | Сбор значений для всех предметов в коллекции. |
Класс StateBag имеет следующие методы:
| методы | Описание |
|---|---|
| Добавить (имя, значение) | Добавляет элемент в коллекцию состояний просмотра, и существующий элемент обновляется. |
| Очистить | Удаляет все предметы из коллекции. |
| Равно (Объект) | Определяет, равен ли указанный объект текущему объекту. |
| завершать | Позволяет освободить ресурсы и выполнить другие операции очистки. |
| GetEnumerator | Возвращает перечислитель, который перебирает все пары ключ / значение объектов StateItem, хранящихся в объекте StateBag. |
| GetType | Получает тип текущего экземпляра. |
| IsItemDirty | Проверяет объект StateItem, хранящийся в объекте StateBag, чтобы определить, был ли он изменен. |
| Удалить (имя) | Удаляет указанный элемент. |
| SetDirty | Устанавливает состояние объекта StateBag, а также свойство Dirty каждого из содержащихся в нем объектов StateItem. |
| SetItemDirty | Устанавливает свойство Dirty для указанного объекта StateItem в объекте StateBag. |
| Нанизывать | Возвращает строку, представляющую объект состояния bag. |
пример
Следующий пример демонстрирует концепцию сохранения состояния просмотра. Давайте сохраним счетчик, который увеличивается каждый раз, когда страница отправляется обратно, нажав кнопку на странице. Элемент управления меткой показывает значение в счетчике.
Код файла разметки выглядит следующим образом:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body> </html>
Код файла для примера показан здесь:
public partial class _Default : System.Web.UI.Page
{
public int counter
{
get
{
if (ViewState["pcounter"] != null)
{
return ((int)ViewState["pcounter"]);
}
else
{
return 0;
}
}
set
{
ViewState["pcounter"] = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
lblCounter.Text = counter.ToString();
counter++;
}
}
Это дало бы следующий результат:
Государство контроля
Состояние управления не может быть изменено, доступно напрямую или отключено.
Состояние сеанса
Когда пользователь подключается к веб-сайту ASP.NET, создается новый объект сеанса. Когда состояние сеанса включено, новый объект состояния сеанса создается для каждого нового запроса. Этот объект состояния сеанса становится частью контекста, и он доступен через страницу.
Состояние сеанса обычно используется для хранения данных приложения, таких как инвентарь, список поставщиков, учетная запись клиента или корзина покупок. Он также может хранить информацию о пользователе и его предпочтениях, а также отслеживать ожидающие операции.
Сеансы идентифицируются и отслеживаются с помощью 120-битного SessionID, который передается от клиента к серверу и возвращается в виде файла cookie или измененного URL-адреса. SessionID является глобально уникальным и случайным.
Объект состояния сеанса создается из класса HttpSessionState, который определяет коллекцию элементов состояния сеанса.
Класс HttpSessionState имеет следующие свойства:
| свойства | Описание |
|---|---|
| Идентификатор сессии | Уникальный идентификатор сеанса. |
| Имя элемента) | Значение элемента состояния сеанса с указанным именем. Это свойство по умолчанию класса HttpSessionState. |
| подсчитывать | Количество элементов в коллекции состояний сеанса. |
| TimeOut | Получает и задает количество времени (в минутах) между запросами, прежде чем поставщик состояния сеанса завершит сеанс. |
Класс HttpSessionState имеет следующие методы:
| методы | Описание |
|---|---|
| Добавить (имя, значение) | Добавляет элемент в коллекцию состояний сеанса. |
| Очистить | Удаляет все элементы из коллекции состояний сеанса. |
| Удалить (имя) | Удаляет указанный элемент из коллекции состояний сеанса. |
| Удалить все | Удаляет все ключи и значения из коллекции состояния сеанса. |
| RemoveAt | Удаляет элемент по указанному индексу из коллекции состояния сеанса. |
Объект состояния сеанса представляет собой пару имя-значение для хранения и извлечения некоторой информации из объекта состояния сеанса. Вы можете использовать следующий код для того же:
void StoreSessionInfo()
{
String fromuser = TextBox1.Text;
Session["fromuser"] = fromuser;
}
void RetrieveSessionInfo()
{
String fromuser = Session["fromuser"];
Label1.Text = fromuser;
}
Приведенный выше код хранит только строки в объекте словаря Session, однако он может хранить все примитивные типы данных и массивы, состоящие из примитивных типов данных, а также объекты DataSet, DataTable, HashTable и Image, а также любые пользовательские объекты. определенный класс, который наследуется от объекта ISerializable.
пример
В следующем примере демонстрируется концепция хранения состояния сеанса. На странице есть две кнопки: текстовое поле для ввода строки и метка для отображения текста, сохраненного в прошлом сеансе.
Код файла разметки выглядит следующим образом:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 568px; height: 103px">
<tr>
<td style="width: 209px">
<asp:Label ID="lblstr" runat="server" Text="Enter a String" style="width:94px">
</asp:Label>
</td>
<td style="width: 317px">
<asp:TextBox ID="txtstr" runat="server" style="width:227px">
</asp:TextBox>
</td>
</tr>
<tr>
<td style="width: 209px"> </td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Button ID="btnnrm" runat="server"
Text="No action button" style="width:128px" />
</td>
<td style="width: 317px">
<asp:Button ID="btnstr" runat="server"
OnClick="btnstr_Click" Text="Submit the String" />
</td>
</tr>
<tr>
<td style="width: 209px"> </td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Label ID="lblsession" runat="server" style="width:231px" >
</asp:Label>
</td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Label ID="lblshstr" runat="server">
</asp:Label>
</td>
<td style="width: 317px"> </td>
</tr>
</table>
</div>
</form>
</body>
</html>
Это должно выглядеть примерно так:
Код файла указан здесь:
public partial class _Default : System.Web.UI.Page
{
String mystr;
protected void Page_Load(object sender, EventArgs e)
{
this.lblshstr.Text = this.mystr;
this.lblsession.Text = (String)this.Session["str"];
}
protected void btnstr_Click(object sender, EventArgs e)
{
this.mystr = this.txtstr.Text;
this.Session["str"] = this.txtstr.Text;
this.lblshstr.Text = this.mystr;
this.lblsession.Text = (String)this.Session["str"];
}
}
Запустите файл и посмотрите, как он работает:
Состояние приложения
Приложение ASP.NET представляет собой набор всех веб-страниц, кода и других файлов в одном виртуальном каталоге на веб-сервере. Когда информация хранится в состоянии приложения, она доступна всем пользователям.
Чтобы обеспечить использование состояния приложения, ASP.NET создает объект состояния приложения для каждого приложения из класса HTTPApplicationState и сохраняет этот объект в памяти сервера. Этот объект представлен файлом класса global.asax.
Состояние приложения в основном используется для хранения счетчиков посещений и других статистических данных, глобальных данных приложения, таких как ставка налога, ставка дисконтирования и т. Д., А также для отслеживания пользователей, посещающих сайт.
Класс HttpApplicationState имеет следующие свойства:
| свойства | Описание |
|---|---|
| Имя элемента) | Значение элемента состояния приложения с указанным именем. Это свойство по умолчанию класса HttpApplicationState. |
| подсчитывать | Количество элементов в коллекции состояний приложения. |
Класс HttpApplicationState имеет следующие методы:
| методы | Описание |
|---|---|
| Добавить (имя, значение) | Добавляет элемент в коллекцию состояний приложения. |
| Очистить | Удаляет все элементы из коллекции состояний приложения. |
| Удалить (имя) | Удаляет указанный элемент из коллекции состояний приложения. |
| Удалить все | Удаляет все объекты из коллекции HttpApplicationState. |
| RemoveAt | Удаляет объект HttpApplicationState из коллекции по индексу. |
| Замок() | Блокирует коллекцию состояний приложения, так что только текущий пользователь может получить к ней доступ. |
| Разблокировка () | Разблокирует коллекцию состояний приложения, чтобы все пользователи могли получить к ней доступ. |
Данные о состоянии приложения обычно поддерживаются написанием обработчиков для событий:
- Application_Start
- Application_End
- Ошибка приложения
- session_start
- Session_End
В следующем фрагменте кода показан основной синтаксис для хранения информации о состоянии приложения:


