Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Элемент управления ObjectDataSource




Элемент управления ObjectDataSource работает только с бизнесс-объектами. При этом ObjectDataSource, аналогично SqlDataSource, может получать набор данных и производить изменения данных. Работа с элементом управления ObjectDataSource практически идентична работе с SqlDataSource с некоторыми небольшими изменениями.

Для кода примеров опишем класс Performer, который содержит методы для работы с таблицей исполнителей в базе данных.

public class Performer

{

private const string connStr = "...";

 

private const string INSERT_CMD =

"INSERT INTO [Performers] ([name], [is_group])" +

"VALUES (@name, @is_group)";

 

private const string SELECT_CMD = "SELECT * FROM [Performers]";

 

private const string UPDATE_CMD =

"UPDATE [Performers] SET [name] = @name," +

"[is_group] = @is_group WHERE [id] = @old_id";

 

private const string DELETE_CMD =

"DELETE FROM [Performers] WHERE [id] = @old_id";

 

public void Create(string name, bool is_group)

{

var conn = new SqlConnection(connStr);

var cmd = new SqlCommand(INSERT_CMD, conn);

var name_param = new SqlParameter

{

ParameterName = "@name",

SqlDbType = SqlDbType.NVarChar,

Value = name

};

var isgroup_param = new SqlParameter

{

ParameterName = "@is_group",

SqlDbType = SqlDbType.Bit,

Value = is_group? 1: 0

};

cmd.Parameters.Add(name_param);

cmd.Parameters.Add(isgroup_param);

conn.Open();

cmd.ExecuteNonQuery();

conn.Close();

}

 

public SqlDataReader Read()

{

var conn = new SqlConnection(connStr);

var cmd = new SqlCommand(SELECT_CMD, conn);

conn.Open();

return cmd.ExecuteReader(CommandBehavior.CloseConnection);

}

 

public void Update(int ID, string name, bool is_group)

{

var conn = new SqlConnection(connStr);

var cmd = new SqlCommand(UPDATE_CMD, conn);

var name_param = new SqlParameter

{

ParameterName = "@name",

SqlDbType = SqlDbType.NVarChar,

Value = name

};

var isgroup_param = new SqlParameter

{

ParameterName = "@is_group",

SqlDbType = SqlDbType.Bit,

Value = is_group? 1: 0

};

var id_param = new SqlParameter

{

ParameterName = "@old_id",

SqlDbType = SqlDbType.Int,

Value = ID

};

cmd.Parameters.Add(name_param);

cmd.Parameters.Add(isgroup_param);

cmd.Parameters.Add(id_param);

conn.Open();

cmd.ExecuteNonQuery();

conn.Close();

}

 

public void Delete(int ID)

{

var conn = new SqlConnection(connStr);

var cmd = new SqlCommand(DELETE_CMD, conn);

var id_param = new SqlParameter

{

ParameterName = "@old_id",

SqlDbType = SqlDbType.Int,

Value = ID

};

cmd.Parameters.Add(id_param);

conn.Open();

cmd.ExecuteNonQuery();

conn.Close();

}

}

Метод для получения данных – в нашем случае это Performer.Read() – должен возвращать экземпляр класса, реализующего IEnumerable. Есть определенная зависимость других свойств ObjectDataSource от типа возвращаемого этим методом значения – как и для SqlDataSource кэшироваться могут только данные в DataSet, а DataReader не может делать пейджинг. При написании остальных методов нужно помнить о свойствах ConflictDetection и OldValuesParameterFormatString, имеющих то же значение, что и у SqlDataSource.

При наличии готового класса можно настроить элемент управления ObjectDataSource для работы с данными. Основные отличия от SqlDataSource: свойство TypeName должно содержать строку с именем класса бизнес логики, свойства работы с данными имеют окончание Method вместо используемого в SqlDataSource окончания Command.

<asp:ObjectDataSource ID="ObjectDS" runat="server"

TypeName="Performer" SelectMethod="Read"

DeleteMethod="Delete" UpdateMethod="Update"

InsertMethod="Create"

ConflictDetection="OverwriteChanges"

OldValuesParameterFormatString="old_{0}"

<InsertParameters>

<asp:ControlParameter ControlID="txtName" Name="name"

PropertyName="Text" Type="String" />

<asp:ControlParameter ControlID="cbxGroup" Name="is_group"

PropertyName="Checked" Type="Boolean" />

</InsertParameters>

<DeleteParameters>

<asp:Parameter Name="id" Type="Int32" />

</DeleteParameters>

<UpdateParameters>

<asp:Parameter Name="name" Type="String" />

<asp:Parameter Name="is_group" Type="Boolean" />

<asp:Parameter Name="id" Type="Int32" />

</UpdateParameters>

</asp:ObjectDataSource>

Зачастую для каждой сущности базы данных существует класс для ее хранения и класс для манипуляций этой сущностью. В этом случае нужно указать в свойстве DataObjectTypeName имя класса сущности, а методы Insert(), Delete() и Update() класса бизнес логики должны принимать только один параметр указанного в DataObjectTypeName типа. В случае использования значения CompareAllValues в свойстве ConflictDetection метод Update() должен принимать два параметра указанного в DataObjectTypeName типа – со старыми и новыми значениями.

Список событий элемента управления ObjectDataSource практически полностью совпадает с подобным списком элемента управления SqlDataSource. Кроме того, ObjectDataSource имеет три события, отвечающие за происходящее с экземпляром класса бизнес логики – ObjectCreating, ObjectCreated и ObjectDisposing. Событие ObjectCreating происходит перед созданием экземпляра класса и в обработчике этого события можно, например, создавать экземпляр класса бизнес логики в случае, если этот класс должен создаваться с использованием конструктора с параметрами.

5.16. Таблицы, связанные с данными

ASP.NET предлагает несколько элементов управления, предназначенных для табличного отображения данных: Repeater, DataList, DataGrid, GridView и ListView. Как основной элемент управления позиционируется GridView, появившийся в ASP.NET 2.0 и пришедший на смену DataGrid. Именно этот элемент управления будет рассмотрен подробно.

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

Для задания отображаемых столбцов элемент управления GridView имеет свойство-коллекцию Columns[18], которое можно определять как декларативно, так и программно. В последнем случае создаются необходимые объекты классов, производных от класса DataControlField, которые затем добавляются в коллекцию. Например, следующий код включает в состав элемента управления gv столбец, связанный с данными:

var field = new BoundField

{

DataField = "name",

HeaderText = "Company Name"

};

gv.Columns.Add(field);

Для объявления столбца в файле.aspx используется тэг <Columns>:

<Columns>

<asp:BoundField DataField="customerid" HeaderText="ID" />

<asp:BoundField DataField="name" HeaderText="Name" />

</Columns>

Столбцы данных выводятся в том порядке, в каком их объекты добавлялись в коллекцию. В табл. 28 перечислены производные от DataControlField классы, представляющие разные типы столбцов.

Таблица 28

Классы, представляющие разные типы столбцов

Класс Описание
BoundField Значение выводится в виде чистого текста (тип столбца по умолчанию)
ButtonField Значение выводится в виде командной кнопки ссылочного или обычного кнопочного типа
CheckBoxField Значение выводится в виде флажка; такие столбцы обычно применяются для представления значений булева типа
CommandField Подобен классу ButtonField; представляет командную кнопку типа Select, Delete, Insert или Update
HyperLinkField Представляет значение поля в виде гиперссылки; по щелчку на ней браузер выполняет переход по заданному URL
ImageField Значение поля выводится как атрибут Src HTML-тэга <img>. Связанное поле должно содержать URL изображения
TemplateField В ячейках столбца выводится пользовательский контент. Данный тип столбца используется в случаях, когда требуется создать поль­зовательский столбец. Шаблон, который вы связываете со столбцом, может содержать любое сочетание полей, связанных с данными, литералов, изображений и прочих элементов управления

Поле источника данных, выводимое в виде чистого текста, представляет класс BoundField. Чтобы указать, с каким полем связан объект этого класса, нужно присвоить имя поля свойству DataField. При желании можно задать для поля строку форматирования, присвоив её свойству DataFormatString. В свойстве NullDisplayText задается альтернативный текст, выводимый, когда поле содержит значение null. Установив свойство ConvertEmptyStringToNull в true, вы даете объекту BoundField указание трактовать пустые строки как значение null. Для вывода надписи в разделе верхнего или нижнего колонтитула, присвойте соответствующий текст свойству HeaderText или FooterText. Вместо текста в верхнем колонтитуле можно вывести изображение, задав его URL в свойстве HeaderImageUrl.

Кнопочное поле используется для размещения в столбце таблицы активных элементов. Обычно с помощью таких кнопок инициируются действия над текущей строкой. По щелчку кнопки выполняется возврат формы и генерируется событие RowCommand. Если таблица содержит несколько кнопочных столбцов, узнать, какую именно кнопку щелкнул пользователь, можно из свойства CommandName ‑ строка, уникально идентифицирующая кнопку в рамках элемента управления. Вот пример обработчика события RowCommand:

private void GV1_RowCommand(object sender,

GridViewCommandEventArgs e)

{

if (e.CommandName.Equals("Add"))

{

// индекс строки, в которой щелкнул пользователь

var index = Convert.ToInt32(e.CommandArgument);

// добавляем товар в корзину для покупок

AddToShoppingCart(index);

}

}

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

Поле гиперссылки HyperLinkField позволяет пользователю перейти по другому URL. Этот URL можно непосредственно связать с полем источника данных. Имя поля в таком случае задается в свойстве DataNavigateUrlFields объекта HyperLinkField. Если же поля с URL в источнике данных нет, параметризованный URL кодируют в свойстве DataNavigateUrlFormatString.

<asp:HyperLinkField DataTextField="name" HeaderText="Product"

DataNavigateUrlFields="productid"

DataNavigateUrlFormatString="info.aspx?id={0}"

Target="ProductView" />

Если URL содержит более одного параметра, задайте в свойстве DataNavigateUrlFields разделенный запятыми список полей, значения которых будут подставляться на места параметров.

Столбец типа CheckBoxField связан с данными булевого типа, которые в нем представлены в виде установленных или снятых флажков. Булевы значения MS SQL Server хранит в столбцах типа Bit (в других СУБД ‑ в столбцах аналогичных типов). Если же столбец связан с пользовательской коллекцией, то источником данных для столбца типа CheckBoxField может быть свойство типа bool. Попытка связать его с данными других типов приведет к исключению.

В столбце типа ImageField выводятся изображения. Ячейка такого столбца содержит тэг <img>, в атрибут Src которого должен подставляться URL изображения. Этот URL может содержаться в поле источника данных, заданном в свойстве DataImageUrlField, или составляться динамически с использованием параметра. Во втором случае параметризованный URL задается в свойстве DataImageUrlFormatString. Альтернативный текст, выводимый при отсутствии изображения, также можно связывать с данными, для чего используется свойство DataAlternateTextField.

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

Таблица 29

Свойства, представляющие шаблоны

Свойство Описание шаблона
AlternatingItemTemplate Определяет содержимое ячейки четной строки и способ его представления; если этот шаблон не задан, используется шаблон ItemTemplate
EditItemTemptate Определяет содержимое ячейки редактируемой строки и способ его представления; этот шаблон должен содержать поля ввода и, возможно, проверочные элементы
FooterTemplate Определяет содержимое нижнего колонтитула столбца
HeaderTemplate Определяет содержимое заголовка столбца
ItemTemplate Определяет содержимое ячейки столбца по умолчанию и способ его представления

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

Ниже приведен пример определения шаблона для столбца, содержащего информацию о товаре. Ячейка такого столбца содержит две строки ‑ с названием товара и информацией о его расфасовке.

<asp:TemplateField HeaderText="Product">

<ItemTemplate>

<b><%# Eval("productname")%></b>

<br /> available in <%# Eval("quantityperunit")%>

</ItemTemplate>

</asp:TemplateField>

Элемент управления GridView поддерживает постраничный вывод, редактирование и сортировку информации в том случае, если это умеет делать связанный с ним компонент-источник данных. Источник данных уведомляет GridView о поддержке тех или иных возможностей посредством булевых свойств наподобие CanSort. Если же элемент управления GridView связан с данными через свойство DataSource, то GridView просто генерирует определенные события, ожидая, что все необходимые действия будут выполнены пользовательским кодом их обработки.

Рассмотрим постраничный вывод информации в GridView. Если источником данных является компонент SqlDataSource, то его свойство DataSourceMode должно быть установлено в DataSet (значение по умолчанию). Это означает, что при каждом возврате формы из БД извлекается полный набор данных, а на странице при этом выводится немного записей. Если GridView связан с компонентом ObjectDataSource, то бизнес-объект, который служит источником данных, должен иметь встроенные функции разбиения на страницы. Вы конфигурируете ObjectDataSource таким образом, чтобы он правильно вызывал метод бизнес-объект, отвечающий за выдачу данных: задаете в свойствах StartRowIndexParameterName и MaximumRowsParameterName имена параметров, в которых этому методу передается начальный индекс и размер страницы. Также необходимо установить свойство ObjectDataSource.EnablePaging в значение true.

Когда свойство GridView.AllowPaging установлено в true, элемент управления выводит блок листания. Его конфигурация задается с помощью тэгов <PagerSettings> и <PagerStyle> или соответствующих им свойств. Страничный блок может содержать кнопки перехода к первой и последней страницам, а также изображения вместо обычных ссылок. Блок листания может работать в двух основных режимах: номеров страниц или кнопок относительной навигации. Режим работы блока листания задается в его свойстве Mode.

Для включения функции сортировки данных нужно установить свойство AllowSorting элемента управления GridView в true. Тогда щелчок заголовка столбца будет восприниматься, как команда отсортировать данные по значениям этого столбца. При желании можно связать со столбцом выражение сортировки, задав его в свойстве SortExpression. Такое выражение представляет собой разделенную запятыми последовательность имен столбцов. Каждое имя столбца может сопровождаться ключевым словом DESC или ASC, определяющим порядок сортировки (по убыванию и возрастанию соответственно). По умолчанию сортировка выполняется по возрастанию значений.

Как и в случае с листанием, реализация сортировки определяется объектом, представляющим источник данных. Если GridView связан с компонентом SqlDataSource, то данные извлекаются из базы в виде DataSet, формируется объект DataView, после чего вызывает его метод Sort(). Для получения от сервера БД заранее отсортированных данных нужно выполнить такие шаги:

1. Присвоить свойству DataSourceMode компонента SqlDataSource значение DataReader.

2. Написать хранимую процедуру, с помощью которой будут извлекаться данные. Очевидно, что хранимая процедура должна динамически составлять текст команды с предложением ORDER BY.

3. Присвоить свойству SortParameterName компонента SqlDataSource имя параметра хранимой процедуры, в котором будет передаваться выражение сортировки.

Учтите, что сортировка данных в базе несовместима с кэшированием. Поэтому установите свойство SqlDataSource.EnableCaching в false, иначе будет сгенерировано исключение. Как результат ‑ при каждом возврате формы будет производиться обращение к базе данных.

Если GridView связан с компонентом ObjectDataSource, то задача сортировки перекладывается на слой доступа к данным, а с него ‑ на СУБД. Свойству SortParameterName компонента ObjectDataSource нужно присвоить имя того параметра указанного метода, в котором задается выражение сортировки.

Операции листания и сортировки требуют выполнения возврата формы с последующим полным обновлением страницы. Однако благодаря введенной в ASP.NET 2.0 технологии обратного вызова сценария элемент управления GridView может сам обратиться к серверу, получить новый набор данных и обновить свой интерфейс, не вынуждая к обновлению всю страницу. Чтобы воспользоваться технологией, нужно установить булево свойство EnableSortingAndPagingCallbacks элемента управления GridView в true.

Кроме поддержки листания и сортировки, GridView позволяет редактировать свои данные прямо в таблице. Для включения поддержки редактирования нужно установить свойство AutoGenerateEditButton в true. Тогда в GridView автоматически появится дополнительный столбец с кнопками для перевода строк в режим редактирования. Свойство EditIndex в режиме редактирования содержит индекс редактируемой строки, а если оно имеет значение -1, то это говорит о том, что ни одна строка в данный момент не редактируется.

Коротко упомянем о возможностях других элементов управления для представления данных. Элемент управления ListView был представлен в ASP.NET 3.5. По своим функциям он схож с GridView, однако его настройка целиком базируется на шаблонах. ListView даёт возможность настроить при помощи шаблонов раскладку, строку данных, области для редактирования и другие части. DataGrid – это устаревший аналог GridView, который не обладает возможностью связывания с компонентом-источником данных. Если пытаться реализовать в DataGrid возможности листания и сортировки, то все это надо делать исключительно программно. DataGrid поддерживает набор колонок, но также как и Repeater и DataList может строить свой вывод на основе шаблонов. Шаблон (template) описывает отдельную строку табличного элемента, позволяя настраивать внешний вид этой строки. При выводе шаблон повторяется требуемое число раз, в зависимости от количества строк в источнике данных. В табл. 30 приведены допустимые шаблоны и указаны поддерживающие их элементы управления.

Таблица 30

Описание шаблонов

Шаблон Описание DataGrid DataList Repeater
ItemTemplate Внешний вид элемента данных Да Да Да
AlternatingItemTemplate Если задан, то чередуется с ItemTemplate Нет Да Да
HeaderTemplate Вид заголовка Да Да Да
FooterTemplate Генерирует внешний вид колонтитула столбца Да Да Да
SeparatorTemplate Вид разделителя элементов данных Нет Да Да
EditItemTemplate Вид редактируемого элемента данных Да Да Нет

5.17. ОТОБражение отдельных записей

В ASP.NET 2.0 появились два новых элемента управления, предназначенных для вывода информации из источника данных не в виде строк таблицы, а в виде отдельных записей. Это элементы управления DetailsView и FormView.

DetailsView ‑ это связанный с данными элемент управления, выводящий на странице одну запись и необязательные кнопки для перехода между записями. Он обычно используется для обновления и вставки записей в сценариях с главным и подчиненным представлениями. Элемент управления DetailsView может быть связан с любым компонентом, представляющим источник данных. Он способен обновлять, удалять и вставлять записи в источнике данных, поддерживающем эти операции. В большинстве случаев для их выполнения не требуется писать ни строчки кода. Для настройки интерфейса элемента управления DetailsView достаточно выбрать необходимые поля данных и стили подобно тому, как это делается с элементом GridView.

Хотя элемент управления DetailsView обычно используется для модификации и вставки записей, он не проверяет, соответствуют ли введенные данные схеме их источника. Не предоставляет он и элементов пользовательского интерфейса, определяемых схемой данных (например, раскрывающегося списка для выбора значений внешнего ключа или специализированных шаблонов для редактирования данных определенных типов).

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

<asp:DetailsView ID="detailsView" runat="server"

DataSourceID="SqlDS" HeaderText="Performers">

</asp:DetailsView>

По умолчанию в элементе управления DetailsView выводятся все поля записи, с которой он связан, и соответствующие им вложенные элементы управления генерируются автоматически. Если же свойство AutoGenerateRows установить в false, то будут выводиться лишь те поля, которые явно перечислены в коллекции Fields. Элемент управления DetailsView поддерживает тот же набор типов полей, что и GridView.

На тот случай, если источник данных окажется пустым, можно задать шаблон EmptyDataTemplate, чтобы вывод элемента управления был более дружественным пользователю:

<asp:DetailsView ID="detailsView" runat="server"

DataSourceID="SqlDS" HeaderText="Performers">

<EmptyDataTemplate>

<asp:Label ID="lblEmpty" runat="server">

There's no data to show in this view.

</asp:Label>

</EmptyDataTemplate>

</asp:DetailsView>

Когда свойство AllowPaging установлено в true, элемент DetailsView выводит блок листания, позволяющий пользователю переходить от записи к записи. Механизм листания элемента управления DetailsView использует свойство PageIndex, в котором содержится индекс текущей записи источника данных. Когда пользователь щелкает ту или иную навигационную кнопку, значение свойства PageIndex изменяется, элемент управления повторяет операцию связывания с данными и обновляет свой пользовательский интерфейс. Общее число записей в источнике данных возвращает свойство PageCount. Переход к другой записи сопровождается парой событий: PageIndexChanging и PageIndexChanged.

Обычно листание реализуется путем обработки серверных событий и требует полного обновления страницы. Однако это не единственная возможность: DetailsView обладает свойством EnablePagingCallbacks, позволяющим включить режим листания с использованием клиентской функции обратного вызова. Когда применяется технология обратного вызова сценария, возврат формы на сервер не производится, а данные новой записи обновляются путем асинхронного вызова сервера.

Элементы управления, подобные DetailsView, особенно полезны в тех случаях, когда основной работой пользователя является обновление, удаление и добавление данных. На командной панели элемента управления DetailsView имеются все необходимые для этого кнопки. Вы даете элементу указание создать эти кнопки, устанавливая в true свойства AutoGenerateEditButton, AutoGenerateDeleteButton и AutoGenerateInsertButton. Как и в случае с элементом управления GridView, все операции с данными DetailsView осуществляет связанный с ним компонент, представляющий источник данных. Для этого компонента нужно определить необходимые команды, а также задать в свойстве DataKeyNames ключ, идентифицирующий текущую запись.

Элемент управления DetailsView не поддерживает шаблонов редактирования и вставки записи, с помощью которых можно было бы полностью изменять его пользовательский интерфейс. Вы можете задать набор шаблонов для отдельного поля, добавив это поле в элемент управления в виде объекта класса TemplateField:

<asp:TemplateField HeaderText="Country">

<ItemTemplate>

<asp:Literal runat="server" Text='<%# Eval("country")%>'/>

</ItemTemplate>

<EditItemTemplate>

<asp:DropDownList ID="ddlCountries" runat="server"

DataSourceID="CountriesDS"

SelectedValue='<%# Bind("country")%>'/>

</EditItemTemplate>

</asp:TemplateField>

Согласно этому определению содержимое поля Country в режиме просмотра выводится в литеральной форме, а в режиме редактирования ‑ в виде раскрывающегося списка. Оператор Bind(), с помощью которого получается выделенное в списке значение, подобен оператору Eval(), но отличается от него двусторонним действием ‑ он не только возвращает прочитанные из источника данные, но и записывает измененное значение в источник данных.

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

Поскольку пользовательский интерфейс элемента управления FormView определяется автором страницы, не приходится ожидать, что элемент сам будет реагировать на щелчок определенной кнопки и действовать соответственно. У него имеется несколько открытых методов (табл. 31), с помощью которых инициируются различные операции.

Таблица 31

Методы элемента управления FormView

Имя метода Описание
ChangeMode() Изменяет рабочий режим элемента управления; этому методу передается значение из перечисления FormViewMode, определяющее целевой режим: Readonly, Edit или Insert
DeleteItem() Удаляет текущую запись элемента управления из источника данных
InsertItem() Вставляет текущую запись элемента управления в источник данных. В момент вызова этого метода элемент управления должен находиться в режиме вставки, в противном случае будет выброшено исключение
UpdateItem() Обновляет текущую запись элемента управления в источнике данных. В момент вызова этого метода элемент управления должен находиться в режиме редактирования, в противном случае будет выброшено исключение

Методы InsertItem() и UpdateItem() предназначены для инициирования соответствующих операций и вызываются элементами управления текущего шаблона. Им не нужно передавать ни вставляемой записи, ни новых значений, ни ключа удаляемой записи. Элемент управления FormView сам отлично знает, как извлечь необходимую информацию (он делает это так же, как элемент управления DetailsView). Методам InsertItem() и UpdateItem() передаётся значение булева типа, указывающее, должна ли производиться проверка данных. Если оно имеет значение true, активизируются проверочные элементы управления, определенные в составе шаблона.

5.18. КОНФИГУРИРОВАНИЕ ВЕБ-ПРИЛОЖЕНИЙ

Конфигурационная информация в ASP.NET имеет иерархическую структуру. Одна её часть хранится в файле machine.config, расположенном на верхнем уровне иерархии и содержащем информацию, относящуюся к компьютеру в целом, другая ‑ в файлах web.config, которые служат узлами иерархического дерева. Заданные в них установки в зависимости от местонахождения этих файлов относятся ко всем установленным на данном компьютере приложениям ASP.NET, отдельному приложению или группе его страниц, хранящихся в одном каталоге. Параметры конфигурации ASP.NET обычно задаются в секции <system.web> файла конфигурации. Некоторые подразделы этой секции перечислены в табл. 32

Таблица 32

Некоторые подразделы <system.web>

Имя раздела Описание
<authentication> Настройки механизма аутентификации
<authorization> Список авторизированных пользователей
<customErrors> Установки пользовательских страниц с сообщениями об ошибках
<globalization> Параметры локализации приложения
<httpCookies> Свойства cookie, используемых приложением ASP.NET «
<httpHandlers> Список зарегистрированных обработчиков HTTP
<httpModules> Список зарегистрированных модулей HTTP
<httpRuntime> Параметры исполняющей среды HTTP
<identity> Включение поддержки имперсонализации
<machineKey> Ключ шифрования для данных, требующих защиты
<membership> Параметры аутентификации пользователей через членство в ASP.NET «
<pages> Функции страниц ASP.NET
<profile> Параметры модели данных пользовательского профиля «
<roleManager> Параметры управления ролями «
<sessionState> Конфигурация объекта Session
<siteMap> Параметры поддержки навигационной инфраструктуры «
<trace> Конфигурация системы трассировки

Отметим, что файл конфигурации может иметь специальный раздел <location>. С его помощью назначают индивидуальные установки подкаталогам приложения. У раздела <location> два атрибута: path и allowOverride. Атрибут path представляет виртуальный путь, к которому применяются установки данного раздела. В следующем примере показано, как он действует. Обратите внимание: имя папки должно быть относительным и не должно начинаться с прямой или обратной косой черты либо точки.

<configuration>

<system.web>

<!-- Здесь располагаются установки для приложения -->

</system.web>

<location path="Reserved">

<system.web>

<!-- Здесь --- установки для подпапки /Reserved -->

</system.web>

</location>

</configuration>

Таким образом, использование <location> позволяет иметь единственный файл web.config, обеспечивающий централизованное хранение установок, но при этом можно конфигурировать каждый подкаталог отдельно.

В составе ASP.NET имеется мощный API для управления конфигурациями с функциями для чтения, записи и навигации по конфигурационным файлам приложения. Специальное пространство имен System.Configuration отвечает за работу с файлами конфигураций. Наборы конфигурационных установок представлены в программе строго типизированными объектами. Например, класс WebConfigurationManager предназначен для работы с установками из приложений ASP.NET.

5.19. ИНФРАСТРУКТУРА ОБРАБОТКИ зАПРОСА

Рассмотрим стадии обработки клиентских запросов компонентами ASP.NET. Итак, пусть клиент направил запрос, URI которого определяет его как относящийся к ASP.NET. На сервере выполнятся следующие шаги.

1. Веб-сервер IIS на основании расширения URI принимает решение о вызове библиотеки aspnet_isapi.dll, написанной на обычном (не на управляемом) коде, и передаёт этой библиотеке данные запроса для обработки.

2. aspnet_isapi.dll запускает (при необходимости) рабочий процесс aspnet_wp.exe, написанный на управляемом коде.

3. В рамках aspnet_wp.exe вызывается статический метод HttpRuntime.ProcessRequest(), который становится ответственным за обработку запроса. В качестве параметра данный метод принимает объект класса HttpWorkerRequest, совмещающий как данные запроса, так и последующие данные ответа.

4. Порождается объект класса HttpContext, содержащий отдельные объекты для представления запроса, ответа, сессии и прочие. Подробнее класс HttpContext будет рассмотрен ниже.

5. Метод HttpApplication.GetApplicationInstance() порождает или возвращает существующий домен для веб-приложения. Дальнейшая работа происходит в рамках этого домена.

6. Срабатывает цепочка HTTP-модулей, являющихся перехватчиками отдельных событий запроса и (при сформированном ответе) ответа.

7. Порождается фабрикой классов или выбирается из списка зарегистрированный HTTP-обработчик. Его задача – обработать запрос в зависимости от конкретного расширения URI.

8. Данные, сформированные обработчиком, передаются в качестве ответа на сервер, отправляющий их клиенту.

Важную роль в процессе обработки HTTP-запроса играет объект класса HttpContext. Он выступает в роли своеобразного «клея», объединяющего все стадии запроса. Табл. 33 содержит описание свойств класса HttpContext.

Таблица 33

Свойства класса HttpContext

Свойство Описание
AllErrors Массив объектов Exception, каждый из которых представляет ошибку, происходящую при выполнении запроса
Application Экземпляр класса HttpApplicationState, содержащий глобальное совместно используемое состояние приложения
ApplicationInstance Объект HttpApplication для текущего запроса, точнее, объект класса, определенного в файле global.asax
Cache Связанный с текущим запросом объект Cache
Current Статическое свойство ‑ текущий объект HttpContext
CurrentHandler Возвращает обработчик текущего запроса «
Error Возвращает первое исключение, сгенерированное при обработке текущего запроса
Handler Возвращает и позволяет задать для текущего запроса обработчик HTTP
IsCustomErrorEnabled Указывает, включена ли для текущего запроса пользовательская обработка ошибок
IsDebuggingEnabled Указывает, выполняется ли запрос в режиме отладки
Items Хэш-таблица, которая для модулей и обработчиков HTTP может служить средством совместного доступа к данным
PreviousHandler Возвращает объект IHttpHandler родительского обработчика
Profile Объект, представляющий профиль текущего пользователя «
Request Экземпляр класса HttpRequest, представляющий текущий запрос HTTP
Response Экземпляр класса HttpResponse, отправляющий клиенту данные ответа HTTP
Server Экземпляр класса HttpServerUtility, предоставляющего вспомогательные методы для обработки запросов
Session Экземпляр класса HttpSessionState, управляющий дан­ными, связанными с конкретным сеансом
SkipAuthorization Позволяет указать, должен ли модуль, осуществляющий авторизацию на основе URL, пропустить для текущего запроса этап авторизационной проверки. Свойство используется главным образом модулями аутентификации, которым нужно перенаправлять пользователя на страницу, с разрешённым анонимным доступом
Timestamp Возвращает объект DateTime, представляющий начальный штамп времени текущего запроса
Trace Объект TraceContext текущего запроса
User Объект IPrincipal, представляющий пользователя, от которого поступил запрос

В ASP.NET программист может создавать собственные HTTP-обработчики, производящие непосредственную обработку запрашиваемых ресурсов с определенным расширением. Технически, HTTP-обработчик – это класс, реализующий интерфейс System.Web.IHttpHandler и зарегистрированный в инфраструктуре ASP.NET при помощи конфигурационных файлов.

В качестве примера рассмотрим создание обработчика, который будет перехватывать все запросы к страницам с расширением *.calc и выводить сумму двух чисел, переданных как параметры GET-запроса. Первое, что необходимо выполнить – написать класс с реализацией IHttpHandler. Интерфейс IHttpHandler содержит следующие элементы:

· void ProcessRequest(HttpContext context) – в этом методе происходит обработка запроса и формирование ответа с использованием данных объекта context;

· bool IsReusable { get; } – это свойство возвращает true, если один объект-обработчик можно использовать для нескольких запросов.

Наш обработчик будет реализован как класс CalcHandler, размещенный в сборке UserHandlers.dll.

// CalcUserHandler.cs file

using System;

using System.Web;

 

namespace UserHandlers

{

public class CalcHandler: IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

var objRequest = context.Request;

var result = Int32.Parse(objRequest.Params["p1"]) +

Int32.Parse(objRequest.Params["p2"]);

var objResponse = context.Response;

objResponse.Write("<html><body><h1>");

objResponse.Write(result.ToString());

objResponse.Write("</h1></body></html>");

}

 

public bool IsReusable

{

get { return true; }

}

}

}

Скомпилированную сборку UserHandlers.dll разместим в каталоге Bin некоего веб-приложения (в случае создания глобальных обработчиков следует использовать GAC).

Теперь зарегистрируем обработчик. Для этого используется секция <httpHandlers> в конфигурационных файлах. Секция может содержать элементы <add>, <remove> и <clear>. Атрибутами <add> являются:

verb – специфицирует глагол протокола HTTP. Можно указать несколько глаголов через запятую (GET, POST) либо использовать символ *;

path – отдельный файл или шаблон файлов (расширение), к которым применяется обработчик;

type – имя класса обработчика и имя сборки, в которой он находится.

Для регистрации нашего обработчика используется такой файл web.config:

<configuration>

<system.web>

<httpHandlers>

<add verb="*" path="*.calc"

type="UserHandlers.CalcHandler, UserHandlers"/>

</httpHandlers>

</system.web>

</configuration>

Кроме регистрации в конфигурационном файле, расширение.calc должно быть зарегистрировано в IIS, чтобы вызывалась aspnet_isapi.dll.

Альтернативный способ определения обработчика HTTP предполагает использование файла.ashx. Такой обработчик активизируется при получении запроса ресурса.ashx. Связь между обработчиком и ресурсом.ashx устанавливается в самом файле ресурса с помощью специальной директивы @WebHandler:

<%@ WebHandler Language="C#" Class="Handler" %>

При получении HTTP-запроса с указанием URL, соответствующего ресурсу.ashx, автоматически вызывается класс Handler. Ниже приведен пример содержимого файла.ashx. Как видите, это просто файл класса, в который добавлена директива @WebHandler.

<%@ WebHandler Language="C#" Class="Handler" %>

using System;

using System.Web;

 

public class Handler: IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

context.Response.ContentType = "text/plain";

context.Response.Write("Hello World");

}

 

public bool IsReusable

{

get { return false; }

}

}

Когда для реализации обработчика HTTP используется ресурс.ashx, никакой дополнительной настройки для его инсталляции не требуется.

5.20. ВЕБ-ПРИЛОЖЕНИЕ И ФАЙЛ GLOBAL.ASAX

Каждое веб-приложение описывается объектом класса HttpApplication, или класса-наследника HttpApplication. Свойства данного класса описаны в табл. 34.

Таблица 34

Свойства класса HttpApplication

Имя свойства Описание
Application Объект класса HttpApplicationState, описывающий состояние веб-приложения
Context Объект класса HttpContex, описывающий контекст запроса
Modules Коллекция модулей – специальных обработчиков, дополняющих функции работы с запросом пользователя
Request Ссылка на объект HttpRequest, обеспечивающий доступ к информации о HTTP-запросе
Response Ссылка на объект HttpResponse, обеспечивающий доступ к информации о HTTP-ответе
Server Объект класса HttpServerUtility, описывающий параметры веб-сервера
Session Ссылка на объект класса HttpSessionState, хранящий данные текущей сессии пользователя в веб-приложении
User Ссылка на объект, реализующий интерфейс IPrincipal и описывающий пользователя. Используется при аутентификации

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

Таблица 35

Некоторые события веб-приложения

Событие Причина срабатывания
BeginRequest Получение нового запроса  
AuthenticateRequest Завершение аутентификации пользователя  
AuthorizeRequest Завершение авторизации пользователя  
ResolveRequestCache Генерируется после авторизации, но перед запуском обработчика. Используется модулями кэширования для отмены выполнения обработчиков запроса, если в кэше есть нужная запись  
AcquireRequestState Загрузка состояния сеанса  
PreRequestHandlerExecute Перед передачей запроса обработчику  
PostRequestHandlerExecute Завершение обработчика запроса  
ReleaseRequestState После завершения всех обработчиков запроса. Используется модулями состояний для сохранения значений состояния  
UpdateRequestCache После завершения обработчика. Используется модулями кэширования для сохранения ответа в кэше  
EndRequest После обработки запроса  
Disposed Перед закрытием приложения
Error При наступлении необработанной исключительной ситуации
PreSendRequestContent Перед передачей клиенту содержимого ответа
PreSendRequestHeaders Перед передачей клиенту заголовков HTTP

Для реализации перехватчика события можно создать пользовательский HTTP-модуль. Но простейшим вариантом является использование файла global.asax. Этот файл играет роль пункта реализации глобальных событий, объектов и переменных.

Файл global.asax поддерживает три директивы: @Application, @Import, @Assembly. Директива @Application позволяет определить базовый класс, на основе которого создается класс приложения (атрибут Inherits), указать язык программирования для серверного кода обработчиков событий (атрибут Language), а также задать описание приложения (атрибут Description).

Приведем пример файла global.asax, содержащего обработчики событий BeginRequest и EndRequest (заметим, что при использовании Visual Studio файл global.asax будет сопровождаться файлом Code Behind).

<%@ Application Language="C#" %>

 

<script runat="server">

void Application_BeginRequest(object sender, EventArgs e)

{

Response.Write("Request starts!" + "<br />");

}

void Application_EndRequest(object sender, EventArgs e)

{

Response.Write("Request ends!" + "<br />");

}

</script>

Некоторые события можно обработать, используя только обработчики, размещенные в файле global.asax. Это события Application_Start (запуск приложения), Application_End (завершение приложения), Session_Start (начало сеанса пользователя), Session_End (завершение сеанса пользователя).

5.21. МОДЕЛЬ ПОСТАВЩИКОВ

Модель поставщиков, появившаяся в ASP.NET 2.0, даёт разработчикам возможность заменять встроенные компоненты ASP.NET, а также делать заменяемыми и настраиваемыми компоненты собственных приложений. Для стандартных функций ASP.NET, таких как, например, управление членством, состоянием или пользовательскими профилями, в этой системе имеется несколько готовых поставщиков, один из которых является используемым по умолчанию. Настраивая среду исполнения приложения ASP.NET при помощи конфигурационных файлов, можно выбрать для каждой функции системы тот поставщик, который лучше подходит для нужд данного приложения.

В ASP.NET 2.0 каждый поставщик представляет собой класс, наследующий некий базовый класс, но переопределяющий его поведение. Для создания собственного поставщика заданного сервиса вы определяете новый класс. Все поставщики поддерживаемых сервисов являются производными от одного базового класса ProviderBase. В табл. 36 перечислены базовые классы и соответствующие им функции поставщиков.

Таблица 36

Базовые классы поставщиков и соответствующие сервисы

Имя класса Описание сервиса
MembershipProvider Управление учетными записями пользователей
PersonalizationProvider Управление персонализацией компонентов Web Parts
ProfileProvider Сохранение информации пользовательских профилей
ProtectedConfigurationProvider Шифрование информации в файлах конфигурации
RoleProvider Управление информацией о ролях пользователей
SessionStateStoreProviderBase Работа с данных состояния сеанса пользователя
SiteMapProvider Управление информацией карты сайта
WebEventProvider Мониторинг состояния системы и приложения, обработка системных событий

Рассмотрим некоторые поставщики. В ASP.NET имеются два поставщика членства: SqlMembershipProvider и ActiveDirectoryMembershipProvider. Они оба определены в пространстве имен System.WebSecurity. Функциями поставщика SqlMembershipProvider являются сохранение информации о членстве в специальных таблицах базы данных. Поставщик ActiveDirectoryMembershipProvider управляет хранением информации о членстве в Active Directory.

В ASP.NET имеются три реализации базового класса поставщика ролей: SqlRoleProvider, WindowsTokenRoleProvider и AuthorizationStore-RoleProvider. Класс SqlRoleProvider (используемый по умолчанию поставщик ролей) хранит связи между пользователями и ролями в базе данных. WindowsTokenRoleProvider – это поставщик ролей, использующий для получения сведений о пользователях информацию из системы групп безопасности Windows. Он предназначен в первую очередь для интранет-приложений ASP.NET, в которых применяется аутентификация Windows, и запрещен анонимный доступ. Возвращаемая поставщиком информация о ролях пользователя основана на его членстве в определенной группе Windows. Данный поставщик нельзя использовать для создания и удаления ролей. Поставщик AuthorizationStoreRoleProvider управляет хранением информации о ролях, предназначенной для менеджера авторизации AzMan.

В ASP.NET имеется единственный встроенный поставщик профилей –SqlProfileProvider, определенный в пространстве имен System.Web.Profile. Для хранения данных профиля он использует таблицу базы данных. Обязанность поставщика профиля – считывать данные профиля из хранилища в начале выполнения запроса и записывать измененные значения обратно по завершении его выполнения. Таблица поставщика содержит по одной записи на каждого пользователя приложения. Пользовательские установки представлены в виде последовательности значений, в которой различаются текст и двоичные данные.

Управление состоянием сеанса – одна из основ ASP.NET. Для каждого сеанса работы пользователя с приложением система сохраняет коллекцию пар «имя=значение», определяющих состояние сеанса, и предоставляет API чтения и записи этих данных, реализованный в виде объекта Session. Поставщик состояния сеанса – это компонент, ответственный за предоставление данных, связанных с текущим сеансом. В ASP.NET имеются три предопределенных поставщика, хранящих данные в памяти рабочего процесса, на сервере состояния и в базе данных MS SQL Server. Используемый по умолчанию поставщик InProcSessionStateStore хранит данные в виде живых объектов в кэше ASP.NET. Поскольку эти данные доступны в любой момент, поставщик InProcSessionStateStore является наиболее быстрым среди своих собратьев. Однако чем больше данных состояния сеанса он хранит, тем больше потребляет памяти сервера, увеличивая тем самым риск снижения производительности. Поставщик состояния сеанса OutOfProcSessionStateStore хранит данные вне рабочего процесса ASP.NET. Если говорить конкретнее, он держит их в памяти сервиса Windows, имя которого – aspnet_state.exe. По умолчанию этот сервис остановлен, и его нужно запускать вручную. Поставщик SqlSessionStateStore хранит данные состояния сеанса в базе данных MS SQL Server. Вы можете хранить данные на любом компьютере, с которым у веб-сервера имеется связь и на котором выполняется MS SQL Server версии 7.0 или выше. По умолчанию поставщиком SqlSessionStateStore используется база данных ASPState, содержащая несколько хранимых процедур.

Стандартные поставщики ASP.NET 2.0, сохраняющие информацию в базе данных MS SQL Server, работают с определенным набором таблиц. Ниже указано назначение каждой таблицы.

Таблица 37

Описание таблиц стандартных поставщиков

Имя таблицы Описание
aspnet_Applications Перечень приложений, использующих базу данных
aspnet_Membership Информация о членстве пользователей приложений; перечень пользователей хранится в таблице aspnet_Users
aspnet_Paths Пути к страницам, использующим Web Parts
aspnet_PersonalizationAllUsers Информация о структуре страниц приложений, использующих Web Parts, относящаяся ко всем пользователям
aspnet_PersonalizationPerUser Относящаяся к конкретным пользователям информация о структуре страниц приложений, использующих Web Parts
aspnet_Profile Данные профиля для каждого из пользователей
aspnet_Roles Список всех доступных ролей
aspnet_SchemaVersions Информация о версиях схемы таблиц, поддерживаемых каждой функцией
aspnet_Users Перечень всех зарегистрированных пользователей. Данная таблица совместно используется всеми поставщиками, которым требуется информация о пользователях
aspnet_UsersInRoles Информация о соответствии между пользователями и ролями
aspnet_WebEvent_Events Сведения о запротоколированных событиях Web

Для создания описанных таблиц можно использовать утилиту aspnet_regsql.exe или инструмент Web Site Administration Tool (WSAT), доступный в Visual Studio 2008 через меню Website.

5.22. Поддержка Сохранения Состояния

Специфика большинства веб-приложений подразумевает хранение информации (состояния) при переходе от одной страницы приложения к другой. Типичным примером является Internet-магазин, в котором пользователь просматривает страницы с информацией о товаре, помещает некоторые товары в свою корзину покупок, а затем оформляет окончательный заказ. Протокол HTTP не имеет стандартных средств для поддержки сохранения состояний, поэтому данная задача реализуется внешними по отношению к протоколу средствами. Платформа ASP.NET предоставляет программистам достаточный встроенный «арсенал» средств управления состояниями, что зачастую избавляет от написания лишнего кода.

ASP.NET поддерживает четыре основных типа состояний: состояние приложения, состояние сеанса, cookie и состояние представления (View State). Табл. 38 предназначена для характеристики и сравнения различных типов состояний.

Таблица 38

Характеристика различных типов состояний

Тип Область видимости Преимущества Недостатки
Состояние приложения Глобальная в приложении Совместно используется всеми клиентами Не могут вместе использоваться многими компьютерами. Область применения перекрывается средствами кэширования данных
Состояние сеанса Для клиента Может конфигурироваться на совместное использование многими компьютерами Требуется коррекция файлов cookie и адресов URL для управления взаимодействием клиентов
Cookie Для клиента Не зависит от настроек сервера. Сохраняется у клиента. Может существовать после завершения сеанса Ограниченный объем памяти (около 4 Кбайт). Клиент может отключить поддержку cookie. Состояние передаётся в обоих направлениях с каждым запросом
Состояние представления На уровне запросов POST к этой же странице Не зависит от настроек сервера Сохраняется, только если запрос POST передается этой же странице. Передаётся в обоих направлениях с каждым запросом

К состоянию приложения можно обратиться, используя свойство Application класса страницы или приложения. Свойство возвращает объект типа HttpApplicationState. Этот класс является коллекцией, хранящей данные любых типов в парах ключ/значение, где ключом является строка или числовой индекс. Пример использования состояния приложения приведен в следующем фрагменте кода. Как только приложение запускается, оно загружает данные из БД. После этого для обращения к данным можно сослаться на кэшированную версию объекта:

// фрагмент файла global.asax:

protected void Application_Start(object src, EventArgs e)

{

var ds = new DataSet();

// здесь как-то заполняем набор данных (не показано)

// кэшируем ссылку на набор данных

Application["FooDataSet"] = ds;

}

 

// фрагмент файла страницы:

protected void Page_Load(object src, EventArgs e)

{

myGridView.DataSource = (DataSet)(Application["FooDataSet"]);

}

Состояние приложения разделяется между всеми клиентами приложения. Это значит, что несколько клиентов одновременно могут осуществлять доступ (чтение или запись) к данным в состоянии приложения. Класс HttpApplicationState имеет встроенные средства контроля целостности данных. В некоторых ситуациях можно вручную вызвать методы класса Lock() и Unlock() для установки и снятия блокировки состояния приложения.

В большинстве веб-приложений требуется хранить некоторую информацию персонально для каждого клиента (например, для отслеживания заказанных товаров при посещении интернет-магазина). ASP.NET предполагает использование для этих целей состояний сеансов (или сессий). Когда с приложением начинает взаимодействовать новый клиент, новый идентификатор сеанса автоматически генерируется и ассоциируется с каждым последующим запросом этого же клиента (или с помощью cookies, или путем коррекции URL).

Состояния сеанса поддерживаются в экземпляре класса HttpSessionState и доступны через свойство Session страницы или объекта HttpContext. Табл. 39 показывает основные элементы класса HttpSessionState.

Таблица 39

Элементы класса HttpSessionState

Имя элемента Описание
Count Количество элементов в коллекции
IsCookieless Булево свойство; указывает, используются ли cookie для сохранения идентификатора сессии
IsNewSession Булево свойство; true, если сессия создана текущим запросом
IsReadOnly Свойство равно true, если элементы сессии доступны только для чтения
Mode Режим сохранения объекта сессии, одно из значений перечисления SessionStateMode: InProc – объект сохраняется в рабочем процессе ASP.NET, Off – отсутствует поддержка сессий, StateServer – за сохранение объекта сессии отвечает внешняя служба, SQLServer – объект сессии сохраняется в базе данных, Custom – за сохранение сессии отвечает пользовательский поставщик
SessionID Строка с уникальным идентификатором сессии
Timeout Время жизни сессии в минутах
Add() Метод для добавления элемента в коллекцию сессии
Abandon() Метод вызывает уничтожение сессии
Clear() Удаляет все элементы коллекции, аналог RemoveAll()
Remove() Удаляет элемент с указанным именем (ключом)
RemoveAll() Удаляет все элементы коллекции
RemoveAt() Удаляет элемент в указанной позиции

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

Конфигурирование состояния сеанса выполняется при помощи секции <sessionState>. Возможные атрибуты этой секции описаны в табл. 40. Большинство атрибутов введены в ASP.NET 2.0, а от ASP.NET 1.0 в неизменном виде унаследовано только четыре атрибута: mode, timeout, stateConnectionString и sqlConnectionString. Атрибут cookieless в ASP.NET 1.0 имел булев тип.

Таблица 40

Атрибуты раздела <sessionState>

Атрибут Описание
allowCustomSqlDatabase Если равен true, данные сеанса могут храниться в заданной вами таблице БД, а не в стандартной ASPState
cookieless Определяет, как идентификатор сеанса должен передаваться клиенту
cookieName Имя cookie, если для хранения идентификаторов сеанса используются cookie
customProvider Имя пользовательского поставщика состояния сеанса
mode Определяет, где должны храниться данные состояния
regenerateExpiredSessionId Если равен true, при получении запроса с просроченным идентификатором сеанса генерируется новый идентификатор, иначе прежний идентификатор снова становится действительным. По умолчанию атрибут имеет значение false
sessionIDManagerType Идентифицирует компонент, который будет использоваться в качестве генератора идентификаторов сеанса. По умолчанию данный атрибут имеет значение null
sqlCommandTimeout Определяет, как долго SQL-команда может не возвращать результат, прежде чем она будет отменена. По умолчанию дан­ный атрибут имеет значение 30 секунд
sqlConnectionString Строка подключения к



Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 976; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.321 сек.