Класс Page. Технология разделения кода. Упрощенная локализация Web -приложений

Шаблоны дизайна - это визуальное наследование страниц, впервые появившееся в 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 master pages allow you to create a consistent layout for the pages in your application. A single master page defines the look and feel and standard behavior that you want for all of the pages (or a group of pages) in your application. You can then create individual content pages that contain the content you want to display. When users request the content pages, they merge with the master page to produce output that combines the layout of the master page with the content from the content page.

How Master Pages Work

Master pages actually consist of two pieces, the master page itself and one or more content pages.

Master Pages

A master page is an ASP.NET file with the extension .master (for example, MySite.master) with a predefined layout that can include static text, HTML elements, and server controls. The master page is identified by a special directive that replaces the directive that is used for ordinary .aspx pages. The directive looks like the following.

The @ Master directive can contain most of the same directives that a directive can contain. For example, the following master-page directive includes the name of a code-behind file, and assigns a class name to the master page.

In addition to the @ Master directive, the master page also contains all of the top-level HTML elements for a page, such as html, head, and form. For example, on a master page you might use an HTML table for the layout, an img element for your company logo, static text for the copyright notice, and server controls to create standard navigation for your site. You can use any HTML and any ASP.NET elements as part of your master page.

Replaceable Content Placeholders

In addition to static text and controls that will appear on all pages, the master page also includes one or more controls. These placeholder controls define regions where replaceable content will appear. In turn, the replaceable content is defined in content pages. After you have defined the controls, a master page might look like the following.

Master page title

Master page title

Content Pages

You define the content for the master page"s placeholder controls by creating individual content pages, which are ASP.NET pages (.aspx files and, optionally, code-behind files) that are bound to a specific master page. The binding is established in the content page"s @ Page directive by including a attribute that points to the master page to be used. For example, a content page might have the following @ Page directive, which binds it to the Master1.master page.

In the content page, you create the content by adding controls and mapping them to controls on the master page. For example, the master page might have content placeholders called Main and Footer. In the content page, you can create two controls, one that is mapped to the control Main and the other mapped to the control Footer, as shown in the following figure.

Replacing placeholder content

In general, this structure has no effect on how you construct your pages or program them. However, in some cases, if you set a page-wide property on the master page, it can affect the behavior of the content page, because the master page is the closest parent for the controls on the page. For example, if you set the property on the content page to true but set the same property to false in the master page, view state will effectively be disabled because the setting on the master page will take priority.

Master Page and Content Page Paths

When a content page is requested, its content is merged with the master page, and the page runs in the context of the content page. For example, if you get the property of the object, whether in content page code or in master page code, the path represents the location of the content page.

The master page and content page do not have to be in the same folder. As long as the attribute in the content page"s @ Page directive resolves to a .master page, ASP.NET can merge the content and master pages into a single rendered page.

Referencing External Resources

Both the content page and master page can contain controls and elements that reference external resources. For example, both might contain image controls that reference image files, or they might contain anchors that reference other pages.

The context for the merged content and master pages is that of the content page. This can affect how you specify URLs for resources, such as image files and target pages, in anchors.

Server Controls

In server controls on master pages, ASP.NET dynamically modifies the URLs of properties that reference external resources. For example, you might put an control on a master page and set its property to be relative to the master page. At run time, ASP.NET will modify the URL so that it resolves correctly in the context of the content page.

ASP.NET can modify URLs in the following cases:

    The URL is a property of an ASP.NET server control.

    The property is marked internally in the control as being a URL. (The property is marked with the attribute .) In practical terms, ASP.NET server control properties that are commonly used to reference external resources are marked in this way.

Other Elements

ASP.NET cannot modify URLs on elements that are not server controls. For example, if you use an img element on a master page and set its src attribute to a URL, ASP.NET will not modify the URL. In that case, the URL will be resolved in the context of the content page and create the URL accordingly.

In general, when working with elements on master pages, it is recommended that you use a server control, even for elements that do not require server code. For example, instead of using an img element, use an server control. That way, ASP.NET can resolve URLs correctly and you can avoid maintenance issues that might arise if you move the master or content page.

For more information about specifying paths for ASP.NET server controls, see ASP.NET Web Site Paths .

Master Pages and Themes

You cannot directly apply an ASP.NET theme to a master page. If you add a theme attribute to the @ Master directive, the page will raise an error when it runs.

However, themes are applied to master pages under these circumstances:

    If a theme is defined in the content page. Master pages are resolved in the context of content pages, so the content page"s theme is applied to the master page as well.

    If the site as a whole is configured to use a theme by including a theme definition in the element.

Scoping Master Pages

You can attach content pages to a master page at three levels:

    At the page level You can use a page directive in each content page to bind it to a master page, as in the following code example.

    At the application level By making a setting in the pages element of the application"s configuration file (Web.config), you can specify that all ASP.NET pages (.aspx files) in the application automatically bind to a master page. The element might look like the following.

    If you use this strategy, all ASP.NET pages in the application that have controls are merged with the specified master page. (If an ASP.NET page does not contain controls, the master page is not applied.)

    At the folder level This strategy is like binding at the application level, except that you make the setting in a Web.config file in one folder only. The master-page bindings then apply to the ASP.NET pages in that folder.

Привет 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.

Наверно редкое собеседование по 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 представление для всей страницы.

Страница 10 из 11

Создание страницы

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

    Страница 1

  • Страница 2

  • Страница 3



Также как и в случае с шаблоном, код логики страницы создается обычным образом. Единственное отличие в том, что страница не имеет собственных объектов вроде HeadControl, поэтому нужно использовать ссылку на страницу шаблона через свойство Master.

Protected void Page_Load(object sender, EventArgs e){

if (!Page.IsPostBack) Master.Page.Header.Title = "Домашняя страница";}

protected void btnShow_Click(object sender, EventArgs e){ PlaceHolder.Controls.Add(

new LiteralControl(" alert("Добрый день, " + txtName.Text + ""); "));

Master.Page.Header.Title = "Добрый день, " + txtName.Text;}

Для того чтобы привязать страницу к шаблону используется атрибут MasterPageFile директивы Page. Если же необходимо привязать один и тот же шаблон ко всем страницам в директории, то нет необходимости указывать атрибут MasterPageFile для каждой страницы, достаточно задать базовый шаблон в файле web.config.


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

Protected void Page_PreInit(object sender, EventArgs e){ Page.MasterPageFile = "AnotherMaster.master";}

Обработка шаблонов средой ASP.NET

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

При обращении к aspx файлу страницы с заданным шаблоном оформления процесс компиляции почти ничем не отличается от обычного процесса компиляции страницы, за исключением того, что создается класс шаблона MasterPage ссылка на который доступна в свойстве Page.Master.

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

Домашняя страница

  • Страница 1
  • Страница 2

  • Страница 3\


\

Время: 20.03.2005

Поскольку шаблон является подмножеством страницы, то допустимо создавать вложенные шаблоны, указывая для шаблона в директиве Master путь к другому шаблону с помощью атрибута MasterPageFile. Для этого необходимо в основном шаблоне определить элементы управления ContentPlaceHolder, а в «дочерних» шаблонах на ряду с ContentPlaceHolder элементами определить элементы управления Content для замещения содержимого элементов ContentPlaceHolder базового шаблона.

Использование разных шаблонов для разных браузеров

Любому Web-разработчику хорошо известно, что разные браузеры (например, Microsoft Internet Explorer, Netscape Navigator, Mozilla FireFox и др.) по разному обрабатывают HTML код и, что особенно важно, обладают несколько разными программируемыми моделями, что усложняет создание клиентских сценариев.

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

Список браузеров и используемые средой ASP.NET свойства браузеров можно найти в директории %WINDIT%\Microsoft.NET\Framework\версия\CONFIG\Browsers.