Сайт о телевидении

Сайт о телевидении

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

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

The number of places where you might use or encounter the @ sign in ASP.NET has grown over the last few years and its exact purpose in all circumstances still seems to cause confusion. Here"s an overview of the most common places that it crops up, and guidance on its correct usage.

Razor Syntax

Razor was launched as a new templating syntax with the introduction of the ASP.NET Web Pages framework. A new view engine was added to MVC 3 that makes use of Razor. Razor enables mixing server-side code with HTML mark up to generate an HTML response that the framework sends to the browser. The @ sign has four uses in Razor:

  • To open a code block
  • To denote an inline expression or statement
  • To render the value of variables
  • To render single lines of content that contain plain text or unmatched HTML tags

Code blocks are sections of C# code that do not include any output to be rendered. They are usually positioned at the top of the Web Page or View and typically contain the logic for processing a page in Web Pages, or simple view-specific instructions in MVC. Code block start with the @ sign followed by an opening curly brace, and end with a closing curly brace:

@{ ViewBag.Title = "Edit" ; Layout = "~/Views/Shared/_EditLayout.cshtml" ; }

The content within the code block is standard C# code. A common mistake is to prefix variables declared within the code block with the @ sign. This is not necessary.

Inline expressions or statements are snippets of C# code appearing within HTML. Most often, these are used to make decisions on what to render based on conditions, or to iterate collections for display to the browser:

< ul > @ 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-странице, а браузер отобразит этот символ как