Класс Page. Пустые промежутки в сценариях

Описание

Устанавливает способ позиционирования элемента относительно окна браузера или других объектов на веб-странице.

Синтаксис

position: absolute | fixed | relative | static | inherit

Значения absolute Указывает, что элемент абсолютно позиционирован, при этом другие элементы отображаются на веб-странице словно абсолютно позиционированного элемента и нет. Положение элемента задается свойствами left , top , right и bottom , также на положение влияет значение свойства position родительского элемента. Так, если у родителя значение position установлено как static или родителя нет, то отсчет координат ведется от края окна браузера. Если у родителя значение position задано как fixed , relative или absolute , то отсчет координат ведется от края родительского элемента. fixed По своему действию это значение близко к absolute , но в отличие от него привязывается к указанной свойствами left , top , right и bottom точке на экране и не меняет своего положения при прокрутке веб-страницы. Браузер Firefox вообще не отображает полосы прокрутки, если положение элемента задано фиксированным, и оно не помещается целиком в окно браузера. В браузере Opera хотя и показываются полосы прокрутки, но они никак не влияют на позицию элемента. relative Положение элемента устанавливается относительно его исходного места. Добавление свойств left , top , right и bottom изменяет позицию элемента и сдвигает его в ту или иную сторону от первоначального расположения. static Элементы отображаются как обычно. Использование свойств left , top , right и bottom не приводит к каким-либо результатам. inherit Наследует значение родителя.

HTML5 CSS2.1 IE Cr Op Sa Fx

position .layer1 { position: relative; /* Относительное позиционирование */ background: #f0f0f0; /* Цвет фона */ height: 200px; /* Высота блока */ } .layer2 { position: absolute; /* Абсолютное позиционирование */ bottom: 15px; /* Положение от нижнего края */ right: 15px; /* Положение от правого края */ line-height: 1px; }

Результат данного примера показан на рис. 1.

Рис. 1. Применение свойства position

Объектная модель

document.getElementById("elementID ").style.position

Браузеры

Браузер Internet Explorer 6 значение fixed не поддерживает. Internet Explorer до версии 8.0 не поддерживает значение inherit .

Файл Active Server Pages (ASP) представляет собой текстовый файл с расширением «.asp». Этот файл может содержать:

  • текстовые данные;
  • теги языка HTML;
  • серверные сценарии.

Для быстрого создания файла «.asp» достаточно переименовать HTML-файл, сменив расширение «.htm» или «.html» на «.asp». Если файл не содержит функций ASP, сервер просто выполняет эффективную отправку файла на компьютер пользователя. Эта черта обеспечивает дополнительные удобства для веб-разработчиков, которые могут давать файлам расширение «.asp», даже если не предполагают впоследствии включать в них функции ASP.

Для опубликования вновь созданного файла «.asp» в Интернете следует сохранить его в виртуальном каталоге веб-узла (последний должен иметь разрешение «Сценарий» или «Выполнение»). После этого можно обратиться к данному файлу в запросе, указав в обозревателе соответствующий адрес URL. (Необходимо помнить, что поскольку страницы ASP должны обрабатываться на сервере, ввод физического пути к файлу «.asp» в данном случае недопустим.) Переданный сервером файл при просмотре в обозревателе представляет собой страницу HTML. В этом есть определенный смысл, так как перед отправкой файла на сервере выполняется его синтаксический анализ и выполняются все серверные сценарии ASP. Поэтому пользователи всегда получают обычные файлы HTML.

Файлы «.asp» могут создаваться в любом текстовом редакторе. По мере накопления опыта более удобной может оказаться работа в специальном редакторе, включающем дополнительную поддержку ASP, таком как Microsoft® Visual InterDev™. (Дополнительные сведения см. на веб-узле Microsoft Visual InterDev по адресу http://msdn.microsoft.com/vinterdev/ .)

Добавление команд в сценарий для сервера

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

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

This page was last refreshed on .

Функция VBScript Now() возвращает текущие дату и время. Во время обработки данной страницы веб-обозреватель заменит текущими значениями даты и времени и возвратит страницу обозревателю со следующим результатом:

This page was last refreshed on 01/29/99 2:20:00 PM.

Команды, заключенные в разделители, называются основными командами сценариев и обрабатываются при помощи основного языка сценариев. Команда внутри разделителей должна быть допустимой командой основного языка сценариев. По умолчанию основным языком сценариев является VBScript; можно назначить и другой язык сценариев по умолчанию. См. Работа с языками сценариев .

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

Совместное использование тегов HTML и команд языка сценариев

В разделители ASP можно поместить любую инструкцию, выражение, процедуру или оператор, применение которых разрешено в используемом основном языке сценариев. Под инструкцией в VBScript и других языках написания сценариев понимают синтаксически полную конструкцию, которой описывается один вид действия, объявления или определения. Примером часто используемой инструкции является условная инструкция If...Then...Else :

В зависимости от времени дня строковой переменной strGreeting в сценарии присваивается значение "Good Morning!" («Доброе утро!») или "Hello!" «Здравствуйте!». Инструкция отправляет текущее значение переменной в обозреватель.

Таким образом, до 12:00 дня (по местному времени) на экраны пользователей выводится строка:

Good Morning!

После 12:00 пользователи увидят сообщение:

Между различными частями инструкции может располагаться HTML-текст. Так, результат выполнения приведенного ниже сценария с тегами языка HTML и инструкцией If...Then...Else является таким же, как и в примере выше:

Good Morning! Hello!

Если заданное в сценарии условие выполняется (полдень еще не наступил), веб-сервер отправляет в обозреватель указанный в условии текст HTML (“Good Morning”). В противном случае в обозреватель отправляется строка (“Hello!”), указанная после Else . Подобное чередование HTML-текста и команд сценариев часто применяется при работе с инструкцией If...Then...Else . Применение рассмотренной выше конструкции удобно, если приветствие требуется вывести в нескольких местах веб-страницы. Значение переменной устанавливается только один раз, после чего оно может использоваться многократно.

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

Команда Response.Write отправляет расположенный после нее текст в обозреватель. Инструкцию с Response.Write следует использовать в тех случаях, когда возвращаемый в обозреватель текст должен создаваться динамически. Таким образом, например, можно составить строку из значений нескольких переменных. Чтобы узнать больше об объекте Response в частности и об объектах вообще, обратитесь к разделам Использование компонентов и объектов и Отправка содержимого в веб-обозреватель . Сейчас же просто следует заметить, что добавление команд сценария на страницу HTML можно осуществить несколькими способами.

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

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

This is the text version of a page. This is the multimedia version of a page.

Работа с директивами ASP

ASP предоставляет директивы, которые не входят в состав используемого языка сценариев: директиву для вывода данных и директиву для их обработки.

В ASP директива вывода позволяет вывести значение выражения на экран. Эта директива вывода равнозначна команде Response.Write . Например, выражение можно использовать для вывода на экран слова Baltimore (текущее значение переменной) в обозревателе.

Директива обработки позволяет передавать в ASP данные, которые необходимы для обработки файла «.asp». В следующем примере показаны директивы для VBScript в качестве основного языка сценариев на странице:

Директива обработки должна быть первой строкой в файле «.asp». Если страница должна содержать несколько директив, они должны располагаться внутри одной пары разделителей. Включение в файл директивы обработки с помощью инструкции #include не допускается. (Дополнительные сведения см. в разделе

В следующем примере задаются язык сценария и кодовая страница:

Пустые промежутки в сценариях

Если основным языком сценария является VBScript или JScript, ASP автоматически убирает пустые промежутки, которые могут встречаться в командах. В случае остальных языков написания сценариев эти промежутки сохраняются. Это обеспечивает правильность интерпретации команд в языках, где имеют значение местоположение элементов и отступы. Пустыми промежутками являются пробелы, знаки табуляции, возврата каретки и разрыва строки.

В языках VBScript и JScript допускается оставлять промежутки после открывающим и перед закрывающим разделителем. Это облегчает чтение команд. Так, перечисленные ниже инструкции правильны:

Промежуток между закрывающими разделителем одной инструкции и открывающим разделителем другой в ASP удаляется автоматически. Тем не менее, использование пропусков повышает легкость чтение. Чтобы сохранить промежуток между двумя инструкциями, например при отображении значений переменных в предложении, следует пользоваться знаком неразрывного пробела из языка HTML (). Например:

@ foreach (var item in rows) { // do something }

Nested expressions or statements do not start with an @ sign...

< ul > @ foreach (var item in rows) { if (item.Equals(x)) { // do something } }

Unless they are separated from the outer expression or statement by unmatched tags

< ul > @ foreach (var item in rows) { < li > @ if (item.Equals(x)) { // do something } }

The @ sign is used in Razor to render the value of variables, expressions and statements to the browser:

@ DateTime .Now @(someCondition ? x: y )

Variables within expressions and statements should not be prefixed with the @ sign.

If you wish to render plain text or unmatched tags while inside a statement block, you use the @ sign followed by a colon to tell Razor that what follows is not C# code:

@ if (item == x) // plain text { @: The time is @ DateTime .Now } @ if (item == x) // unmatched tags { @: < ul > } else { @: < ol > } Identifiers

An identifier in C# is the name given to a namespace, class, variable, property, method, interface etc. Rules govern what makes a valid identifier . It is permitted to use a C# keyword as an identifier, but if you do, you must use the @ sign to prevent compile time errors. You are advised against using a keyword as an identifier, but there are times when you cannot avoid doing so.

Some overloads of the HtmlHelper classes (Web Pages and MVC) accept an object to represent the HTML attributes to be rendered as part of the tag that the helper represents. The following example adds a style attribute to a text input and sets its value to width:100%; :

@ Html.TextBoxFor(model => new { style = "width:100%;" })

When you do this, you are creating an anonymous type with a property called style to represent the HTML attributes. If you want to set the CSS class attribute via this method, you need to add a property to the anonymous type called class - which is a C# keyword. Therefore you must use the @ sign to enable the use of class in this case:

@ Html.TextBoxFor(model => model.FirstName, htmlAttributes: new { @class = "full-width" })

A mistake I see repeated quite often in the ASP.NET forums is to apply the @ sign to all other properties of the anonymous type, which is just not necessary. Some people even think that the @ sign used here is part of the Razor syntax rules. It"s not. It"s usage here preceded Razor by a long way.

Verbatim String Literals

A verbatim string literal in C# consists of the @ sign followed by a literal string in double quotes and terminated with a semi-colon e.g.

var s = @"Hello World" ;

Two benefits of using a verbatim string literal include the fact that you only need to escape double quotes (by doubling them); and the string can span multiple lines in code without requiring continuation characters. For these reasons, verbatim string literals are most suitable for representing paths (which may otherwise need their slashes escaping) and regular expression patterns (which also may otherwise require backslashes to be escaped).

Regex re = new Regex (@"\w\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}\w" );

They are also useful for representing large blocks of text if they need to be included in code in a readable manner, such as SQL statements that might be used in Web Pages applications:

var sql = @"SELECT p.ProductName, o.UnitPrice, o.Quantity, (o.UnitPrice * o.Quantity) - (o.UnitPrice * o.Quantity * o.Discount) As TotalCost FROM OrderDetails o INNER JOIN Products p ON o.ProductID = p.ProductID WHERE o.OrderID = @0" ;

The use of the @ sign in this context once again has nothing to do with Razor syntax.

Summary

If you have ever wondered when and where you should be using the @ sign in your ASP.NET code, hopefully this article has helped to resolve your confusion.

Класс Page

Теперь, когда вы увидели, что собой представляет жизненный цикл страницы, и узнали, каким образом в странице содержатся элементы управления, не помешает указать, что экземпляр самой страницы тоже создается в виде объекта элемента управления. В действительности все веб-формы фактически являются экземплярами класса Page из ASP.NET, который находится в пространстве имен System.Web.UI .

Вы наверняка уже догадались об этом, заметив, что каждый класс отделенного кода явно наследуется от System.Web.UI.Page. Это означает, что каждая создаваемая веб-форма сразу же получает огромный объем функциональности, такой как уже встречавшийся ранее метод FindControl() и свойство IsPostBack. Помимо этого, наследование от Page также еще предоставляет коду доступ к следующим чрезвычайно полезным свойствам:

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

Более подробно об этих объектах рассказывается в последующих разделах.

Объекты Session, Application и Cache

Объект Session является экземпляром класса System.Web.SessionState.HttpSessionState . Он предназначен для хранения любого типа пользовательских данных, который должен постоянно существовать между запросами веб-страниц. Объект Session предоставляет словарный доступ к набору пар "имя-значение", представляющему пользовательские данные для этого сеанса. Состояние сеанса часто применяется для обслуживания информации наподобие имени и идентификатора пользователя, покупательской тележки либо других элементов, удаляемых, когда пользователь уже не посещает страницы веб-сайта.

Объект Application является экземпляром класса System.Web.HttpApplicationState . Подобно объекту Session, он тоже представляет собой словарь данных типа "имя-значение". Однако эти данные являются глобальными для всего приложения.

Что касается объекта Cache, то он является экземпляром класса System.Web.Caching.Cache . В нем также хранится глобальная информация, но он предлагает более масштабируемый механизм хранения, поскольку ASP.NET может удалять объекты в случае нехватки памяти сервера. Как и другие наборы состояний, это, по сути, коллекция объектов "имя-значение", однако здесь для каждого элемента можно также устанавливать специализированные политики истечения срока и определять зависимости.

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

Объект Request

Объект Request является экземпляром класса System.Web.HttpRequest . Этот объект представляет значения и свойства HTTP-запроса, который привел к загрузке страницы. В нем содержатся все параметры, касающиеся URL, а также все остальные данные, которые были отправлены клиентом. Большая часть из предоставляемой объектом Request информации заключена в оболочку абстракций более высокого уровня (например, в оболочку модели веб-элементов управления ASP.NET), поэтому она даже и близко не так важна, как это было в классической ASP-разработке.

Тем не менее, объект Request все равно может использоваться, например, для выяснения того, каким браузером пользуется клиент, или же для создания cookie-наборов и последующего изучения их содержимого.

В таблице ниже перечислены некоторые наиболее часто применяемые свойства объекта Request:

Свойства объекта HttpRequest Свойство Описание
AnonymousID Уникальным образом идентифицирует текущего пользователя, если был включен анонимный доступ.
ApplicationPath и PhysicalApplicationPath ApplicationPath извлекает информацию о месте размещения виртуального каталога приложения ASP.NET (URL-адрес), a PhysicalPath - о месте размещения его "реального"каталога
Browser Предоставляет ссылку на объект HttpBrowserCapabilities , в котором содержатся свойства, описывающие различные функциональные возможности браузера, наподобие наличия в нем поддержки для элементов управления ActiveX, cookie-наборов, сценариев VBScript и фреймов
ClientCertificate Объект HttpClientCertificate , предоставляющий сертификат безопасности для текущего запроса, если таковой существует
Cookies Предоставляет коллекцию cookie-наборов, отправляемых с этим запросом
FilePath и CurrentExecutionFilePath Возвращают реальный путь к файлу (относительно сервера) для выполняемой в данный момент страницы. FilePath представляет страницу, запустившую процесс выполнения. Это то же самое, что и CurrentExecutionFilePath, если вы не переместили пользователя на новую страницу без перенаправления (например, с помощью метода Server.Transfer()), в случае чего CurrentExecutionFilePath отражает новую страницу, a FilePath определяет исходную страницу
Form Представляет коллекцию переменных формы, обратно отправляемых странице. В большинстве случаев вместо использования данной коллекции вы будете извлекать эту информацию из свойств элемента управления
Headers и ServerVariables Предоставляют словарную коллекцию HTTP-заголовков и серверных переменных с индексацией по имени. Эти коллекции по большей части состоят из низкоуровневой информации, которая отправлялась браузером вместе с веб-запросом (например, информации о типе браузера, поддерживаемых им функциональных возможностях, установленных языковых параметрах, удостоверениях, используемых для аутентификации данных, и т.д.). Обычно эту информацию гораздо легче получить из других свойств объекта HttpRequest или высокоуровневых классов ASP.NET
IsAuthenticated и IsSecureConnection Возвращают true в случае успешной аутентификации пользователя и подключения пользователя по протоколу защищенных сокетов (Secure Sockets Layer - SSL)
IsLocal Возвращает true, если пользователь запрашивает страницу с локального компьютера
QueryString Предоставляет параметры, переданные в строке запроса
Url и UrlReferrer Выдают объект Uri, представляющий текущий адрес страницы и страницу, с которой переходит пользователь (предыдущую страницу, содержащую ссылку на данную страницу)
UserAgent Строка, представляющая тип браузера. Internet Explorer предоставляет для этого свойства значение MSIE. ASP.NET использует эту информацию для выяснения того, о браузере какого типа идет речь, и, следовательно, для определения, какие функциональные возможности этот браузер должен поддерживать (такие как cookie-наборы, сценарии JavaScript и т.д.). Это, в свою очередь, может влиять на способ визуализации веб-элементов управления.
UserHostAddress и UserHostName Извлекают информацию об IP-адресе и DNS-имени удаленного клиента. К этой информации также можно получать доступ и через коллекцию ServerVariables. Однако из-за трансляции сетевых адресов (Network Address Translation - NAT) она не всегда бывает значимой. В зависимости от способа подключения к Интернету, многие клиенты могут использовать совместно один и тот же IP-адрес (например, IP-адрес шлюзового компьютера). Помимо этого, IP-адрес также еще может и меняться после выполнения нескольких запросов
UserLanguages Предоставляет отсортированный строковый массив, в котором перечислены языковые предпочтения клиента. Может быть полезно при создании многоязычных страниц
Объект Response

Объект Response является экземпляром класса System.Web.HttpResponse и представляет ответ веб-сервера на запрос клиента. При классической ASP-разработке объект Response был единственным способом программной отправки HTML-текста клиенту.

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

В следующей таблице перечислены некоторые наиболее часто применяемые члены класса HttpResponse:

Члены класса HttpResponse Метод или свойство Описание
BufferOutput Когда это свойство установлено в true (значение по умолчанию), страница не отправляется клиенту до тех пор, пока не будет визуализирована и готова к отправке полностью, вместо того, чтобы отправляться по частям. В некоторых специфических сценариях имеет смысл устанавливать это свойство в false.
Наиболее очевидным примером является ситуация, когда клиент загружает большой файл. Если свойство BufferOutput установлено в false, клиент увидит диалоговое окно Save (Сохранить) и сможет выбрать имя файла, прежде чем этот файл будет загружен полностью
Cache Это свойство ссылается на объект HttpCachePolicy , который позволяет конфигурировать кэширование вывода
Cookies Это свойство предоставляет доступ к коллекции cookie-наборов, отправляемых вместе с ответом. Его можно использовать для добавления дополнительных cookie-наборов
Expires и ExpiresAbsolute Эти свойства можно использовать при кэшировании визуализируемого HTML-кода страницы, улучшающем показатели производительности при последующих запросах
IsClientConnected Это булевское значение, показывающее, подключен ли клиент к серверу. Если он уже не подключен, может потребоваться остановить какую-нибудь длинную операцию
Redirect() Этот метод заставляет браузер запросить другой URL-адрес, который указывает на новую страницу веб-приложения или на другой веб-сайт
RedirectPermanent() Этот метод перенаправляет браузер на новый URL-адрес, во многом подобно методу Redirect(). Разница в том, что он использует код состояния HTTP 301 (который указывает на то, что страница была перемещена навсегда), а не 302 (который указывает на то, что страница была перемещена временно)
RedirectToRoute() и RedirectToRoutePermanent() Эти методы похожи на методы Redirect() и RedirectPermanent(). Единственное отличие в том, что они используют маршрут (зарегистрированный шаблон URL, который не отображается непосредственно на страницу)
Transfer() Этот метод сообщает ASP.NET прекратить обработку текущей страницы и перейти к новой (указанной) странице с веб-формой. При этом не требуются полный цикл отправки и уведомление браузера и пользователя веб-приложения
TransferRequest() Этот метод похож на Transfer(), но позволяет переносить пользователя на страницу другого типа. Например, его можно применять для отправки пользователя с веб-формы ASP.NET на HTML-страницу.
Когда он используется, в действие приводится весь конвейер IIS для обработки нового ресурса, вместе со всеми соответствующими модулями HTTP. Но с методом TransferRequest() связан ряд существенных ограничений. Для его применения должен использоваться веб-сервер IIS 7 в интегрированном режиме. Кроме того, понадобится освободить состояние сеанса (если оно было получено) для предотвращения длительных задержек
ContentType Это свойство представляет заголовок, указывающий браузеру, содержимое какого типа он должен получить. Обычно в веб-формах ASP.NET, как и во всех веб-страницах, используется содержимое типа text/html (текст вперемешку с HTML). Однако в принципе может быть создан специальный обработчик HTTP, обслуживающий содержимое других типов
OutputStream Это свойство представляет данные, отправляемые браузеру в виде потока низкоуровневых байтов. Его можно использовать для подключения к модели потоков.NET
Write() Этот метод позволяет записывать текст прямо в поток ответа. Обычно вместо него лучше применять модель элементов управления и позволять элементам управления генерировать собственную HTML-разметку. При попытке использовать метод Response.Write() вместе с моделью элементов управления разработчик лишается возможности решать, где именно на странице должен размещаться текст.
Однако метод Response.Write() важен в ситуациях, когда элементы управления, генерирующие собственное HTML-представление, должны быть построены с нуля
BinaryWrite() и WriteFile() Эти методы позволяют брать двоичное содержимое из массива байтов или файла и записывать его прямо в поток ответа. Использовать их вместе с серверными элементами управления не имеет смысла, но они могут быть очень полезны при создании специального обработчика HTTP.
Например, можно создать HTTP-обработчик, считывающий данные для PDF-документа из записи в базе данных и записывающий их непосредственно в поток ответа с помощью метода BinaryWrite(). На стороне клиента конечный результат будет выглядеть точно так же, как и если бы пользователь загружал статический PDF-файл. При выполнении записи отличного от HTML содержимого не забывайте установить соответствующее значение для свойства ContentType
Перемещение между страницами

Самой важной функцией класса HttpResponse является предоставление небольшого набора методов, которые позволяют переходить с одной страницы на другую. Наиболее универсальным из них является метод Redirect(), который позволяет перенаправлять пользователя на другую страницу. Ниже приведен пример его применения:

// Перенаправление к файлу в текущем каталоге. Response.Redirect("PageFlow.aspx"); // Перенаправление на другой веб-сайт. Response.Redirect("http://www.google.com");

Метод Redirect() требует полного цикла отправки. По сути, он отправляет браузеру сообщение, которое заставляет его запросить новую страницу.

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

Если нужно переместить пользователя на другую веб-форму внутри того же самого веб-приложения, можно воспользоваться более быстрым подходом с помощью метода Server.Transfer(). Однако этот метод обладает некоторыми особенностями. Из-за того, что перенаправление происходит на стороне сервера, в окне клиентского веб-браузера остается исходный URL-адрес. По сути, у браузера нет никакой возможности узнать, что в действительности он отображает уже другую страницу. Это ограничение приводит к возникновению проблем, когда клиент обновляет страницу или устанавливает на ней закладку.

Кроме того, метод Server.Transfer() не умеет передавать управление отличной от ASP.NET странице или веб-странице, находящейся в другом веб-приложении или на другом веб-сайте.

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

В ASP.NET 4 в классе HttpResponse появился еще один метод для перенаправления пользователя - RedirectPermanent() . Этот метод делает то же самое, что и Redirect(), т.е. отправляет браузеру сообщение о перенаправлении, указывающее на необходимость запроса новой страницы. Однако вместо кода состояния HTTP 302 (временное перенаправление) он использует код 301 (который обозначает постоянное перенаправление). Для веб-браузеров это отличие роли не играет, но для поисковых систем оно является очень важным. Когда поисковый робот исследует веб-сайт и получает код состояния 301, он обновляет каталог своей поисковой системы, занося в него информацию о новом URL-адресе.

Это значит, что методы Redirect() и RedirectPermanent() должны использоваться очень разными способами. Метод Redirect() необходимо применять для обеспечения обычной навигации и управления потоком выполнения в приложении (например, при прохождении пользователем какого-то процесса проверки), а метод RedirectPermanent() - при запросе старого URL-адреса, который поддерживался ранее, но больше не используется.

Обычно метод Redirect() будет вызываться где-то в коде веб-формы, в то время как метод RedirectPermanent() - в коде приложения, а точнее в методе Application_BeginRequest() внутри файла global.asax. Это позволит управлять всеми постоянными перенаправлениями в одном месте, не сохраняя заглушки для старых страниц. Ниже приведен пример:

Protected void Application_BeginRequest(object sender, EventArgs e) { // Веб-приложение больше не содержит страницу about.aspx if (Reguest.FilePath == "/about.aspx") { Response.RedirectPermanent("/about/about-Us.aspx"); } // (Сюда следует добавить дополнительные перенаправления.) }

Объект Server

Объект Server является экземпляром класса System.Web.HttpServerUtility и предоставляет разнообразные вспомогательные методы и свойства, которые перечислены в таблице:

Члены класса HttpServerUtility Метод или свойство Описание
MachineName Свойство, представляющее имя компьютера, на котором запускается страница. Это имя веб-сервера, используемого компьютером с целью его идентификации для остальной части сети
GetLastError() Извлекает объект исключения для самой поздней ошибки (или ссылку null, если таковая не существует). Эта ошибка должна была произойти во время обработки текущего запроса и не была обработана. Чаще всего используется в обработчике событий приложения, проверяющем сбойные ситуации
HtmlEncode() и HtmlDecode() Заменяет обычную строку строкой допустимых символов HTML (и наоборот)
UrlEncode() и UrlDecode() Заменяет обычную строку строкой допустимых символов URL (и наоборот)
MapPath() Возвращает физический путь к файлу, соответствующий определенному виртуальному пути к файлу на веб-сервере. Вызов MapPath() с указанием / возвращает физический путь к корневому каталогу веб-приложения. Также поддерживает пути, содержащие символ тильды (~), который представляет корневой каталог веб-сайта (например, ~/homepage.aspx)
Transfer() Передает выполнение другой веб-странице в текущем приложении. Этот метод похож на Response.Redirect(), но работает быстрее. Не может применяться для перемещения пользователя на сайт, расположенный на другом веб-сервере, или же на страницу, отличную от ASP.NET (такую как HTML или ASP)

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

MapPath() представляет собой еще один полезный метод объекта Server. Например, предположим, что вы хотите загрузить из текущего виртуального каталога файл по имени info.txt. Вместо того чтобы жестко кодировать путь, вы можете воспользоваться методом Server.MapPath() и с его помощью преобразовать относительный путь к своему веб-приложению в полный физический путь.

Кодирование HTML и URL

Класс Server также содержит методы, преобразующие обычные строки в представление, которое может безопасно использоваться как часть URL или отображаться на веб-странице. Например, предположим, что вы собираетесь отобразить на веб-странице следующий текст:

Тег

Используется для обозначения абзаца.

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

Тег используется для обозначения абзаца.

Текст

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


Top