Протокол передачи гипертекста (HTTP) — это протокол без сохранения состояния. Когда клиент отключается от сервера, механизм ASP.NET удаляет объект страницы. Таким образом, каждое веб-приложение может масштабироваться для одновременного обслуживания большого количества запросов без исчерпания памяти сервера.
Однако необходима некоторая технология для хранения информации между запросами и ее извлечения при необходимости. Эта информация называется состоянием и представляет собой текущие значения всех элементов управления и переменных, используемых текущим пользователем в текущем сеансе.
ASP.NET управляет четырьмя состояниями:
состояние просмотра
состояние управления
состояние сеанса
Статус заявки
Состояние просмотра — это состояние страницы и всех ее элементов управления. Он остается неизменным благодаря отзывам платформы ASP.NET.
Когда страница отправляется обратно клиенту, свойства и элементы управления этими изменениями страницы определяются и сохраняются в значении скрытого поля ввода с именем _VIEWSTATE. Когда страница снова отправляется обратно, поле _VIEWSTATE отправляется на сервер с HTTP-запросом.
Состояние просмотра можно включить или отключить для:
Все приложение : установите свойство EnableViewState раздела в файле web.config.
Страница : установите для свойства EnableViewState команды страницы значение <%@ Page Language="C#" EnableViewState="false" %>
Элемент управления : установите свойство control.EnableViewState.
Это делается с помощью объекта состояния представления, который определяется классом StateBag, определяемым набором элементов состояния представления. StateBag — это структура данных, которая содержит пары значений свойств и хранится в виде строки, связанной с объектом.
Класс StateBag имеет следующие свойства:
свойство | описывать |
---|---|
Предмет (имя) | Значение состояния представления с указанным именем, которое является свойством StateBag по умолчанию. |
Считать | Имя элемента в коллекции статусов. |
Ключи | Сборник ключей для всех предметов коллекции. |
Ценности | Коллекция значений для всех элементов коллекции. |
Класс StateBag имеет следующие методы:
метод | описывать |
---|---|
Добавить(имя, значение) | Добавляет элемент в коллекцию состояния просмотра, обновляя существующие элементы. |
Прозрачный | Удаляет все элементы из коллекции. |
Равно(Объект) | Определяет, равен ли указанный объект текущему объекту. |
Завершить | Позволяет освободить ресурсы и выполнить другие операции очистки. |
GetEnumerator | Возвращает счетчик пар ключ/значение для повторяющихся объектов StateItem, хранящихся в объекте StateBag. |
GetType | Получите тип текущего экземпляра. |
IsItemDirty | Проверьте объект, хранящийся в StateBag, чтобы убедиться, что он был изменен. |
Удалить (имя) | Удаление пользовательских элементов. |
УстановитьГрязный | Устанавливает состояние объекта StateBag и свойства Dirty каждого содержащегося объекта StateItem. |
SetItemDirty | Устанавливает свойство Dirty для указанного объекта StateItem в объекте StateBag. |
ТоСтрока | Возвращает строку, представляющую объект пакета состояния. |
Следующий пример иллюстрирует концепцию строк, хранящих состояние представления.
Давайте сохраним счетчик, который можно будет увеличивать каждый раз, когда страница вызывается нажатием кнопки на странице. Элемент управления меткой отображает значение счетчика.
Код файла тега выглядит следующим образом:
<%@ 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-битному идентификатору сеанса, который передается от клиента на сервер и возвращается в виде файла cookie или измененного URL-адреса. SessionID является глобально уникальным и случайным.
Объекты состояния сеанса создаются классом HttpSessionState, который определяет коллекцию элементов состояния сеанса.
Класс HttpSessionState имеет следующие свойства:
свойство | описывать |
---|---|
идентификатор сеанса | Уникальный идентификатор сеанса. |
Предмет (имя) | Значение элемента состояния сеанса с указанным именем, которое является свойством по умолчанию класса HttpSessionState. |
Считать | Количество элементов в коллекции состояний сеанса. |
Таймаут | Получает и задает промежуток времени в минутах между запросами, прежде чем поставщик прекратит состояние сеанса. |
Класс HttpSessionState имеет следующие методы:
метод | описывать |
---|---|
Добавить(имя, значение) | Добавляет новые элементы в коллекцию состояний сеанса. |
Прозрачный | Удаляет все элементы из коллекции состояний сеанса. |
Удалить (имя) | Удаляет указанный элемент из коллекции состояний сеанса. |
Удалить все | Удаляет все ключи и значения из коллекции состояний сеанса. |
Удалитьат | Удаляет элемент по указанному индексу из коллекции состояний сеанса. |
Объект состояния сеанса — это пара имя-значение, которая может хранить и извлекать информацию из объекта состояния сеанса. Аналогично вы можете использовать следующий код:
void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}
Приведенный выше код сохраняет строки только в объекте словаря сеанса, однако он может хранить все примитивные типы данных и массивы, состоящие из примитивных типов данных, DataSet, DataTable, HashTable и объектов изображения, а также любые пользовательские объекты, которые наследуются от Тип 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> <tr> <td> <asp:Label ID="lblstr" runat="server" Text="Enter a String" > </asp:Label> </td> <td> <asp:TextBox ID="txtstr" runat="server"> </asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Button ID="btnnrm" runat="server" Text="No action button" /> </td> <td> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblsession" runat="server" > </asp:Label> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td> </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. |
Удалитьат | Удаляет объект HttpApplicationState из коллекции, найденной по индексу. |
Замок() | Заблокируйте коллекцию состояний приложения, чтобы только текущий пользователь мог получить к ней доступ. |
Разблокировать() | Разблокируйте коллекцию состояний приложения, чтобы все пользователи могли получить к ней доступ. |
Данные о состоянии приложения обычно поддерживаются обработчиками, написанными для событий:
Приложение открывается
Приложение завершается
ошибка приложения
Сессия начинается
сессия закончилась
В следующем фрагменте кода показан базовый синтаксис для хранения информации о состоянии приложения:
Void Application_Start(object sender, EventArgs e){ Application["startMessage"] = "The application has started.";}Void Application_End(object sender, EventArgs e){ Application["endtMessage"] = "The application has ended.";}