Класс Page. От теории к практике


Наверно редкое собеседование по ASP.NET не обходится без вопроса о жизненном цикле страницы в ASP.NET Web Forms (далее для краткости ASP.NET). Попытаемся разобраться в этом вопросе. Разделил тему на две. В текущей статье разберем этапы жизненного цикла страницы в ASP.NET .

Общий план Жизненный цикл страницы ASP.NET
  • получение и обработка web-сервером IIS запроса к странице
  • дальнейшая передача запроса среде выполнения ASP.NET
  • среда выполнения:

    * загружает класс вызываемой страницы * устанавливает свойства класса страницы * выстраивает дерево элементов * заполняет свойства Request и Response * вызывает метод ```IHttpHandler.ProcessRequest```

Этапы

Выделяется 8 основных этапов. Наглядно это демонстрирует следующая схема

Этап Описание
Запрос станицы Запрос страницы осуществляется до начала жизненного цикла страницы. Пользователь осуществляет запрос, среда выполнения ASP.NET устанавливает, необходимо ли осуществить компиляцию страницы и начать жизненный цикл, либо можно выдать в качестве ответа страницу из кеша, не выполняя страницы.
Начало обработки На этом этапе происходит установка свойство Response и Request и свойства UICulture . Также, на этом этапе устанавливается, была ли эта страница запрошена в результате postback и соответствующим образом устанавливается свойство IsPostBack .
Инициализация страницы Ко времени инициализации страницы все дочерние пользовательские элементы управления уже созданы и имеют установленный свойства UniqueID . В это время к странице применяются темы оформления. Если страница вызвана в результате postback, то данные, отправленные на сервер, еще не загружены в свойства элементов управления, на этом этапе.
Если страница вызвана в результате postback, то на этом этапе устанавливаются свойства элементов управления, на основании информации о состоянии (ViewState и ControlState).
Валидация Вызывается метод Validate() для всех, находящихся на странице валидаторов.
Обработка постбэка Вызываются обработчики событий если postback произошел.
Рендеринг Сохраняется информация о состоянии, затем класс страницы вызывает соответствующие методы дочерних элементов управления для генерации HTML представления и передачи его в Response.OutputStream.
Выгрузка Выгрузка происходит после того, как создано HTML представление для всей страницы.
Привет w3ii в HTML

Этот код показывает пример как HTML страницы:




Hello w3ii!


firstpage.htm », а также создать ссылку на файл, как это: firstpage.htm

Привет w3ii в ASP.NET

Самый простой способ, чтобы преобразовать страницу HTML в ASP.NET страницу, чтобы скопировать файл HTML в новый файл с .aspx расширения.

Этот код показывает наш пример, как на странице ASP.NET:




Hello w3ii!


Если вы хотите попробовать это самостоятельно, сохранить код в файле под названием « firstpage.aspx », а также создать ссылку на файл, как это: firstpage.aspx

Как это работает?

Фундаментально страница с ASP.NET точно такой же, как HTML-страницы.

HTML страница имеет расширение.htm. Если браузер запрашивает страницу HTML с сервера, сервер отправляет страницу в браузер без каких-либо изменений.

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

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

Классический ASP

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

Предыдущие версии ASP (before ASP .NET) часто называют классический ASP.

ASP.NET не полностью совместит с классическим ASP, но большинство страниц Классического ASP будут работать нормально, как страницы ASP.NET, лишь с незначительными изменениями.

Если вы хотите узнать больше о классическом ASP, пожалуйста, посетите наш ASP Учебник .

Динамические страницы в классическом ASP

Чтобы продемонстрировать, как ASP может отображать страницы с динамическим содержимым, мы добавили некоторый исполняемый код (in red) в предыдущем примере:




Hello w3ii!




Код внутри теги выполняется на сервере.

Response.Write является ASP код для записи что-то в выходной HTML поток.

Now() является функцией возврата серверов текущей даты и времени.

Если вы хотите попробовать это самостоятельно, сохранить код в файле под названием « dynpage.asp », а также создать ссылку на файл, как это: dynpage.asp

Динамические страницы в ASP .NET

Этот код отображает наш пример, как на странице ASP.NET:




Hello w3ii!




Если вы хотите попробовать это самостоятельно, сохранить код в файле под названием « dynpage.aspx », а также создать ссылку на файл, как это: dynpage.aspx

ASP.NET против классического ASP

Предыдущие примеры не демонстрируют каких-либо различий между ASP.NET и классический ASP.

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

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

Последнее обновление: 31.10.2015

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

По умолчанию при создании нового проекта ASP.NET MVC 5 в проект уже добавляется мастер-страница под названием _Layout.chtml , которую можно найти в каталоге Views/Shared . В приложении из второй главы мы ее изменили следующим образом:

@ViewBag.Title @RenderBody()

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

Чтобы в представлении использовать мастер-страницу, нам надо в секции Layout указать путь к нужной мастер-странице. Например, в представлении Index.cshtml можно определить мастер-страницу так:

Если мы не используем мастер-страницу, то указываем Layout = null; .

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

Мастер-страница может иметь несколько секций, куда представления могут поместить свое содержимое. Например, добавим к мастер-странице секцию footer:

@ViewBag.Title

@RenderBody() @RenderSection("Footer")

Теперь при запуске предыдущего представления Index мы получим ошибку, так как секция Footer не определена. По умолчанию представление должно передавать содержание для каждой секции мастер-страницы. Поэтому добавим вниз представления Index секцию footer. Это мы можем сделать с помощью выражения @section:

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } @section Footer { Все права защищены. Syte Corp. 2012. }

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

Первый вариант заключается в использовании перегруженной версии метода RenderSection , которая позволяет указать, что данную секцию не обязательно определять в представлении. Чтобы отметить секцию Footer в качестве необязательной, надо передать в метод в качестве второго параметра значение false:

@RenderSection("Footer", false)

Второй вариант позволяет задать содержание секции по умолчанию, если данная секция не определена в представлении:

@if (IsSectionDefined("Footer")) { @RenderSection("Footer") } else { Содержание элемента footer по умолчанию. }

ViewStart

Если у нас в проекте пара-тройка представлений, мы легко можем изменить вручную для каждого описание мастер-страницы в секции Layout, если, например, мы решим использовать другую мастер-страницу. Но если у нас много представлений, то это делать будет не очень удобно.

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

При создании проекта ASP.NET MVC 5 в каталог Views уже по умолчанию добавляется файл _ViewStart.cshtml . Этот файл определяет мастер-страницу, используемую по умолчанию:

@{ Layout = "~/Views/Shared/_Layout.cshtml"; }

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

Шаблоны дизайна - это визуальное наследование страниц, впервые появившееся в ASP.NET 2.0. Вы можете создавать основу для любого количества страниц приложения. Шаблоны позволяют легче создавать и поддерживать приложения. Visual Studio 2005 включает поддержку создания и редактирования шаблонов страниц. Эта лекция рассматривает использование шаблонов страниц в приложении и начинается с объяснения их преимуществ.

Примечание: терминология в этой области не устоялась. В некоторых книгах используют выражение «эталонные страницы». Можно применять термин «главная страница», хотя его можно спутать с Default.aspx.

Зачем нужны шаблоны дизайна страниц?

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

Например, взгляните на главную страницу сайта газеты «Комсомольская правда». Каждый день там появляются разные статьи, но оформление их остается единым. Это логотип газеты, верхние, правые, левые навигационные панели, рейтинг статей справа, формы для поиска, подписки и входа в почту. Внизу страницы находится юридическая информация.

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

Основы Master Pages

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

Начиная с этой лекции, будем разбирать проект, который Visual Studio 2005 создает по шаблону Personal Web Site Starter Kit. В нем показаны шаблоны страниц, темы и персонализация и навигация. Элементы управления навигации сосредоточены на странице шаблона Default.master. И это естественное решение, так как навигация нужна везде.

В страницу шаблона также включают общие заголовки и нижние колонтитулы.

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

Когда дочерняя страница редактируется в среде разработки, на вкладке Design видна полная страница вместе с элементами из шаблона, но они показаны серым цветом. Их редактировать нельзя. Можно редактировать то, что находится в элементах Content.

В диалоге Add New Item выберите тип страницы Master Page. Как и обычные страницы, их можно создавать с отделенным кодом или кодом, встроенным в страницу. Это никак не влияет на модель разделения кода дочерних+ страниц. Кроме того, главная и дочерняя страницы могут разрабатываться на разных языках.

Чтобы получить четкое разделение страницы на логические части, используют таблицы. Построим таблицу с 3 строками, где в верхней строке находится заголовок всех страниц, во второй произвольное содержание, она состоит из двух ячеек, в каждой из которых по одному ContentPlaceHolder. В нижнем ряду находится правовая информация. Таблица создается очень просто из меню Layout-Insert Table. Создайте таблицу 2 на 3. После этого объедините ячейки верхней и нижней строк, а в среднюю вставьте ContentPlaceHolder. Создайте содержание заголовка и подвала. Должна получиться подобная страница:

Привет!
Школа программирования ASP.NET 2.0
Copyright © 2006 - Школа ASP.NET 2.0

Первое отличие этой страницы от обычной в том, что она начинается с директивы Master, а не Page. Класс мастер-страницы определен в файле MasterPage.master.cs.

public partial class MasterPage: System.Web.UI.MasterPage { protected void Page_Load(object sender, EventArgs e) { } }

Класс шаблона - наследник System.Web.UI.MasterPage, который в свою очередь наследует от System.Web.UI.UserControl.

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

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

Но и в этом случае назначение главной страницы в директиве Page имеет приоритет над назначением на уровне приложения. Установка web.config действует на тех страницах, в которых masterPageFile не указан, но определены элементы управления Content. Эта установка не действует на обычные aspx-страницы.

Шаблон можно назначить не всем страницам, а выборочно, например, расположенным в определенной папке приложения.

Элемент location вставляется в главный узел configuration. Здесь указано, что все страницы из папки Lections используют шаблонную страницу Lections.master.

На странице-наследнице шаблона могут быть только элементы типа Content, каждый из который соответствует одному элементу ContentPlaceHolder шаблона. Нельзя вставлять содержание вне этих элементов, иначе ASP.NET не сможет объединить главную страницу со страницей содержания. Идентификатор ContentPlaceHolder должен совпадать с атрибутом ContentPlaceHolderID соответствующего элемента Content.

Программа создала дочернюю страницу с 2 элементами управления Content. Если переключиться на вкладку Design, эти два элемента Content показаны в виде пустых прямоугольников, расположенных рядом друг с другом, так как в шаблоне они находятся в двух соседних ячейках таблицы. Директива Page отличается от обычной, кроме атрибута MasterPageFile, наличием атрибута Title. Так как теги , , наследуются из файла шаблона, это единственная возможность переопределить заголовок браузера. Заменим значение атрибута

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

На самой странице отображается только содержание, заданное в странице шаблона.

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

(Ее можно найти в установке.NET "Microsoft.NET\Framework\v2.0.xxx\ASP.NETWebAdminFiles\Images)

Дочерняя страница в браузере теперь выглядит так:

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

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

На странице MainSchool.aspx он отображаться не будет, так как в ней определены оба элемента Content. Однако если в следующей странице определен только один из элементов Content:

Какой язык программирования Вы предпочитаете?
asp:RadioButtonList ID="rblVoting" runat="server" DataSourceID="SqlDataSource1" DataTextField="variant" DataValueField="id">


Если посмотреть ее в браузере, увидим, что в ее левой части «хлебные крошки» отображаются.

Программное назначение мастер страницы

В странице содержания можно переназначить ее главную страницу программно. Для этого нужно присвоить нужное значение свойству Page.MasterPageFile. Шаблон поменяется независимо от того, какой шаблон был назначен в директиве @Page. Но если попробуете проделать это в функциях Page_Load или Page_Init, получите ошибку времени выполнения.

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

Страницы шаблона могут иметь методы и свойства. Чтобы можно было обращаться к ним, нужно использовать директиву @MasterType. При этом становится доступен класс страницы шаблона дизайна через строго типизированную ссылку. Атрибут TypeName задает имя типа, а VirtualPath путь относительно корневого каталога веб-приложения к файлу шаблона.

Таким образом страница разрешает доступ извне к свойствам своих элементов.

void Page_Load() { Master.FooterText = "This is a custom footer"; AdRotator ad = (AdRotator)Master.FindControl("MyAdRotator"); if (ad != null) { ad.BorderColor = System.Drawing.Color.Purple; ad.BorderWidth = 10; } }
Вложенные мастер-страницы

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

Perrenials

Страница, описывающая нарциссы, находится в разделе многолетних цветов и наследует шаблон SectionPerrenials.

Daffodils bloom early in spring and welcome the growing season.
Последовательность событий

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

Инициализация вложенных элементов управления главной страницы.

Инициализация вложенных элементов управления страницы содержания.

Инициализация самой главной страницы.

Инициализация страницы содержания.

Событие Page_LoadComplete страницы содержания

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

Страницы шаблонов для конкретных платформ

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

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

Заключение

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

Первые страницы на ASP.NET дают первоначальное знакомство с солидной технологией создания веб-приложений. Не усложняя первые шаги фреймворками WebForms, MVC, WebAPI создадим простые веб-страницы с внедренным программным кодом для двух обработчиков представлений - ASPX и Razor . Обработчики кода, называемые еще механизмами визуализации или движками, предназначены для динамического создания веб-страницы путем замены программного кода соответствующей html разметкой.

Движок ASPX - стандартная модель добавления кода на веб-страницу ASP.NET. ASPX использует блоки объявления типов, процедур и переменных runat="server"> и встроенный блок отрисовки html разметки. Модель добавления программного кода ASPX с некоторыми изменениями перешла в ASP.NET из первой платформы ASP.

Razor новый механизм визуализации программного кода в html странице. Razor это интеллектуальный движок динамического создания html разметки. Имеет понятный синтаксис и упрощает внедрение кода в веб-страницу. Для отличия программного кода от html кода использует символ @, в сочетании с фигурными скобками и без скобок.

Для создание первых веб-страниц будем использовать бесплатную программную среду для работы с веб-сайтами WebMatrix . На текущий момент создана 3-я версия этого, достаточного для создания профессиональных сайтов, инструмента программирования. Скачать ее можно с сайта компании Microsoft по ссылке WebMatrix . В состав программы WebMatrix входит все необходимое для создания и тестирования веб-сайтов на основе ASP.NET: редактор кода с подсветкой и IntelliSense, вебсервер IIS Express, система управления базами данных SQL LocalDB.

Сайт включает из три страницы: главная и две одинаковые страницы динамического создания таблиц на движках ASPX и Razor. Размерность таблицы можно задавать в строке запроса двумя параметрами. Надо сказать, что в принципе оба обработчика эффективно создают html разметку, но предоставляют разный комфорт работы.

Движок ASPX требует заключения всех частей и частичек программного кода в блоки вида. Типы, процедуры и переменные можно объявлять в блоке runat="server"> … . Атрибут runat="server" отличает данный блок от блока javascript и обозначает обработку кода в этом блоке непосредственно на сервере.

Листинг №1 Вебстраница на движке ASPX

< !DOCTYPE html > < html xmlns ="http://www.w3.org/1999/xhtml"> < head runat ="server"> < meta http-equiv ="Content-Type" content ="text/html; charset=utf-8"/> < title > < link rel ="stylesheet" type ="text/css" href ="/css/style.css" /> < body > < h1 > < p >< a href ="/"> На главную < p > Количество стобцов - < br /> Количество строк - < table > < tr > < tr > < td >

Ниже показан код веб страницы для обработчика внедренного программного кода Razor . Обратите внимание на гармоничное слияние html кода и выражений на языке C#. Движок Razor позволяет использовать html теги непосредственно внутри программного кода: интеллектуальная составляющая обработчика ловко отделяет html разметку от программного кода C#.

Листинг №2 Вебстраница на движке Razor

< !DOCTYPE html > < html lang ="ru"> < head > < meta http-equiv ="Content-Type" content ="text/html; charset=utf-8"/> < meta charset ="utf-8" /> < title > @ namepage < link rel ="stylesheet" type ="text/css" href ="/css/style.css" /> < body > < h1 > @ namepage < p >< a href ="/"> На главную @ Html.Raw(createLinks.GetLinks()) < p > Количество стобцов - @ numberColumns < br /> Количество строк - @ numberRows < table > < tr > @ for (int i = 0; i < numberColumns; i++) { < th > Заголовок № @(i + 1 ) } @ for (int row = 0; row < numberRows; row++) { < tr > @ for (int col = 0; col < numberColumns; col++) { < td > @(row+1 ) х@(col+1 ) } }

Протестировать работу сайта можно несколькими способами:

  • MS Visual Studio - Файл->Открыть веб-сайт ->Выбрать папку в которую распакован архив Запуск в браузере (или клавиша F5)
  • WebMatrix - Открыть->Папка->Выбрать папку в которую распакован архив сайта->Выбор папки Запуск
  • Распаковать архив в физическую папку локального или интернет сайта. Запустите сайт в браузере по его URL адресу.
  • В заключении можно добавить, что для пользователя сайта, информация о том на каком движке работают веб-страницы не сильно важна. Но программист, поработав с каждым обработчиком внедренного кода, наверняка сделает выбор в пользу Razor.





    

    2024 © gtavrl.ru.