Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции OOP c#.doc
Скачиваний:
44
Добавлен:
22.09.2019
Размер:
3.38 Mб
Скачать

5.2. Пример aspx-страницы. Структура страницы

Любая серверная страница ASP.NET представляет собой текстовый файл с расширением .aspx. Далее такие страницы будут для краткости называться aspx-страницами. Рассмотрим пример простой aspx-страницы, которую разместим в файле test.aspx:

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

<script runat="server">

string[] Data = {"Hello ", "world ", "from ", "ASP.NET"};

string getData(int i) {

return Data[i];

}

void Button1_Click(object sender, EventArgs e) {

Label1.Text = TextBox1.Text;

}

</script>

<html>

<body>

<% for(int i=0; i < 4; i++) Response.Write(getData(i)); %>

<form runat="server">

<p>

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

</p>

<p>

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

</p>

<p>

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

runat="server" Text="Send" />

</p>

</form>

</body>

</html>

Для просмотра данной страницы требуется:

1. На компьютере-сервере должен быть установлен и запущен веб-сервер. Можно использовать сервер IIS или, например, свободно распространяемый фирмой Microsoft сервер Cassini.

2. На сервере создается виртуальный каталог, в соответствующий физический каталог помещается файл test.aspx. В нашем примере будет использоваться физический каталог C:\Test и виртуальный каталог test.

3. Пользователь набирает в браузере следующий адрес:

http://localhost/test/test.aspx

Вид страницы в браузере показан на рисунке 13.

Рис. 13. Страница, отображаемая в браузере

HTML-код отображаемой страницы выглядит следующим образом:

<html>

<body>

Hello world from ASP.NET

<form name="ctl00" method="post" action="test.aspx"

id="ctl00">

<div>

<input type="hidden" name="__VIEWSTATE"

id="__VIEWSTATE"

value="/wEPDwULLTEz4aswGyDFp8uH0tpf" />

</div>

<p>

<span id="Label1">No Name</span>

</p>

<p>

<input name="TextBox1" type="text" id="TextBox1"/>

</p>

<p>

<input type="submit" name="Button1" value="Send"

id="Button1" />

</p>

<div>

<input type="hidden" name="__EVENTVALIDATION"

id="__EVENTVALIDATION"

value="/wE54rGBu07o0F5j+sOYUEyYF3Dz5/uj" />

</div>

</form>

</body>

</html>

Обратите внимание на скрытое поле формы __VIEWSTATE (поддержка отображаемого состояния) и на поле __EVENTVALIDATION (указатель на источник события).

Рассмотрим подробнее структуру страницы. В любой странице можно выделить несколько логических секций:

1. HTML-код. HTML-код не обрабатывается процессом ASP.NET специальным образом, а сразу пересылается клиенту. Выводом HTML-кода занимается специальный внутренний метод __Render__control() того класса, который соответствует странице. В нашем случае фрагмент страницы

<html>

<body>

будет выведен в методе __Render__control() так:

private void __Render__control(. . .) {

Response.Write("<html>\r\n<body>\r\n");

. . .

}

2. Директивы страницы. Директивы используются для установки отдельных параметров страницы, таких как язык программирования для кода страницы или подключение пространства имен. Директива начинается с символа @, за которым следует имя директивы и набор пар «атрибут = значение». Например, следующая директива указывает на использование C# в качестве языка программирования на странице:

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

Директивы могут размещаться в любом месте страницы, но вне HTML-элементов. Как правило, директивы помещают в начале страницы.

3. Блоки серверного кода. Это блоки, обрамленные тэгом <script> с обязательным атрибутом runat="server":

<script runat="server">

string[] Data = {"Hello ", "world ", "from ", "ASP.NET"};

string getData(int i) {

return Data[i];

}

void Button1_Click(object sender, EventArgs e) {

Label1.Text = TextBox1.Text;

}

</script>

Блоки серверного кода транслируются в члены класса, соответствующего странице. В приведенном примере класс будет содержать поле-массив Data, методы getData() и Button1_Click().

Отметим, что наличие блоков серверного кода на странице противоречит концепции Code Behinde. Согласно данной концепции код, связанный со страницей, должен быть помещен в отдельный класс, от которого наследуется класс страницы.

4. Блоки рендерного кода. Блоки рендерного кода используются для генерации потока вывода. В нашем примере блоком рендерного кода является фрагмент

<% for (int i = 0; i < 4; i++) Response.Write(getData(i)); %>

При обработке на сервере блоки рендерного кода помещаются непосредственно в метод, «заведующий» выводом HTML-кода. Таким образом, метод __Render__control() будет содержать следующий код:

private void __Render__control(. . .) {

Response.Write("<html>\r\n<body>\r\n");

for (int i = 0; i < 4; i++) Response.Write(getData(i));

. . .

}

Если блок рендерного кода записывается в форме <%= выражение %>, то в метод вставляется вывод вычисленного выражения.

5. Серверные элементы управления. В нашем примере страница содержит три серверных элемента управления: текстовую метку, поле ввода, кнопку:

<asp:Label id="Label1" runat="server">No Name</asp:Label>

<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>

<asp:Button id="Button1" onclick="Button1_Click"

runat="server" Text="Send"></asp:Button>

Серверные элементы управления описываются с помощью специальных тегов с обязательным атрибутом runat="server". Они соответствуют полям в классе страницы. Так, наша страница будет содержать поле с именем Label1, тип которого – System.Web.UI.WebControls.Label. Серверный элемент управления обладает набором свойств, установка которых возможна на странице как задание соответствующий атрибутов. Большинство серверных элементов должны быть размещены в пределах серверной формы (<form runat="server">).

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