Элементы страниц ASP.NET

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

Блок <script runat="server"> </script> называется блоком объявления кода. Тег <script> похож на тот, которым вводятся скрипты JavaScript, но с большим отличием — скрипт выполняется на сервере. Поэтому необходимо обязательно задавать атрибут runat="server". Атрибут language может принимать значения С#, VB, J#. В страницах с отделенным кодом можно писать и на C++. По умолчанию принимается значение языка Visual Basic, поэтому не надо забывать указывать язык при использовании С#. Необходимости в этом нет, если язык определен в директиве Page. Можно писать на разных языках в одном приложении, но нельзя смешивать разные языки на одной странице.

Внутри блока можно объявлять переменные, константы и функции. Их можно называть переменными страницы. Здесь можно переопределить виртуальные методы класса страницы. В блоке также можно объявлять классы, но они будут внутренними по отношению к классу страницы.

Блоки отображения. Это код, внедренный с помощью ограничителей <% и %>, он обрабатывается как часть страницы. В теле блока <%...%> допустимо объявлять переменные (тогда они будут локальными для того метода, в котором данный блок будет реализован), но нельзя объявлять методы или типы.

Такой стиль программирования был характерен для asp, он и сохранен для обеспечения преемственности. Чаще всего в блоках отображения формируется и выводится HTML-код с помощью метода Response.Write (<%Response.Write (someExpr) %>). Можно использовать сокращенную запись <%= someExpr %>. Например:

<html>

<head>

</head>

<body>

1 Строка HTML<br />

<% Response.Write ("1 Строка ASP.NET <br />"); %>

2 Строка HTML<br />

<% Response.Write ("2 Строка ASP.NET<br />"); %>

3 Строка HTML<br />

<% ="3 Строка ASP.NET<br />"; %>

</body>

</html>

Элементы формы. Страница может содержать только один элемент form с атрибутом runat, который имеет значение server. Этот атрибут позволяет ссылаться на форму и на элементы управления страницы программным способом в коде сервера.

Серверные элементы управления, которые могут выполнять обратную передачу (от клиента серверу), должны находиться внутри элемента form.

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

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

Страницы ASP.NET могут содержать обычную HTML-разметку, которая будет отправлена клиенту без изменений. Кроме того они содержат т.н. серверные управляющие элементы – разметку, которая будет обработана перед отправкой, и, следовательно может быть подвергнута изменению. Эти элементы представляют собой либо обычные HTML-теги с атрибутом runat="server" (HTML-элементы управления), либо специальные теги (Web-элементы управления), которые после обработки будут заменены на обычную HTML-разметку.

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

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

При задании Web-элементов управления используется специальный синтаксис, который ASP.NET распознает при запуске страницы. Например, элементы <asp:TextBox… />, <asp:Button …/>, <asp:Label…/>. Каждому тегу элемента управления соответствует свой член класса страницы, что позволяет задавать их свойства программно в обработчиках событий.

Например, вместо того чтобы выводить текст через Response.Write <% Response.Write ("<span> Welcome </span>"); %>, можно установить текст элемента управления, задав соответствующее свойство. Например, Label1.Text ="Welcome"; пользователь увидит одно и то же.

Серверные элементы управления могут создаваться и динамически в коде обработчиков событий.

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

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

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

Серверные элементы управления содержат ограниченный набор событий, которые обычно являются событиями нажатия. Некоторые серверные элементы управления поддерживают события изменений. Например, серверный элемент управления CheckBox создает событие CheckedChanged, если пользователь снимает или отмечает флажок. Некоторые серверные элементы управления поддерживают более абстрактные события. Например, серверный элемент управления Calendar создает событие SelectionChanged, более абстрактную версию события нажатия. События, которые происходят часто (и могут быть вызваны без уведомления об этом пользователя), например, событие onmouseover, для серверных элементов управления не поддерживаются. Для связывания события с обработчиком на сервере и клиенте у управляющих элементов предусмотрены разные атрибуты. У Web-элементов onclick – обработка на сервере, onclientclick - на клиенте, у HTML-элементов onclick – на клиенте, onserverclick – на сервере (поддерживается не для всех элементов).

Кроме того, есть отличия в отправке данных из формы на сервер для управляющих элементов HTML и Web. Обычно данные из формы в браузере отправляются при нажатии кнопки type="submit", именно этот элемент создается при обработке Web-элемента управления
<asp:Button... runat="server"... onclick="..." />. Однако, для Web-элементов может быть задано свойство AutoPostBack="true", что дает возможность инициации немедленной отправки данных при наступлении события, связанного с этим элементом.

Для элементов управления, объявленных на странице, событие можно привязать к методу, задав атрибут (свойство) в разметке элемента управления (например, OnClick="Button1_Click"). При динамическом создании элементов управления (в коде) необходимо использовать явную привязку событий.

Для иллюстрации различий в использовании Web и HTML элементов управления рассмотрим следующий пример.

Пример 4.3.

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

Сначала создадим страницу, используя серверные Web-элементы управления. Код страницы будет таким:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>WEB-элементы</title>

</head>

<body>

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

<asp:Image ID="Image1" runat="server" style="visibility:visible"

ImageUrl="~/Tiguan.jpg" Width="181px" /><br />

<asp:CheckBox ID="CheckBox1" Checked="true" AutoPostBack="true"

runat="server" oncheckedchanged="Change_Img " />

</form>

</body>

</html>

Вид страницы в окне:

На форме размещено два серверных управляющих элемента: изображение (<asp:Image…>) и переключатель (<asp:CheckBox…>). Переключатель содержит атрибут для привязки обработчика события смены состояния переключателя (oncheckedchanged) и атрибут AutoPostBack="true" (обеспечивает немедленную передачу данных на сервер, в противном случае событие не будет обработано). Сам обработчик расположен в отдельном файле:

using System;

public partial class _Default: System.Web.UI.Page

{

protected void Change_Img(object sender, EventArgs e)

{

if (CheckBox1.Checked == true) { Image1.Style.Value = "visibility:visible"; }

else { Image1.Style.Value = "visibility:hidden"; }

}

}

Действия обработчика состоят в проверке состояния переключателя и изменения свойства видимости, заданного в атрибуте стиля тега asp:Image.

При создании этой страницы с использованием HTML-элементов управления(<img runat=server…>и <input type=check runat=server…>) реализовать обработку на сервере по щелчку на переключателе не удастся, поскольку для тега <input type=check…> не поддерживается атрибут onserverclick. Поэтому на страницу придется добавить кнопку и с ней связать обработчик:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head>

<title>HTTP-элементы</title>

</head>

<body>

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

<input id="Check1" type="checkbox" runat="server" checked="checked"/> <br />

<input type="button" id="Button1" value="Enter" onserverclick="Change_Img" runat="server"/>

<img ID="Image1" alt="Тигуан" runat="server" style="visibility:visible" width="181" src="Tiguan.jpg" /><br />

</form>

</body>

</html>

Сам обработчик не изменится. Для скрытия изображения необходимо снять отметку с переключателя и нажать кнопку.

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

Такими событиями являются PreInit (получение запроса), Init (инициализация страницы), Load (установка свойств элементов и выполнение обработчиков), Render (генерация HTML-кода и вывод его в выходной поток), Unload (выгрузка страницы из памяти сервера). По умолчанию можно выполнить привязку событий страницы к методам, используя правило именования Page_имя события. Например, для создания обработчика событий Load можно создать метод с именем Page_Load. Во время компиляции ASP.NET ищет методы на основе этого правила именования и автоматически выполняет привязку события и метода.

Например, на этапе установки свойств элементов можно проверить является ли запрос первым обращением к странице или это обращение для вызова обработчика события. В зависимости от результата проверки можно по-разному инициализировать переменные. Для проверки используется свойство Page.IsPostBack (устанавливается false при первом обращении, true – при обращении за обработчиком).

protected void Page_Load(object sender, EventArgs e)

{

if (Page.IsPostBack) sb="это ответ на событие";

else sb="это первый запрос страницы";

Message1.Text = sb;

}

События приложения и сеанса. В дополнение к событиям страницы и элементов управлений ASP.NET позволяет работать с событиями, которые могут быть вызваны при запуске приложения или завершении работы или же при запуске или завершении сеанса отдельного пользователя.

События приложения вызываются для всех запросов к приложению. Событие Application_Start вызывается один раз при первом обращении к приложению, событие BeginRequest вызывается при запросе в приложении Web-страницы ASP.NET. Это событие позволяет инициализировать ресурсы, которые будут использоваться для каждого запроса к приложению. Событие EndRequest объекта HttpApplication (Application_EndRequest) позволяет закрывать или удалять ресурсы, используемые для запроса.

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

Эти обработчики помещаются в файл global.asax. Хотя можно использовать и открытые обработчики с соответствующими именами:

<script language="C#" runat="server">

public void Session_OnStart()

{

}

public void Session_OnEnd()

{

}

</script>

Использование объектов. Объекты, создаваемые средой для каждой страницы, являются наследниками класса Page, и содержат в качестве свойств целый ряд объектов, заполненных различной информацией о странице, пользователе, запросе и т.п. В таблице 4.2 приведен их список.

Таблица 4.2

Список объектов

Свойство Описание
Application Содержит информацию о состоянии приложения
Request Содержит информацию текущего запроса HTTP
Response Осуществляет отправку ответа клиенту
Server Предоставляет вспомогательные методы для отправки Web-запросов
Session Содержитт данные, связанные с определенным пользователем
Trace Осуществляет трассировку выполнения страницы
User Представляет пользователя, от которого поступил запрос

Наиболее часто в обработчиках используются Application, Session, Request и Response.

Объект Application содержит данные в формате имя=значение, доступные для всего приложения в течение всего времени его функционирования.

Объект Session предназначен для хранения данных на время работы с сайтом пользователя (сеанс), причем у каждого пользователя они свои. Данные хранятся в формате имя=значение, и удаляются, когда пользователь покинул страницы Web-сайта (не обращается к ним в течение определенного времени).

Поскольку методика использования объектов Application и Session почти не отличается, рассмотрим пример с Application.

Пример 4.4.

Создадим счетчик посещений сайта.

Сайт будет состоять из двух страниц, начальной (default.aspx) и страницы просмотра счетчика (count.aspx).

Код в файле default.aspx:

<html>

<head>

<title>Начальная страница сайта</title>

</head>

<body>

<h1>Мы приветствуем Вас на нашем сайте</h1>

<p>Для просмотра счетчика посещений перейдите по ссылке</p>

<a href="count.aspx">просмотр счетчика</a>

</body>

</html>

Код в файле count.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="count.aspx.cs" Inherits="_Default" %>

<html>

<head>

<title>Страница со счетчиком посещений</title>

</head>

<body>

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

<h1>Мы приветствуем Вас на нашем сайте</h1>

<p>Мы рады сообщить, что наш сайт посетили <asp:Label id="Message1" runat="server"/> раз</p>

</form>

</body>

</html>

Значение счетчика сохраняется в объекте Application, инициализация и увеличение значения выполняются в обработчиках файла global.asax:

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

<script runat="server">

void Application_Start(object sender, EventArgs e)

{

Application["count"]=(int) 0;

}

void Session_Start(object sender, EventArgs e)

{

Application["count"]=(int)Application["count"]+1;

}

</script>

Обработчик для страницы в файле count.aspx.cs:

using System;

public partial class _Default: System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

Message1.Text =Convert.ToString(Application["count"]);

}

}

Объект Request содержит значения и свойства HTTP -запроса, вызвавшего загрузку страницы. Он содержит все параметры URL и другую информацию, отправляемую клиентом. В том числе, PhysicalPath (каталог приложения ASP.NET), FilePath (путь к файлу страницы), QueryString (параметры, переданные клиентом в строке запроса методом get), Url (URL-адрес текущей страницы), UserHostAddress (IP-адрес клиента), UserAgent (тип броузера). Например, для получения доступа к полученным из формы параметрам можно использовать имена элементов формы, Request.QueryString["имя_элемента"] вернет соответствующее значение.

Объект Response содержит информацию и методы формирования ответа Web-сервера на запрос клиента. В том числе, IsClientConnected (признак подключенности клиента), Write (метод для записи в поток ответа, вплоть до содержимого файла), Redirect (метод для направления пользователя на другую страницу приложения или на другой сайт). Например, перенаправление посетителя на другой сайт Response.Redirect("http://www.microsoft.com").


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: