русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

No Name


Дата добавления: 2013-12-23; просмотров: 1263; Нарушение авторских прав


</asp:Label>

Рассмотрим набор серверных HTML-элементов. Они представлены классами из пространства имен System.Web.UI.HtmlControls. Базовым классом для всех серверных HTML-элементов является класс HtmlControl. Основные элементы данного класса перечислены в таблице 40.

Таблица 40

Элементы класса System.Web.UI.HtmlControls

Имя элемента Описание
Attributes Возвращает коллекцию пар имя-значение для всех атрибутов в файле .aspx для элемента управления. Может использоваться для чтения и установки нестандартных атрибутов
Controls Объект типа ControlCollection. Содержит ссылки на элементы управления, являющиеся «дочерними»[41] для данного
Disabled Булево значение; показывает, отключен ли элемент
EnableViewState Булево значение, которое управляет поддержкой сохранения состояния в элементе и его «потомках». По умолчанию – сохранение состояния включено (true)
ID Свойство задает строку-идентификатор элемента управления (имя поля в классе-странице)
Page Ссылка на объект Page, содержащий элемент управления
Parent Ссылка на родительский элемент в страничной иерархии
Style Коллекция свойств CSS, которые будут добавлены к тэгу элемента при отображении. Позволяет настраивать внешний вид элемента
TagName Строка, имя HTML-тега, который соответствует элементу
Visible Булево значение; показывает, виден ли элемент на странице
DataBind() Метод выполняет связывание данных для элемента управления и всех его потомков
FindControl() Метод позволяет найти элемент управления в коллекции элементов-потомков данного
HasControls() Метод возвращает true, если элемент управления имеет потомков
DataBinding Данное событие происходит при связывании данных

Класс HtmlContainerControl – это второй базовый класс для серверных HTML-элементов. Он используется как предок теми элементами, которые должны иметь закрывающий тэг (то есть обязательно образуют секцию в описании страницы). Данный класс наследуется от класса HtmlControl и имеет два полезных свойства:



§ InnerHtml – строка с HTML-содержимым и текстом, заключенным между открывающим и закрывающим тэгом элемента;

§ InnerText – строка только с текстовым содержимым элемента.

Далее приведена таблица, содержащая краткое описание серверных HTML-элементов.

Таблица 41

Серверные HTML-элементы

Имя элемента Описание Специфичные свойства и события
HtmlAnchor Ссылка на страницу или часть страницы Href, Target, Title, Name, OnServerClick
HtmlImage Изображение на странице с настраиваемыми параметрами Align, Alt, Border, Height, Src, Width
HtmlForm Обрамляющая форма для других элементов управления Name, Enctype, Method, Target
HtmlButton Кнопка-контейнер (не поддерживается браузерами Opera и Navigator) CausesValidation, OnServerClick
HtmlInputButton Кнопка на форме Name, Type, Value, CausesValidation, OnServerClick
HtmlInputText Текстовое поле MaxLength, Name, Size, Type, Value, OnServerChange
HtmlInputCheckBox Переключатель-флаг Checked, Name, Type, Value, OnServerChange
HtmlInputRadioButton Один из группы взаимно исключающих переключателей Checked, Name, Type, Value, OnServerChange
HtmlInputImage Изображение на странице, которое допускает щелчок (как кнопка Submit) Align, Alt, Border, Name, Src, Type, Value, CausesValidation, OnServerClick
HtmlInputFile Реализует возможность копирования файлов на сервер Accept, MaxLength, Name, PostedFile, Size, Type, Value
HtmlInputHidden Невидимое поле на странице (для передачи служебных значений) Name, Type, Value, OnServerChange
HtmlTextArea Текст, состоящий из нескольких строк Cols, Name, Rows, Value, OnServerChange
HtmlSelect Списковый элемент управления Multiple, SelectedIndex, Size, Value, DataSource, DataTextField, DataValueField Items (коллекция), OnServerChange
HtmlTable Таблица Align, BgColor, Border, BorderColor, CellPadding, CellSpacing, Height, NoWrap, Width Rows (коллекция)
HtmlTableRow Строка таблицы Align, BgColor, Border, BorderColor, Height, VAlign Cells (коллекция)
HtmlTableCell Ячейка таблицы Align, BgColor, Border, BorderColor, ColSpan, Height, NoWrap, RowSpan, VAlign, Width

Обсудим некоторые свойства и события элементов. Если булево свойство CausesValidation установлено в true, то при щелчке на элементе управления выполняется проверка страницы (о проверочных элементах будет рассказано ниже). Элементы управления HtmlAnchor, HtmlButton, HtmlInputButton, HtmlInputImage генерируют событие OnServerClick, которое происходит при нажатии на элементе. Обработчик данного события выполняется на сервере и получает два параметра. Первый – ссылка на объект, породивший событие, откуда можно получить ID источника события. Второй – объект типа EventArgs с дополнительной информацией о событии. Элементы HtmlInputText, HtmlInputCheckBox, HtmlInputRadioButton, HtmlInputHidden и HtmlSelect генерируют событие OnServerChange. Событие порождается, когда страница передается на сервер, для каждого элемента, чье значение изменилось с момента отправки клиенту страницы.

Рассмотрим пример страницы с некоторыми серверными HTML-элементами. Страница демонстрирует настройку отдельных свойств элементов, а также наличие обработчиков событий.

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

<script runat="server">

void Page_Load(object sender, EventArgs e) {

if (!IsPostBack) Radio1.Checked = true;

}

void Submit1_Click(object sender, EventArgs e) {

DIV1.InnerHtml += "Name is " + Text1.Value + "<br />";

}

void Radio1_Change(object sender, EventArgs e) {

if (Radio1.Checked)

DIV1.InnerHtml += "Have an ID" + "<br />";

else DIV1.InnerHtml += "Dont have an ID" + "<br />";

}

</script>

 

<html>

<body>

<form id="form1" runat="server">

<div>

Your name:

<input id="Text1" runat="server" type="text" />

<br /><br />

Password:

<input id="Pass1" runat="server" type="password" />

<br /><br />

Have an ID?

<input id="Radio1" runat="server" type="radio"

onserverchange="Radio1_Change" />

Yes

<input id="Radio2" runat="server" type="radio"

onserverchange="Radio1_Change" />

No

<br /><br />

<input id="Submit1" type="submit" value="Submit!"

onserverclick="Submit1_Click" runat="server" />

<br /><br />

</div>

</form>

</body>

</html>

Вид страницы в браузере после заполнения полей и нажатия кнопки Submit показан на рисунке 17.

Рис. 17. Страница с серверными HTML-элементами в браузере

5.6. Элементы управления Web Controls

Наряду с серверными HTML-элементами ASP.NET предоставляет альтернативный набор классов для создания web-страниц. Это классы иерархии Web Controls. Классы данной иерархии также соответствуют элементам управления, но предоставляют развитый, унифицированный набор свойств, методов и событий, упрощающий программирование.

Иерархия классов Web Control представлена на схеме 18.

Рис. 18. Иерархия классов Web Control

Базовым классом для всех элементов управления Web Controls является класс WebControl. Основные свойства этого класса перечислены в таблице 42.

Таблица 42

Основные свойства класса WebControl

Имя свойства Описание
Attributes Возвращает коллекцию пар имя-значение для всех атрибутов в файле .aspx для элемента управления. Может использоваться для чтения и установки нестандартных атрибутов
AccessKey Позволяет установить клавишу быстрого доступа для элемента управления
BackColor Фоновый цвет элемента управления
BorderColor Цвет границы элемента управления
BorderStyle Стиль границы: сплошная, пунктирная, двойная и т. д.
BorderWidth Ширина границы элемента управления
Controls Объект типа ControlCollection. Содержит ссылки на элементы управления, являющиеся «дочерними» для данного
Enabled Булево значение; показывает, активен ли элемент
EnableViewState Булево значение, которое управляет поддержкой сохранения состояния в элементе и его «потомках». По умолчанию – сохранение состояния включено (true)
Font Свойство для настройки параметров шрифта, которым отображается информация в элементе
ForeColor Цвет «переднего плана» в элементе управления. Обычно это цвет текста
Height Общая высота элемента управления
ID Свойство задает строку-идентификатор элемента управления (имя поля в классе-странице)
Page Ссылка на объект Page, содержащий элемент управления
Parent Родительский элемент управления в страничной иерархии
Style Коллекция свойств CSS, которые будут добавлены к тэгу элемента при отображении. Позволяет настраивать внешний вид элемента
TabIndex Позиция элемента управления в порядке переноса фокуса ввода на странице
ToolTip Текст подсказки, появляющийся при наведении мыши на элемент
Visible Булево значение; показывает, виден ли элемент на странице
Width Общая ширина элемента управления

Кроме перечисленных свойств класс WebControl предоставляет методы DataBind(), FindControl(), HasControls(), назначение которых аналогично соответствующим методам класса HtmlControl.

В данном параграфе будут рассмотрены те элементы управления Web Controls, которые можно назвать базовыми. Эти элементы управления, а также их специфические свойства и событие перечислены в таблице 43:

Таблица 43

Базовые злементы управления Web Controls

Элемент Специфические свойства Специфические события
HyperLink ImageUrl, NavigateUrl, Target, Text  
LinkButton CommandArgument, CommandName, Text, CausesValidation OnClick(), OnCommand()
Image AlternateText, ImageAlign, ImageUrl  
Panel BackImageUrl, HorizontalAlign, Wrap  
Label Text  
Button CommandArgument, CommandName, Text, CausesValidation OnClick(), OnCommand()
TextBox AutoPostBack, Columns, MaxLength, ReadOnly, Rows, Text, TextMode, Wrap OnTextChanged()
CheckBox AutoPostBack, Checked, Text, TextAlign OnCheckedChanged()
RadioButton AutoPostBack, Checked, GroupName, Text, TextAlign OnCheckedChanged()
ImageButton CommandArgument,CommandName,CausesValidation OnClick(), OnCommand()
Table BackImageUrl, CellPadding, CellSpacing, GridLines, HorizontalAlign, Rows  
TableRow Cells, HorizontalAlign, VerticalAlign  
TableCell ColumnSpan, HorizontalAlign, RowSpan, Text, VerticalAlign, Wrap  
Literal Text  
PlaceHolder    

Объясним назначение некоторых свойств и событий элементов управления. Если булево свойство AutoPostBack установлено в значение true, то изменение состояния элемента автоматически ведет к отправке страницы на сервер. Свойство Text содержит текст или поясняющую надпись на элементе управления. Если булево свойство CausesValidation установлено в true, то при щелчке на элементе управления выполняется проверка страницы. События OnTextChanged() и OnCheckedChanged() срабатывают на сервере при изменении состояния соответствующих элементов управления. Некоторые элементы управления генерируют событие OnClick(), которое происходит при нажатии на элементе.

Три базовых элемента управления – Button, ImageButton и LinkButton – способны генерировать событие OnCommand() в дополнение к событию OnClick(). У этих элементов можно задать два текстовых свойства: CommandName и CommandArgument. Когда кнопка нажимается, значение указанных свойств можно использовать в обработчике события OnCommand().

5.7. Проверочные элементы управления

Кроме визуальных элементов управления, ASP.NET предоставляет набор проверочных элементов. Проверочные элементы управления налагают определенные разработчиком ограничения на данные, вводимые пользователем в формы. При настройке проверочный элемент связывается с элементом управления на форме. В качестве проверяемых могут выступать элементы HTMLInputText, HTMLTextArea, HTMLSelect, HTMLInputFile, TextBox, DropDownList, ListBox, RadioButtonList. В случае если проверка закончилась неудачей, проверочный элемент способен отобразить текстовое разъясняющее сообщение около проверяемого элемента.

В web-приложении проверка данных, вводимым пользователем, может выполняться на стороне клиента, на стороне сервера или в обоих местах. Проверка на стороне клиента уменьшает количество обменов между клиентом и сервером, необходимых для успешного завершения формы. Однако клиентская проверка может быть выполнена не всегда. Во-первых, для выполнения проверки браузер должен поддерживать язык сценариев. Во-вторых, клиент часто не обладает достаточной информацией, требуемой для завершения проверки. Поэтому проверки на стороне клиента обычно используются в сочетании с проверками на стороне сервера. Достоинство проверочных элементов ASP.NET заключается в том, что они способны автоматически распознавать поддержку клиентом языка сценариев и в зависимости от этого генерировать клиентский либо серверный код проверки.

Рассмотрим общую архитектуру проверочных элементов. Любой проверочный элемент реализует интерфейс System.Web.UI.IValidator, который объявлен следующим образом:

interface IValidator {

string ErrorMessage{set; get; }

bool IsValid{set; get; }

void Validate();

}

Метод Validate() выполняет процедуру проверку, свойство IsValid указывает, успешно ли выполнилась проверка, а свойство ErrorMessage позволяет определить строку-сообщение в случае провала проверки.

Для всех проверочных элементов базовым является абстрактный класс BaseValidator (из пространства имен System.Web.UI.WebControls), основные элементы которого перечислены в таблице 44.

Таблица 44

Элементы класса System.Web.UI.WebControls.BaseValidator

Имя элемента Описание
ControlToValidate Строка, идентификатор того элемента управления, который проверяется
Display Свойство определяет, должно ли значение проверочного элемента занять некоторое пространство, если оно не выводится. Значение свойства – элемент перечисления ValidatorDisplay
EnableClientScript Булево свойство, управляет использованием клиентского скрипта для проверки
Enabled Булево свойство для включения или выключения проверочного элемента
ErrorMessage Свойство-строка, позволяет установить или прочитать текстовое сообщение, которое отображается в элементе ValidationSummary при неуспешной проверке
ForeColor Цвет строки проверочного элемента (по умолчанию – красный)
IsValid Булево свойство, которое показывает, успешно ли выполнилась проверка
Text Строка, которую отображает проверочный элемент при провале проверки
Validate() Метод выполняет процедуру проверку и обновляет значение свойства IsValid

Класс Page поддерживает список всех проверочных элементов на странице в коллекции Validators. Класс Page предоставляет метод верхнего уровня Validate(), который применяется для коллективного вызова одноименного метода всех проверочных элементов. Этот метод вызывается на стороне сервера автоматически, после того загружено состояние элементов управления страницы. Метод Page.Validate() устанавливает булево свойство страницы IsValid. Как правило, значение данного свойства проверяется в обработчике события Page_Load.

Опишем подробнее конкретные проверочные элементы ASP.NET.

 

Элемент: RequiredFieldValidator

Назначение: Используется для проверки того, что элемент управления не пуст или значение в нем изменено.

Специфичные свойства:

§ InitialValue – проверка считается не пройденной, если при потере фокуса элементом управления значение в нем равно строке InitialValue. По умолчанию значение свойства – пустая строка.

 

 

Элемент: CompareValidator

Назначение: Применяется для сравнения двух полей формы или поля и константы. Может использоваться для того, чтобы проверить, соответствует ли значение поля определенному типу.

Специфичные свойства:

§ ControlToCompare – строка, идентификатор того элемента управления, с которым сравнивается связанный с CompareValidator элемент.

§ ValueToCompare – значение (в виде строки), с которым сравнивается элемент, связанный с CompareValidator[42].

§ Operator – операция сравнения. Тип свойства – перечисление ValidationCompareOperator, в которое входят следующие элементы: Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, DataTypeCheck. Если Operator равен DataTypeCheck, то выполняется только проверка того, соответствует ли значение в элементе управления типу, заданному в свойстве Type.

§ Type – тип, в который будет преобразовано значение в элементе управления перед проверкой. Свойство принимает значения из перечисления ValidationDataType c элементами String, Integer, Double, Date, Currency.

 

 

Элемент: RangeValidator

Назначение: Проверяет, входит ли значение элемента управления в указанный текстовый или числовой диапазон.

Специфичные свойства:

§ MaximumValue, MinimumValue – строки, задающие границы диапазона проверки.

§ Type – тип, в который будет преобразовано значение в элементе управления перед проверкой. Аналог соответствующего свойства из CompareValidator.

 

Элемент: RegularExpressionValidator

Назначение: Проверяет, удовлетворяет ли значение элемента управления заданному регулярному выражению.

Специфичные свойства:

§ ValidationExpression – строка с регулярным выражением.

 

 

Элемент: CustomValidator

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

Специфичные свойства и события:

§ OnServerValidate – обработчик этого события должен быть задан для проведения проверки на стороне сервера. Фрагмент страницы показывает пример обработчика:

<script runat="server">

void ServerValidation(object source,

ServerValidateEventArgs arguments) {

int i = int.Parse(arguments.Value);

arguments.IsValid = ((i%2) == 0);

}

</script>

§ ClientValidationFunction – строки с именем клиентской функции, которая будет использоваться для проверки. Так как проверка выполняется на клиенте, то проверочная функция должна быть включена в клиентский скрипт и может быть написана на JavaScript или на VBScript. Следующий фрагмент страницы показывает пример клиентской функции для проверки. Обратите внимание на аргументы функции и их использование:

<script language="vbscript">

Sub ClientValidate(source, arguments)

If (arguments.Value mod 2) = 0 Then

arguments.IsValid = true

Else

arguments.IsValid = false

End If

End Sub

</script>

Элемент: ValidationSummary

Назначение: Элемент может использоваться для отображения на странице итогов проверок. Если у проверочных элементов определены свойства ErrorMessage, то элемент покажет их в виде списка.

Специфичные свойства:

§ DisplayMode – свойство позволяет выбрать вид суммарного отчета об ошибках. Значения свойства – элемент перечисления ValidationSummaryDisplayMode: BulletList (по умолчанию), List, SingleParagraph.

§ HeaderText – строка с заголовком отчета.

§ ShowMessageBox – если данное булево свойство установлено в true, то отчет отображается в отдельном диалоговом окне.

§ ShowSummary – если данное булево свойство установлено в true (по умолчанию), то отчет отображается на странице. Свойство часто используется совместно с ShowMessageBox. Если, например ShowMessageBox=true, ShowSummary=false, то отчет отображается только в диалоговом окне, но не на странице.

 

В качестве примера использования проверочных элементов, а также элементов Web Controls, рассмотрим простую aspx-страницу регистрации. Пользователю необходимо ввести свой адрес электронной почты в качестве Login, ввести и повторить пароль входа. Опционально пользователь может указать свой возраст, который должен быть целым числом в пределах от 10 до 80. При нажатии на кнопку Save происходит проверка страницы (автоматически). Если проверка прошла успешна, выполняется код «сохранения» информации.

Исходный код aspx-страницы приведен ниже:

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

 

<script runat="server">

void Button1_Click(object sender, EventArgs e) {

if (IsValid)

Label2.Text = "Info saved successfully";

}

</script>

 

<html>

<body>

<form runat="server" id="Form1">

<asp:Label ID="Lbl1" Text="Registration" runat="server"/>

<br>

Email as Login

<asp:TextBox ID="TB1" runat="server" />

<asp:RequiredFieldValidator ID="RFV1" runat="server"

ErrorMessage="Email field cannot be empty"

ControlToValidate="TB1" Text="*" />

<asp:RegularExpressionValidator ID="REV1" runat="server"

ErrorMessage="This is not a valid email"

ControlToValidate="TB1"

ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"

Text="*" />

<br>

Password

<asp:TextBox ID="TB2" runat="server" TextMode="Password"/>

<asp:RequiredFieldValidator ID="RFV2" runat="server"

ErrorMessage="Password field cannot be empty"

ControlToValidate="TB2" Text="*" />

<asp:CompareValidator ID="CV1" runat="server" Text="*"

ErrorMessage="Passwords must be the same"

ControlToValidate="TB2" ControlToCompare="TB3" />

<br>

Repeate Password

<asp:TextBox ID="TB3" runat="server" TextMode="Password"/>

<br>

Your age (optional)

<asp:TextBox ID="TB4" runat="server" />

<asp:RangeValidator ID="RangeV1" runat="server"

ErrorMessage="Age must be in 10 to 80"

ControlToValidate="TB4" MaximumValue="80"

MinimumValue="10" Type="Integer" Text="*" />

<br>

<asp:Button ID="Button1" OnClick="Button1_Click"

runat="server" Text="Save" />

<br>

<asp:ValidationSummary ID="VS1" runat="server"

HeaderText="Some info is not correct" />

<br>

<asp:Label ID="Label2" runat="server" />

</form>

</body>

</html>

Вид страницы в браузере, когда введены некоторые неправильные значения, показан на рисунке 19.

Рис. 19. Страница с проверочными элементами управления

5.8. Списковые элементы управления

Списковые элементы управления обеспечивают различные способы представления списков и таблиц на aspx-странице. Название и назначение списковых элементов приведено в таблице 45.

Таблица 45

Списковые элементы управления

Элемент управления Описание
DropDownList Создает на странице элемент <select> с атрибутом size="1", то есть раскрывающийся список с одной видимой строкой. Этот список можно заполнить при помощи элементов управления ListItem (тег <asp:ListItem>) или посредством связывания данных
ListBox Создает элемент <select> с атрибутом size="n", чтобы построить обычное поле списка с единичным или множественным выбором и более чем одной видимой строкой. Этот список можно заполнить при помощи элементов управления ListItem или посредством связывания данных
CheckBoxList Создает HTML-элемент <table> или простой список, содержащий HTML-флажки. Список можно заполнить при помощи элементов ListItem или посредством связывания данных
RadioButtonList Создает HTML-элемент <table> или простой список, содержащий HTML-переключатели. Список можно заполнить при помощи элементов ListItem или посредством связывания данных
ListItem Это класс для представления отдельного элемента некоторых списков
Repeater Повторяет содержимое, указанное один раз, для каждого исходного элемента источника данных, связанного с элементом управления
DataList Создает HTML-элемент <table>, содержащий строки для каждого элемента источника данных, связанного с элементом управления. Настраиваются шаблоны, которые определяют содержимое и вид каждой строки
DataGrid Создает HTML-элемент <table>, используемый совместно со связыванием данных на стороне сервера и имеющий встроенные средства поддержки выборки, сортировки и редактирования строк

Элементы DropDownList, ListBox, CheckBoxList и RadioButtonList имеют общего предка – класс ListControl. Полезные свойства данного класса описываются в таблице 46.

Таблица 46

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

Имя свойства Описание
AutoPostBack Булево значение; показывает, будет ли страница автоматически отправляться на сервер при изменении пользователем выбора в списке
DataMember Имя таблицы в DataSource, которая является источником данных для значений списка при заполнении списка путем связывания данных. Свойство используется, если DataSource содержит более одной таблицы (например, если DataSource содержит DataSet)
DataSource Источник данных для значений списка при заполнении списка путем связывания данных
DataTextField Имя поля в DataSource, содержимое которого будет отображаемым текстом элементов списка
DataTextFormatString Строка форматирования для значений из DataTextField (например, {0:C} для денежных сумм)
DataValueField Имя поля в DataSource, содержимое которого будет значением элементов списка (свойство Value объекта ListItem)
Items Коллекция элементов ListItem, содержащихся в списке
SelectedIndex Индекс первого выбранного элемента в списке[43]
SelectedItem Ссылка на первый выбранный элемент ListItem
SelectedValue Значение первого выбранного элемента ListItem. Если у элемента задано свойство Value, то возвращается именно оно. Иначе возвращается значение свойства ListItem.Text

Кроме описанных свойств класс ListControl предоставляет событие OnSelectedIndexChanged(). Оно возникает на сервере, когда выбор в списке изменяется и страница пересылается на сервер.

Каждый списковый элемент добавляет к своему базовому классу некоторые специфичные свойства и методы. Они приведены в таблице 47[44].

Таблица 47

Специфичные свойства списковых элементов управления

Элемент управления или объект Свойства и методы
DropDownList  
ListBox Rows
CheckBoxList CellPadding, CellSpacing, RepeatColumns, RepeatDirection, RepeatLayout, TextAlign
RadioButtonList CellPadding, CellSpacing, RepeatColumns, RepeatDirection, RepeatLayout, TextAlign
ListItem Attributes, Selected, Text, Value, метод FromString()

Следующий пример показывает использование элемента управления CheckBoxList. Для элемента управления при помощи редактора свойств были определены значения Text и Value отдельных строк. Настроены свойства ID, CellPadding, CellSpacing, RepeatColumns, RepeatDirection. При нажатии на кнопку Send страница обрабатывается на сервере и выводится информация о выбранных пользователем значениях.

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

<script runat="server">

protected void Send_Click(object sender, EventArgs e) {

if(CBL1.SelectedIndex != -1) {

Label1.Text = "";

foreach(ListItem LI in CBL1.Items)

if(LI.Selected)

Label1.Text += LI.Text + " " + LI.Value + " ";

}

else Label1.Text = "No Item Selected";

}

</script>

<html>

<body>

<form id="form1" runat="server">

<asp:CheckBoxList ID="CBL1" runat="server" CellPadding="2"

CellSpacing="5" RepeatColumns="2"

RepeatDirection="Horizontal">

<asp:ListItem Value="1">Monday</asp:ListItem>

<asp:ListItem Value="2">Tuesday</asp:ListItem>

<asp:ListItem Value="3">Wednesday</asp:ListItem>

<asp:ListItem Value="4">Thursday</asp:ListItem>

<asp:ListItem Value="5">Friday</asp:ListItem>

<asp:ListItem Value="6">Saturday</asp:ListItem>

<asp:ListItem Value="7">Sunday</asp:ListItem>

</asp:CheckBoxList>

<asp:Button ID="Send" runat="server" Text="Send"

OnClick="Send_Click" /> <br />

<asp:Label ID="Label1" runat="server"></asp:Label>

</form>

</body>

</html>

Вид страницы в браузере после выбора нескольких элементов и нажатия кнопки Send показан на рисунке 20.

Рис. 20. Страница с элементом управления CheckBoxList

5.9. Связывание данных

Под связыванием данных (data binding) будем понимать помещение данных из некоего источника в элемент управления на странице. При разработке страницы применение связывания подразумевает два этапа:

· указание на странице или в свойстве элемента управления источника данных;

· собственно связывание, то есть перенос данных в элемент управления.

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

Различают два вида связывания данных: одиночное и итеративное. При одиночном связывании данных источник данных располагает одним значением для связывания. Для указания источника данных при одиночном связывании используется один из следующих вариантов синтаксиса:

§ <%# имя-свойства %>

§ <%# вызов-метода(. . .) %>

§ <%# выражение %>

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

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

<script runat="server">

void Page_Load(object sender, EventArgs e) {

DataBind();

}

</script>

<html>

<body>

<form id="Form1" runat="server">

<asp:TextBox ID="TB1" runat="server" />

<br>

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

<%# TB1.Text%>

</asp:Label>

<br>

<asp:Button ID="B1" runat="server" Text="Button" />

</form>

</body>

</html>

В данной странице при каждой загрузке выполняется метод DataBind(). Содержимое метки Lb1 задано через синтаксис одиночного связывания. Это означает, что при каждой загрузке страницы содержимое метки будет равно содержимому текстового поля TB1.

Итеративное связывание подразумевает связывание компонента с источником данных, содержащим некоторую коллекцию данных. Компоненты, поддерживающие итеративное связывание, имеют свойство DataSource, которое можно инициализировать любым объектом, поддерживающим интерфейс IEnumerable. Схема 21 показывает элементы управления, поддерживающие итеративное связывание, и некоторые наиболее популярные классы, пригодные для подключения к связанному элементу управления:

Рис. 21. Схема связывания данных

На рисунке 22 показана страница, в которой два списковых элемента заполнены данными на основе содержимого объекта ArrayList:

Рис. 22. Связывание с объектом ArrayList

Исходный код страницы приведен ниже:

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

<script runat="server">

void Page_Load(object sender, EventArgs e) {

if (!Page.IsPostBack) {

ArrayList vals = new ArrayList();

vals.Add("Yes");

vals.Add("No");

vals.Add("I dont know");

CBList.DataSource = vals;

LB.DataSource = vals;

DataBind();

}

}

</script>

 

<html>

<body>

<form id="Form1" runat="server">

<asp:CheckBoxList ID="CBList" runat="server" />

<br>

<asp:ListBox ID="LB" runat="server" />

</form>

</body>

</html>

Обратите внимание на следующий момент, характерный для связывания данных в aspx-страницах. Любой элемент управления, допускающий связывание, имеет локальный кэш данных, в котором хранит копию связываемых данных. Именно поэтому в методе Page_Load() выполняется проверка свойства страницы IsPostBack. Нет необходимости создавать массив и выполнять связывание при каждой загрузке; достаточно сделать это один (первый) раз.

Итеративное связывание можно выполнять, используя в качестве источника объект, реализующий IDataReader. Пример показывает, как отобразить на странице данные, прочитанные из таблицы базы данных:

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

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

 

<script runat="server">

void Page_Load(object sender, EventArgs e) {

if(!Page.IsPostBack) {

SqlConnection con = new SqlConnection();

con.ConnectionString = "Server=(local);" +

"Database=CD_Rent;Integrated Security=SSPI";

SqlCommand cmd = new SqlCommand(

"SELECT name FROM Artists", con);

// Открываем соединение и получаем ридер

con.Open();

SqlDataReader r = cmd.ExecuteReader();

CBList.DataSource = r;

CBList.DataTextField = "name";

DataBind();

con.Close();

}

}

</script>

 

<html>

<body>

<form id="Form1" runat="server">

<asp:CheckBoxList ID="CBList" runat="server" />

</form>

</body>

</html>

В состав компонентов ASP.NET входят три шаблонных элемента управления: Repeater, DataList и DataGrid. Шаблон (template) описывает отдельную строку спискового элемента, позволяя настраивать внешний вид этой строки. При выводе шаблон повторяется требуемое число раз, в зависимости от количества строк в источнике данных.

В таблице 48 приведены допустимые шаблоны и указаны поддерживающие их элементы управления.

Таблица 48

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

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

Чтобы понять принципы использования шаблонов рассмотрим следующий пример. Пусть при помощи элемента DataList планируется вывести на странице содержимое таблицы Disks из базы CD_Rent. При этом нужно вывести заголовок таблицы, разделить строки, а год выпуска альбома отобразить красным цветом. Вот код aspx-страницы, которая решает поставленную задачу:

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

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

 

<script runat="server">

void Page_Load(object sender, EventArgs e) {

if(!Page.IsPostBack) {

SqlConnection con = new SqlConnection();

con.ConnectionString = "Server=(local);" +

"Database=CD_Rent;Integrated Security=SSPI";

SqlCommand cmd = new SqlCommand(

"SELECT name FROM Artists", con);

con.Open();

SqlDataReader r = cmd.ExecuteReader();

DataList1.DataSource = r;

DataBind();

con.Close();

}

}

</script>

 

<html>

<body>

<form id="form1" runat="server">

<div>

<asp:DataList ID="DataList1" runat="server">

<HeaderTemplate>

Data from Disks

</HeaderTemplate>

<ItemTemplate>

<asp:TextBox id=_name runat="server"

Text = '<%#((IDataRecord)Container.DataItem)["title"]%>'/>

<asp:Label id=_year ForeColor="Red" runat="server"

Text='<%#((IDataRecord)Container.DataItem)["release_year"]%>'/>

</ItemTemplate>

<SeparatorTemplate><hr /></SeparatorTemplate>

</asp:DataList>

</div>

</form>

</body>

</html>

Рис. 23. Вывод данных при помощи шаблонов

Рассмотрим принципы, по которым происходит связывание данных в шаблонных элементах управления. Каждое выражение связывания данных, встретившееся в шаблоне, преобразуется в экземпляр специального класса DataBoundLiteralControl и добавляется как дочерний элемент управления в шаблонный элемент управления (в нашем примере – в элемент DataList). Кроме этого, синтаксический анализатор страницы генерирует обработчик, подключаемый к событию DataBinding класса DataBoundLiteralControl:

public void @__DataBinding__control4(

object sender, System.EventArgs e) {

TextBox dataBindingExpressionBuilderTarget;

DataListItem Container;

dataBindingExpressionBuilderTarget = (TextBox)sender;

Container =

(DataListItem)dataBindingExpressionBuilderTarget.BindingContainer;

dataBindingExpressionBuilderTarget.Text =

System.Convert.ToString(((IDataRecord)Container.DataItem)["title"],

System.Globalization.CultureInfo.CurrentCulture);

}

Событие DataBinding класса DataBoundLiteralControl генерируется один раз для каждой строки источника данных во время вызова метода DataBind(). Код, сгенерированный для обработчика события, подготавливает локальную переменную Container, присваивая ей значение свойства BindingContainer элемента управления, сгенерировавшего событие. Свойство BindingContainer возвращает ссылку на текущий шаблон ItemTemplate, который для класса DataListItem является экземпляром класса DataListItem. И, наконец, для доступа к текущей строке источника данных класс DataListItem предоставляет свойство DataItem. Поскольку элемент управления DataList связывается со считывателем SqlDataReader, источник данных предоставлет интерфейс IDataRecord, который можно использовать для доступа к текущему значению столбца title.

В предыдущем примере для извлечения информации из контейнера при связывании данных можно было использовать статический метод Eval() класса DataBinder. Метод Eval() использует механизм отражения, чтобы выяснить тип источника данных и сконструировать требуемый вызов индексатора источника. Метод Eval() допускает две перегрузки, одна из которых позволяет указать строку форматирования, применяемую при отображении данных:

<ItemTemplate>

<asp:TextBox id=_name runat="server"

Text= '<%# DataBinder.Eval(Container.DataItem, "title")%>'/>

<asp:Label id=_year ForeColor="Red" runat="server"

Text = '<%# DataBinder.Eval(Container.DataItem, "release_year")%>' />

</ItemTemplate>

В заключение параграфа рассмотрим пример отображения данных на странице с возможностью их редактирования. Пусть требуется показать содержимое таблицы Artists из базы CD_Rent, а также разрешить пользователю редактировать эту таблицу. Вначале опишем несколько вспомогательных методов. Первый метод будет использоваться для того, чтобы выполнить SQL-команду над базой CD_Rent:

void ExecuteSQLStatement(string strSQL) {

SqlConnection con = new SqlConnection(. . .);

SqlCommand cmd = new SqlCommand(strSQL, con);

// Выполняем команду

con.Open();

cmd.ExecuteNonQuery();

con.Close();

}

Следующий метод будет использоваться, чтобы получить данные из базы и связать их с компонентом DataList:

void BindDataList() {

// Создаем соединение

SqlConnection con = new SqlConnection(. . .);

// Создаем команду для получения всех данных таблицы

SqlCommand cmd = new SqlCommand("SELECT * FROM Artists", con);

// Открываем соединение и получаем ридер, выполняя команду

con.Open();

SqlDataReader r = cmd.ExecuteReader();

// Выполняем связывание (DList – идентификатор DataList)

DList.DataSource = r;

DList.DataBind();

con.Close();

}

Четыре метода будут обработчиками событий соответствующих команд DataList:

void DoItemEdit(object source, DataListCommandEventArgs e) {

// Указываем строку, которую переводим в режим

// редактирования и "пересвязываем" данные

DList.EditItemIndex = e.Item.ItemIndex;

BindDataList();

}

 

void DoItemUpdate(object source, DataListCommandEventArgs e) {

// Ищем в строке элемент управления

TextBox tb = (TextBox)e.Item.FindControl("TB");

// Формируем SQL-команду

string strSQL = "UPDATE Artists SET name='" + tb.Text +

"' WHERE id='"+DList.DataKeys[e.Item.ItemIndex]+"'";

// Выполняем команду

ExecuteSQLStatement(strSQL);

// Показываем, что строка больше не редактируется

DList.EditItemIndex = -1;

// "Пересвязываем" данные

BindDataList();

}

 

void DoItemCancel(object source, DataListCommandEventArgs e) {

// Показываем, что строка больше не редактируется

DList.EditItemIndex = -1;

// "Пересвязываем" данные

BindDataList();

}

 

void DoItemDelete(object source, DataListCommandEventArgs e) {

//Формируем и выполняем SQL-команду

string strSQL = "DELETE FROM Artists WHERE id='" +

DList.DataKeys[e.Item.ItemIndex] + "'";

ExecuteSQLStatement(strSQL);

DList.EditItemIndex = -1;

BindDataList();

}

Отдельно представим шаблоны для заголовка DataList, элемента (с кнопкой Edit), элемента в режиме редактирования (поле ввода, кнопки Update, Delete, Cancel), разделителя:

<HeaderTemplate>

<b>Information about Artists</b>

</HeaderTemplate>

 

<ItemTemplate>

<asp:Button ID="B1" CommandName="Edit" runat="server" Text="Edit" />

ID: <%# DataBinder.Eval(Container.DataItem, "id") %> &nbsp;

Name: <%# DataBinder.Eval(Container.DataItem, "name") %>

</ItemTemplate>

 

<EditItemTemplate>

ID: <%# DataBinder.Eval(Container.DataItem, "id") %> &nbsp;

<asp:Button ID="B2" CommandName="Update" runat="server"

Text="Update" />

<asp:Button ID="B3" CommandName="Delete" runat="server"

Text="Delete" />

<asp:Button ID="B4" CommandName="Cancel" runat="server"

Text="Cancel" /> <br />

Name: <asp:TextBox ID="TB" runat="server"

Text='<%# DataBinder.Eval(Container.DataItem, "name") %>'/>

</EditItemTemplate>

 

<SeparatorTemplate> <hr /> </SeparatorTemplate>

В свойствах DataList настроим внешний вид, укажем ключевое поле, и укажем обработчики команд (связь между обработчиком и соответствующей кнопкой устанавливается автоматически, если у кнопки задано правильное свойство CommandName):

<asp:DataList ID="DList" runat="server" CellSpacing="2"

OnEditCommand="DoItemEdit"

OnUpdateCommand="DoItemUpdate"

OnDeleteCommand="DoItemDelete"

OnCancelCommand="DoItemCancel" DataKeyField="ID">

Рис. 24 демонстрирует страницу в режиме редактирования второй строки.

Рис. 24. Страница в режиме редактирования

5.10. Web-приложение. Файл global.asax

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

Каждое web-приложение содержит, по крайней мере, один aspx-файл. Кроме этого, в состав приложения могут входить следующие файлы:

· Единственный файл global.asax, размещаемый в корневом каталоге приложения.

· Один или несколько файлов конфигурации web.config. Если web-приложение содержит подкаталоги, то допускается не более одного файла web.config на подкаталог.

· Один или несколько файлов, описывающих пользовательские элементы управления (расширение *.ascx).

· Один или несколько файлов классов для поддержки технологии Code-Behind.

· Поддиректорию /bin, содержащую сборки, автоматически подключаемые к приложению.

· Файлы любых других типов (*.htm, *.asp, изображения и т.д.).

ASP.NET поддерживает глобальный файл для каждого web-приложения – файл global.asax. Этот файл играет роль пункта реализации глобальных событий, объектов и переменных. Общий формат файла global.asax следующий:

<%@ директива атрибут = значение %>

 

<script runat="server">

[обработчики событий приложения]

</script>

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

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

Таблица 49

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

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

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

Таблица 50

События web-приложения

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

Некоторые события можно обработать, используя только обработчики, размещенные в файле global.asax. Ни одно из них не генерируется на уровне запроса.

Таблица 51

Особые события web-приложения

Событие Причина срабатывания
Application_Start Запуск приложения
Application_End Завершение приложения
Session_Start Начало сеанса пользователя
Session_End Завершение сеанса пользователя

Приведем пример файла global.asax, содержащего обработчики событий BeginRequest и EndRequest:

<%@ 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>

5.11. Управление состояниями в web-приложениях

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

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

Таблица 52

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

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

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

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

void Application_Start(object src, EventArgs e) {

DataSet ds = new DataSet();

// Заполняем набор данных (не показано)

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

Application["FooDataSet"] = ds;

}

 

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

void Page_Load(object src, EventArgs e) {

DataSet ds = (DataSet)(Application["FooDataSet"]);

MyDataGrid.DataSource = ds;

}

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

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

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

Таблица 53

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

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

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

В качестве примера использования состояний сеансов рассмотрим реализацию классического списка покупок. Web-приложение будет содержать две страницы: на первой выбираются товары, на второй показывается список выбранных товаров и их цена. Для описания информации об отдельном товаре используем вспомогательный класс Item:

public class Item {

public string name;

public int cost;

public Item(string name, int cost) {

this.name = name;

this.cost = cost;

}

}

Код первой (default.aspx) и второй (default2.aspx) страниц представлен ниже:

<!-- Файл: default.aspx -->

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

<script runat="server">

void Button1_Click(object sender, EventArgs e) {

ArrayList cart = (ArrayList)Session["cart"];

if(CB1.Checked) cart.Add(new Item("Pencil", 10));

if(CB2.Checked) cart.Add(new Item("Notebook", 15));

Response.Redirect("default2.aspx");

}

</script>

 

<html>

<body>

<form id="form1" runat="server">

<div>

Чудо-товары:<br />

Карандаш - 10 у.е.

<asp:CheckBox ID="CB1" runat="server" Text="Заказ!" />

<br />

Блокнот &nbsp;&nbsp; - 15 у.е.

<asp:CheckBox ID="CB2" runat="server" Text="Заказ!" />

<br />

<asp:Button ID="Button1" runat="server" Text="Оплатить!"

OnClick="Button1_Click" />

</div>

</form>

</body>

</html>

 

<!-- Файл: default2.aspx -->

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

<script runat="server">

void Page_Load(object sender, EventArgs e) {

ArrayList cart = (ArrayList)Session["cart"];

int total = 0;

foreach (Item item in cart) {

total += item.cost;

Response.Output.Write("<p>Товар: {0}, Цена: ${1}</p>",

item.name, item.cost);

}

Response.Write("<hr/>");

Response.Output.Write("<p>Стоимость: {0}</p>", total);

}

</script>

 

<html>

<body>

<form id="form1" runat="server">

<div>

<a href="Default.aspx">Продолжить выбор!</a>

</div>

</form>

</body>

</html>

Для выполнения инициализации данных в состоянии сеанса используется событие Session_Start объекта Application. Далее представлен файл global.asax нашего web-приложения:

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

<script runat="server">

void Session_Start(object sender, EventArgs e) {

Session["cart"] = new ArrayList();

}

</script>

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

<configuration>

<system.web>

<sessionState cookieless="true" />

</system.web>

</configuration>

Сделаем небольшое отступление и рассмотрим подробнее возможные атрибуты конфигурационного элемента sessionState.

Таблица 54

Атрибуты конфигурационного элемента sessionState

Атрибут Значение Описание
cookieless True, False Если True, то идентификатор сеанса передается путем коррекции URL, если False – то с помощью cookie
mode Off, InProc, SQLServer, StateServer Место хранения состояния сеанса (если mode не равно Off)
stateConnectionString Пример: '192.168.1.100:42424' При mode=StateServer – имя сервера и порт
sqlConnectionString Пример: 'server=192.168.1.100; uid=sa;pwd=' При mode=SQLServer – строка соединения с базой данных. Предполагается, что это база tempdb
timeout Пример: 40 Время жизни состояния сеанса в минутах (по умолчанию – 20 минут)

Платформа ASP.NET предоставляет возможность хранить сессии вне рабочего процесса. Если атрибут mode элемента sessionState файла web.config установлен в StateServer или в SqlServer, то ASP.NET хранит сессии в другом процессе (выполняется как служба) или в базе данных SQL Server. Если используется сохранение сессии вне рабочего процесса, то любой тип, хранящийся в сессии, должен быть сериализуемым.

Пусть атрибут mode установлен в StateServer. В этом случае на компьютере, который будет ответственным за хранение сессий (это не обязательно должен быть компьютер, на котором выполняется рабочий процесс ASP.NET) должна быть запущена служба ASP.NET state service. Именно в адресном пространстве этой службы будут храниться данные. По умолчанию служба прослушивает порт 42424, но этот номер можно изменить при помощи ключа HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\Port.

Еще один способ хранения состояний сеансов вне процесса – их размещение в базе данных SQL Server. Прежде чем задать этот режим, нужно выполнить сценарий InstallSqlState.sql[45]. Главная задача сценария – создать таблицу в базе tempdb, способную хранить сессии отдельных клиентов и индексированную идентификаторами сессий. В конфигурационном файле указывается сервер БД, пользователь и пароль.

По умолчанию ASP.NET предполагает, что каждая страница просит загрузить состояния сеанса во время инициализации страницы и сохранить состояние после вывода страницы. Это означает два обращения к серверу состояний или базе данных при хранении сессий вне рабочего процесса. Атрибут EnableSessionState директивы страницы Page позволяет более тонко настроить работу с сессиями. Если атрибут установлен в значение ReadOnly, то сессии загружаются, но не сохраняются после вывода страницы. Если же установить атрибут в false, то работа с сессиями на странице отключается.

Для управления данными cookie платформа ASP.NET предоставляет класс HttpCookie. Классы HttpResponse и HttpRequest содержат свойство-коллекцию Cookies типа HttpCookieCollection для работы с установленными cookie клиента. Определение класса HttpCookie представлено ниже:

public sealed class HttpCookie {

// Открытые конструкторы

public HttpCookie(string name);

public HttpCookie(string name, string value);

 

// Открытые свойства

public string Domain { set; get; }

public DateTime Expires { set; get; }

public bool HasKeys { get; }

public string Name { set; get; }

public string Path { set; get; }

public bool Secure { set; get; }

public string this[string key] { set; get; }

public string Value { set; get; }

public NameValueCollection Values { get; }

}

Каждый файл cookie может хранить много пар имя/значение, доступных посредством коллекции Values класса HttpCookie или посредством индексатора по умолчанию этого класса. Важно отметить следующее:

1.Объем информации, хранящейся в cookie, ограничен 4 Кбайтами.

2.И ключ, и значение сохраняются в cookie в виде строк.

3.Некоторые браузеры могут отключить поддержку cookie.

Чтобы вынудить клиента установить cookie, добавьте новый экземпляр класса HttpCookie в коллекцию cookie перед выводом страницы. При этом можно проверить, поддерживает ли клиентский браузер cookie, при помощи булевого свойства Request.Browser.Cookies. Для доступа к файлу cookie, переданном клиентом в запросе, нужно обратиться к коллекции Cookies, являющейся свойством объекта запроса.

В следующем листинге представлена страница, устанавливающая и использующая cookie с именем name:

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

 

<script runat="server">

void Page_Load(object sender, EventArgs e) {

if(Request.Cookies["name"] != null)

Label1.Text = "Your name is " + Request.Cookies["name"].Value;

}

 

// Нажатие на кнопку устанавливает cookie

void Button1_Click(object sender, EventArgs e) {

HttpCookie ac = new HttpCookie("name");

// Устанавливаем ненулевое время жизни (3 дня),

// чтобы информация сохранилась после закрытия браузера

ac.Expires = DateTime.Now.AddDays(3);

ac.Value = nameTextBox.Text;

Response.Cookies.Add(ac);

}

</script>

 

<html>

<body>

<form id="form1" runat="server">

<asp:Label ID="Label1" runat="server" /> <br /> <br />

<asp:TextBox ID="nameTextBox" runat="server" /> <br />

<asp:Button ID="Button1" runat="server" Text="Set cookie"

OnClick="Button1_Click" />

</form>

</body>

</html>

Кроме состояний сеансов и cookie, ASP.NET предоставляет средства хранения состояний отдельных клиентов с помощью механизма, называемого состоянием отображения. Состояние отображения храниться в скрытом поле __VIEWSTATE каждой страницы ASP.NET. При каждом запросе страницы самой себя содержимое поля __VIEWSTATE передается в составе запроса. Состояния отображения предназначены главным образом для сохранения состояний элементов управления в последовательности ответных запросов, однако их можно использовать и как механизм сохранения состояний отдельных клиентов между ответными запросами к этой же странице.

Состояние отображения доступно из любого элемента управления как свойство ViewState. Оно представляется как объект типа StateBag, поддерживающий хранение любых сериализуемых типов.

5.12. Кэширование

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

Кэширование вывода управляется директивой OutputCache страницы. Атрибуты данной директивы и их описание представлены в таблице 55.

Таблица 55

Атрибуты директивы OutputCache

Атрибут Значение Описание
Duration Число Время существования страницы или пользовательского элемента управления в кэше (в секундах)
Location Any Client Downstream Server ServerAndClient None Атрибут управляет передаваемыми клиенту заголовком и метадескрипторами, указывающими, где может быть кэширована страница. При значении Client страница кэшируется только в браузере, при значении Server – только на Web-сервере, при значении Downstream – на прокси-сервере и у клиента. При ServerAndClient кэш располагается на клиенте или на Web-сервере, прокси-сервера для кэша не используются. None отключает кэширование страницы
VaryByCustom browser Спец. строка Страница кэшируется по-разному в зависимости от имени и версии браузера клиента или от заданной строки, обрабатываемой переопределенным методом GetBaryByCustomString()
VaryByHeader * Имена заголовков Список строк, разделенных точкой с запятой и представляющих передаваемые клиентам заголовки
VaryByParam none * Имена параметров Список строк, разделенных точкой с запятой и представляющих значения строки запроса GET или переменные запроса POST
VaryByControl Список полностью квалифицированных имен свойств Список строк, представляющих свойства пользовательского элемента управления, используемые для настройки кэшей вывода (атрибут применяется только с пользовательскими элементами управления)

В директиве OutputCache атрибуты Duration и VaryByParam является обязательным. Атрибут VaryByParam="none" означает, что для каждого типа запроса (GET, HEAD или POST) будет кэшировано по одной копии страницы.

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

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

<%@ OutputCache Duration="3600" VaryByParam="none"%>

<script runat="server">

void Page_Load(object sender, EventArgs e) {

msg.Text = DateTime.Now.ToString();

}

</script>

 

<html>

<body>

<h3>Вывод кэшированной страницы</h3>

<p>В последний раз страница сгенерирована:

<asp:Label ID="msg" runat="server" /></p>

</body>

</html>

Запрос страницы может выполняться несколькими способами: при помощи глагола GET без параметров, при помощи глагола HEAD, при помощи GET с параметрами, или с использованием POST с телом, содержащим пары имя/значение. Кэшировать страницу, к которой обращаются с разными строками GET или переменными POST сложно, так как требуется кэшировать разные версии страницы для различных комбинаций параметров. Токую настройку кэширования в этом случае можно провести при помощи атрибута VaryByParam директивы OutputCache. Если задать VaryByParam="none", то кэш сохраняет одну версию страницы для каждого типа запроса. Получив запрос GET со строкой переменных, кэш вывода игнорирует строку и возвращает экземпляр страницы, кэшированный для GET. Если указать VaryByParam="*", будет кэширована отдельная версия страницы для каждой уникальной строки GET и каждого уникального набора параметров POST. Такой способ кэширования может оказаться крайне неэффективным. В атрибуте VaryByParam можно указать имя (или список имен) переменных запроса. В этом случае уникальные копии страницы будут сохраняться в кэше вывода, если в запросе значения перечисленных переменных разные.

Атрибуты VaryByHeader и VaryByCustom управляют сохранением версий страницы в кэше на основе значений заголовков HTTP-запроса и версий браузера соответственно. Например, если страница выводится по-разному в зависимости от заголовка Accept-Language, то нужно обеспечить кэширование отдельных копий для каждого языка, предпочитаемого клиентом:

<%@ OutputCache Duration="360" VaryByParam="none"

VaryByHeader="Accept-Language" %>

Рассмотрим вопросы, связанные с кэшированием данных. Для доступа к кэшу разработчик может использовать свойство Cache класса Page. Область видимости кэша данных ограничена приложением. Его возможности во многом идентичны возможностям хранилища HttpApplicationState при двух важных отличиях. Во-первых, по умолчанию не гарантируется, что информация, размещенная в кэше данных, сохраняется в нем. Разработчик всегда должен быть готов к тому, что в кэше нет нужной информации. Во-вторых, кэш не предназначен для хранения обновляемых пользователями данных. Кэш позволяет читать данные многим потокам и записывать одному потоку, но не существует методов, подобных Lock() и UnLock(), позволяющих разработчику управлять блокировками. Следовательно, кэш данных предназначен для хранения данных в режиме «только для чтения» в целях облегчения доступа к ним.

Простейший вариант использования свойства Cache заключается в работе с ним как с коллекцией, аналогично работе со свойствами страницы Session и Application. Однако при каждом добавлении некоторого объекта в кэш одновременно в кэш заносится экземпляр класса CacheEntry, описывающий кэшируемый объект. Основные свойства класса CacheEntry представлены в таблице 56. Обратите внимание на возможность связывания кэшируемых объектов с другими элементами кэша или файлами:

Таблица 56

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

Свойство Тип Описание
Key Строка Уникальный ключ для идентификации раздела кэша
Dependency CacheDependency Зависимость данного раздела от файла, каталога или другого раздела (при их изменении раздел кэша будет удален)
Expires DateTime Фиксированные дата и время, при достижении которых раздел будет удален
SlidingExpiration TimeSpan Интервал времени между последним обращением к разделу и его удалением
Priority CacheItemPriority Важность сохранения данного раздела по сравнению с другими разделами (используется при чистке кэша)
OnRemoveCallback CacheItem- RemovedCallback Делегат, который может запускаться при удалении раздела

Если для помещения объекта в кэш используется индексатор по умолчанию, то свойства соответствующего объекта CacheEntry принимают следующие значения: время жизни устанавливается бесконечным, скользящее время жизни равно нулю, значение Priority равно Normal, а OnRemoveCallback – null. При этом объект в кэше может оставаться как угодно долго, пока его не удалит процедура очистки (обычно вследствие нехватки памяти) или пока он не будет удален явно.

Если возникла необходимость управлять свойствами CacheEntry, то можно воспользоваться одной из перегруженных версий методов Insert() или Add(). В следующем примере показан файл global.asax, добавляющий содержимое файла в кэш при запуске приложения. Раздел кэша становится неправильным, когда изменяется содержимое файла, использованного для заполнения раздела, поэтому в кэш добавлено свойство CacheDependency. В сценарии также зарегистрирован метод обратного вызова, позволяющий получить извещение об удалении данных из кэша. Кроме этого, для добавленного раздела отключен срок действия, отключен режим скользящего времени жизни и задан приоритет по умолчанию:

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

<script runat="server">

public void OnRemovePi(string key, object val,

CacheItemRemovedReason r) {

// Некоторые действия, выполняемые при удалении элемента.

// Например, помещение элемента снова в кэш.

}

 

void Application_Start(object sender, EventArgs e) {

System.IO.StreamReader sr =

new System.IO.StreamReader(Server.MapPath("pi.txt"));

string pi = sr.ReadToEnd();

CacheDependency piDep =

new CacheDependency(Server.MapPath("pi.txt"));

Context.Cache.Add("pi", pi, piDep,

Cache.NoAbsoluteExpiration,

Cache.NoSlidingExpiration,

CacheItemPriority.Default,

new CacheItemRemovedCallback(OnRemovePi));

}

</script>

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

<!-- Файл: default.aspx -->

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

<script runat="server">

protected void Page_Load(object src, EventArgs e) {

if (Cache["pi"] == null) pi.Text = "Undefined!";

else pi.Text = (string)Cache["pi"];

}

</script>

 

<html>

<body>

<form runat="server">

<h1> Страница pi </h1>

<asp:TextBox ID="pi" runat="server" />

</form>

</body>

</html>

5.13. Безопасность в web-приложениях

Аутентификацией (authentication) называется процесс идентификации пользователей приложений. Авторизация (authorization) – это процесс предоставления доступа пользователям на основе их идентификационных данных. Аутентификация наряду с авторизацией представляют собой средства защиты web-приложений от несанкционированного доступа.

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

Для отдельного виртуального каталога можно задать особый режим аутентификации, использовав окно свойств IIS (Безопасность каталога).

Рис. 25. Свойства безопасности виртуального каталога

Заметим, что большинство web-приложений не использует аутентификацию на основе IIS, так как для этого нужно, чтобы клиент выполнил некие дополнительные действия, например, получил сертификат или учетную запись на сервере. Поэтому в данном параграфе подобный способ обеспечения безопасности подробно рассматриваться не будет.

Рассмотрим средства аутентификации ASP.NET[46]. Отметим, что если клиент аутентифицируется, то информация о нем доступна посредством свойства User класса Page или класса HttpContext. Свойство User указывает на реализацию интерфейса IPrincipal. Этот интерфейс содержит одно свойство и один метод. Свойство Identity является указателем на реализацию интерфейса IIdentity, а метод IsInRole() проверяет членство клиента в указанной группе. Ниже приведено описание интерфейса IIdentity:

public interface IIdentity {

string AuthenticationType { get; }

bool IsAuthenticated { get; }

string Name { get; }

}

Свойство IsAuthenticated используется для различения аутентифицируемых и анонимных клиентов. Свойство Name можно применить для выяснения идентичности клиента. Если клиент аутентифицируется, то свойство AuthenticationType позволит выяснить тип аутентификации. В следующем листинге представлена страница, которая выводит аутентификационную информацию клиента:

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

<script runat="server">

void Page_Load(object src, EventArgs e)

{

AuthUser.Text = User.Identity.Name;

AuthType.Text = User.Identity.AuthenticationType;

}

</script>

 

<html>

<body>

<h1>Страница тестирования безопасности</h1>

<h3>пользователь:</h3>

<asp:Label ID="AuthUser" runat="server" />

<h3>тип аутентификации:</h3>

<asp:Label ID="AuthType" runat="server" />

</body>

</html>

Задать требования аутентификации клиентов web-приложения можно путем добавления соответствующих элементов в конфигурационный файл приложения web.config. Тип аутентификации клиентов задается с помощью элемента authentication, атрибут mode которого может принимать одно из четырех значений: Windows (по умолчанию), Forms, Passport и None. Если задан режим Windows, то все задачи аутентификации перекладываются на web-сервер.

Сконфигурировав тип аутентификации на использование ASP.NET, нужно продумать цели аутентификации. Аутентификация выполняется для ограничения доступа клиентов ко всему приложению или к его частям с помощью элемента authorization. В этот элемент добавляются подэлементы allow и deny, задающие предоставление или отказ в доступе отдельным пользователям и ролям. Метасимвол * используется для представления всех пользователей, а ? – для представления анонимных пользователей. Следующий пример конфигурационного файла отказывает анонимным пользователям в праве доступа к сайту:

<configuration>

<system.web>

<authorization>

<deny users="?" />

</authorization>

</system.web>

</configuration>

Элементы allow и deny поддерживают три атрибута: users, roles и verbs. Значениями этих атрибутов могут быть разделенные запятыми списки пользователей, ролей и команд. Это позволяет сконфигурировать сложные требования безопасности. Например, в следующем фрагменте пользователям MyDomain\alice и MyDomain\bob предоставлен полный доступ к приложению, все «именованные» пользователи имеют право передавать запросы GET, анонимным пользователям доступ к приложению запрещен:

<authorization>

<allow users="MyDomain\alice, MyDomain\bob"/>

<allow users="*" verbs="GET"/>

<deny users="?"/>

</authorization>

Вернемся к рассмотрению различных типов аутентификации и остановимся на режиме аутентификации Forms. Принцип действия аутентификации в этом режиме следующий:

1.Когда пользователь первый раз запрашивает ресурс, требующий аутентификации, сервер перенаправляет запрос в выделенную страницу регистрации.

2.Регистрационная страница принимает данные пользователя (как правило, имя и пароль), а затем приложение аутентифицирует пользователя (предположительно с помощью базы данных).

3.Если пользователь успешно зарегистрировался, сервер предоставляет ему аутентификационный файл cookie в зашифрованном виде, который действителен на протяжении сеанса (но может быть сохранен на клиентском компьютере для использования в последующих сеансах).

4.Пользователь перенаправляется к интересующему его ресурсу, однако теперь он предоставляет в запросе идентификационный cookie и получает доступ.

Если в файле web.config задать аутентификацию Forms, то дополнительные настройки режима можно выполнить во вложенном элементе forms, атрибуты которого содержит таблица 57.

Таблица 57

Атрибуты элемента forms

Атрибут Значения Значение по умолчанию Описание
name Строка .ASPXAUTH Имя файла cookie
loginUrl Адрес URL login.aspx Адрес URL страницы регистрации
protection All, None, Encryption, Validation All Режим защиты файла cookie
timeout Минуты Скользящее время жизни файла cookie (переустанавливается при каждом запросе)
path Маршрут / Маршрут файла cookie

Пример файла web.config, конфигурирующего аутентификацию в режиме Forms, показан в следующем листинге:

<configuration>

<system.web>

<authorization>

<deny users="?"/>

</authorization>

 

<authentication mode="Forms">

<forms loginUrl="login.aspx"/>

</authentication>

</system.web>

</configuration>

Теперь, чтобы аутентификация на основе cookie заработала, нужно реализовать страницу регистрации. Для реализации страницы регистрации платформа ASP.NET предоставляет класс FormsAuthentication. Этот класс состоит главным образом из статических методов, управляющих аутентификационными файлами cookie. Например, чтобы предоставить такой файл клиенту, нужно вызвать метод SetAuthCookie(). Метод RedirectFromLoginPage() предоставляет cookie клиенту и перенаправляет клиента в запрошенную им страницу.

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

Рис. 26. Страница регистрации

<!-- Файл login.aspx -->

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

<script runat="server">

void OnClick_Login(object src, EventArgs e) {

if ((m_usrname.Text == "Alex") && (m_pass.Text == "pass"))

FormsAuthentication.RedirectFromLoginPage(m_usrname.Text,

m_save_pass.Checked);

else msg.Text = "Неверно. Попытайтесь еще раз";

}

</script>

 

<html>

<body>

<form runat="server">

<h2>Страница регистрации</h2>

Имя пользователя:

<asp:TextBox ID="m_usrname" runat="server" /><br />

Пароль:

<asp:TextBox ID="m_pass" TextMode="Password"

runat="server"/> <br/>

Запомнить пароль?

<asp:CheckBox ID="m_save_pass" runat="server" /><br />

<asp:Button Text="Регистрация" OnClick="OnClick_Login"

runat="server" /><br />

<asp:Label ID="msg" runat="server" />

</form>

</body>

</html>

Рассмотрим еще один пример. Достаточно часто клиенту предоставляется возможность идентифицировать себя, если он этого хочет, или возможность анонимного доступа в противном случае. В этом случае имеет смысл интегрировать форму регистрации в страницу. При регистрации вызывается метод FormsAuthentication.SetAuthCookie() и выполняется перенаправление на эту же страницу. При загрузке страницы проверяется, идентифицирован ли пользователь, и если да, то выводиться специфичная для пользователя информация. Текст страницы default.aspx представлен ниже:

<!-- Файл default.aspx -->

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

<script runat="server">

void Page_Load(object src, EventArgs e) {

if (User.Identity.Name == "Alex") msg.Text = "Hello Alex";

else msg.Text = "General Info";

}

void OnClick_Login(object src, EventArgs e) {

if((m_usrname.Text == "Alex") && (m_pass.Text == "pass"))

FormsAuthentication.SetAuthCookie(m_usrname.Text,false);

Response.Redirect("default.aspx");

}

</script>

 

<html>

<body>

<form id="Form1" runat="server">

<h2>Регистрация</h2>

Имя :

<asp:TextBox ID="m_usrname" runat="server" /><br />

Пароль:

<asp:TextBox ID="m_pass" TextMode="Password"

runat="server"/> <br/>

<asp:Button ID="Button1" Text="Войти"

OnClick="OnClick_Login" runat="server"/><br />

<asp:Label ID="msg" runat="server" />

</form>

</body>

</html>

Файл web.config:

<configuration>

<system.web>

<authentication mode="Forms" />

</system.web>

</configuration>




<== предыдущая лекция | следующая лекция ==>
Reference | DEFINE Рi 3,14.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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