Протокол передачи гипертекста (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
В следующем фрагменте кода показан основной синтаксис для хранения информации о состоянии приложения: