ASP.NET и XHTML

Visual Studio 2010

Обновлен: Ноябрь 2007

ASP.NET позволяет создавать веб-страницы, совместимые со стандартами XHTML. XHTML является стандартом консорциума W3C, который определяет HTML как XML-документ. Создание веб-страниц, совместимых со стандартами XHTML, имеет несколько преимуществ:

  • Это гарантирует правильность формирования элементов на странице.

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

  • XHTML позволяет создавать страницы, более соответствующие стандартам специальных возможностей.

  • Язык XHTML является расширяемым и позволяет определять новые элементы.

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

Консорциум W3C содержит несколько уровней XHTML соответствия: HTML 1.0 Transitional, XHTML 1.0 Frameset, XHTML 1.0 Strict и XHTML 1.1. Спецификация XHTML 1.1 является наиболее строгой. Спецификации XHTML 1.0 Frameset и Transitional определяют разметку HTML на основе XML, но допускают некоторые широко используемые конструкции. Большинство существующих веб-страниц совместимы со спецификациями XHTML 1.0 Frameset или Transitional, но соответствуют спецификациям XHTML 1.0 Strict и XHTML 1.1 без требования значительной редакции для замены недопустимых спецификациями конструкций реализованной функциональностью.

Для получения дополнительных сведений о стандарте XHTML см. спецификацию второго издания XHTML 1.0 на сайте консорциума W3C.

XHTML определяет элементы и атрибуты более строго, чем HTML. По умолчанию вся разметка ASP.NET и серверные веб-элементы управления в составе ASP.NET теперь соответствуют стандарту XHTML 1.0 Transitional. В большинстве случаев разметка, осуществляемая ASP.NET, также соответствует стандартам XHTML 1.1. Если не указано другое, ссылки на стандарт XHTML в данном разделе означают одновременно XHTML 1.0 и XHTML 1.1.

Некоторые правила XHTML, отличающиеся от HTML:

  • Все элементы содержат явно закрывающий тег или являются самозакрывающимися (с помощью тега />).

  • Имена тегов и атрибутов отображаются в нижнем регистре, а значения атрибутов заключаются в двойные кавычки. Например, если на странице используется элемент управления GridView, то при отображении страницы элемент управления GridView создает HTML, совместимый со стандартами XHTML. Все созданные элементы явно используют открывающие и закрывающие теги (или самозакрывающиеся теги), а значения атрибутов заключены в двойные кавычки.

  • Сведения о форматировании отображаются только с помощью стилей каскадных таблиц стилей. Если страница содержит XHTML элемент DOCTYPE, элементы управления ASP.NET не отображают элементы и атрибуты font, например, bgcolor, которые не соответствуют стандартам XHTML.

  • Если элементы управления создают идентификаторы, как например, в элементах управления Repeater, GridView и других, то формат идентификаторов соответствует правилам XHTML 1.0 Transitional.

  • ASP.NET динамически добавляет атрибут action в элемент form. По умолчанию элементы form включают атрибут name, который допустим в спецификации XHTML 1.0 Transitional. Это помогает поддерживать обратную совместимость с существующими приложениями, полагающимися на клиентский сценарий, который адресует элемент form по имени формы.

    exc57y7e.alert_note(ru-ru,VS.100).gifПримечание.

    Атрибут name элемента form не допускается в правилах XHTML 1.1. Можно настроить приложение таким образом, чтобы оно не отображало атрибут name. Дополнительные сведение см. в «Управление визуализацией XHTML на страницах ASP.NET и элементах управления» далее в данном разделе.

  • Поскольку XHTML требует, чтобы все элементы были заключены в элемент-контейнер, элементы управления ASP.NET, например, элементы input, отображаются в элементах div. Это относится к разметке HTML для следующих элементов управления: TextBox, CheckBox и RadioButton. Это также касается скрытых полей, например, элемента, который используется для сохранения состояния представления данных.

  • ASP.NET кодирует символы такие как & (например, как &). Это касается URL-адресов, которые создаются для ссылок на ECMAScript и содержимое закодированных значений, таких как состояние представления.

  • Любые элементы script, отображающиеся на странице, используют соответствующий атрибут type (например, type="type/javascript") и не содержат атрибут language. Это относится к сценариям, создаваемым страницами или элементами управления, которым для выполнения обратных запросов требуются клиентский сценарий, например, HyperLink, LinkButton, Calendar и TreeView, а так же к проверяющим элементам управления, использующим методы RegisterHiddenField, RegisterStartupScript и RegisterClientScriptBlock. Созданные блоки сценария не дополняются автоматически атрибутом type.

  • Если ASP.NET отображает блоки сценариев, содержимое блоков сценариев отображается внутри комментария XML (HTML).

В некоторых случаях требуется, чтобы элементы управления ASP.NET отображали разметку в более строгом формате спецификации XHTML 1.1. По умолчанию визуализация содержит некоторую разметку, не соответствующую спецификации XHTML 1.1. Например, стандарт XHTML 1.1 запрещает использование атрибута name в HTML элементе form.

И наоборот, иногда нужно, чтобы ASP.NET отображал разметку, которая не соответствует спецификации XHTML 1.0 Transitional. Это касается случаев, когда на существующих страницах присутствуют теги или атрибуты, которые поддерживаются в более ранних версиях ASP.NET, но не соответствуют стандартам XHTML.

Существует три способа настройки веб-узла для отображения разметки:

  • Традиционный (примерно так же, как и в предыдущих версиях ASP.NET)

  • Переходный (XHTML 1.0 Transitional)

  • Строгий (XHTML 1.0 Strict)

Дополнительные сведения см. в разделе Практическое руководство. Настройка отрисовки XHTML на веб-узлах ASP.NET.

exc57y7e.alert_note(ru-ru,VS.100).gifПримечание.

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

Традиционная визуализация

При использовании традиционного отображения страницы и элементы управления ASP.NET изменяют свое отображение согласно поведению в более ранних версиях ASP.NET. К данным изменениям относится:

  • Элемент form отображается с атрибутом name.

  • ASP.NET не отображает автоматически элемент div внутри элемента form как контейнера для элементов управления.

  • Проверяющие элементы управления отображаются в виде элементов span с пользовательскими атрибутами, например, controltovalidate.

  • Элемент img не отображает атрибуты alt и src, если они явно не включены.

  • Если требуется обеспечить автоматическую отправку обратного запроса, элемент управления отобразит атрибут language (например, language="javascript").

  • Атрибут nowrap включается для элементов управления, отображающих элемент div (например, Panel), если свойство Wrap элемента управления имеет значение false.

  • Элемент управления ImageButton отображает атрибут border.

  • Все элементы br отображаются на странице как <br>. Однако, если явно включить тег <br />, страница отображает его «как есть».

  • Элементы управления DataGrid и Calendar включают атрибут bordercolor в отображаемых элементах table, если задано свойство BackColor.

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

exc57y7e.alert_note(ru-ru,VS.100).gifПримечание.

Визуальные конструкторы, например, Visual Studio обычно содержат стандартные шаблоны страниц с объявлением DOCTYPE. При использовании визуального конструктора, проверьте, что он создает новые страницы с требуемым объявлением DOCTYPE. Дополнительные сведения см. в разделах XHTML в Visual Web Developer и XHTML в Visual Web Developer.

В следующем примере показано объявление DOCTYPE, которое можно добавить на страницу.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >

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

exc57y7e.alert_note(ru-ru,VS.100).gifПримечание.

Если удалить объявление DOCTYPE, соответствие с XHTML будет утеряно. Страница не будет рассматриваться как XHTML страница и не будет ссылаться на схемы XHTML.

Большинство обозревателей также изменяют отображение страниц на основе наличия или отсутствия объявления DOCTYPE и объявления пространства имен XML. Если эти элементы присутствуют, обозреватели обычно используют стандартную визуализацию. В случае отсутствия данных элементов, большинство веб-обозревателей используют свои специфические правила отображения, которые зависят от типа веб-обозревателя (которые иногда называют отображением в «случайном» режиме), что может привести к непредсказуемому отображению.

Аналогичным образом можно контролировать тип MIME страницы. По умолчанию страница задает для типа MIME значение text/html. Однако можно переопределить тип MIME страницы, установив значению атрибута ContentType директиву @ Page, как показано в следующем примере кода.

<%@ Page Language="VB" ContentType="application/xhtml+xml" %>

<%@ Page Language="C#" ContentType="application/xhtml+xml" %>

Пример страницы ASP.NET с требуемыми элементами XHTML

В следующем примере показана простая страница ASP.NET, совместимая с XHTML.

<%@ Page Language="VB" AutoEventWireup="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<script runat="server">
Sub Button1_Click(sender As Object, e As EventArgs)
    Label1.Text = "Built at " & DateTime.Now.ToString()
End Sub

Sub listFruit_SelectedIndexChanged(sender As Object, e As EventArgs)
    Label1.Text = "You selected " & listFruit.SelectedItem.Text
End Sub
</script>

<head runat="server">
  <title>ASP.NET XHTML Page</title>
</head>

<body>
  <form id="Form1" runat="server">
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox runat="server" id="listFruit" AutoPostBack="true" 
          onselectedindexchanged="listFruit_SelectedIndexChanged">
         <asp:listitem>Apple</asp:listitem>
         <asp:listitem>Banana</asp:listitem>
         <asp:listitem>Orange</asp:listitem>
      </asp:listbox>
      </p>
      <asp:label runat="server" id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button runat="server" id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
void Button1_Click(Object sender, EventArgs e)
{
    Label1.Text = "Built at " + DateTime.Now.ToString();
}
void listFruit_SelectedIndexChanged(Object sender, EventArgs e)
{
    Label1.Text = "You selected " + listFruit.SelectedItem.Text;
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>ASP.NET XHTML Page</title>
</head>
<body>
  <form id="Form1" runat="server">
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox runat="server" id="listFruit" AutoPostBack="true" 
          onselectedindexchanged="listFruit_SelectedIndexChanged">
         <asp:listitem>Apple</asp:listitem>
         <asp:listitem>Banana</asp:listitem>
         <asp:listitem>Orange</asp:listitem>
      </asp:listbox>
      </p>
      <asp:label runat="server" id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button runat="server" id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>

Следует отметить следующее:

  • Элемент form не содержит атрибут action, поскольку атрибут action добавляется при отображении страницы.

  • Форматирующие свойства элемента управления Label будут отображаться как атрибуты style.

  • Поскольку элемент script, содержащий сценарий сервера, не отображается в веб-обозревателе, для него не требуется атрибут type.

  • Страница отображает клиентский сценарий во время выполнения для включения автоматической отправки обратного запроса элемента управления ListBox, но отображает сценарий XHTML совместимым образом.

ASP.NET не изменяет статический текст и не серверные HTML-элементы страницы. Например, веб-страницы ASP.NET могут содержать элементы управления TextBox или Button так же, как и статический текст, который добавляется между тегами <p></p>. ASP.NET может отображать XHTML для элементов управления TextBox и Button, но не может исправлять ошибки XHTML, возникающие между тегами <p></p>. При создании статического текста или HTML-элементов, убедитесь, что они являются XHTML-совместимыми. Можно проверить страницы с помощью верификации, как описано в следующем подразделе.

Неизвестные атрибуты элементов управления HTML передаются через выходной поток элемента управления и не будут верифицироваться как корректная разметка XHTML. Например, задание атрибута ID для элемента управления HtmlHead приведет к разметке, несовместимой с XHTML 1.0 Strict. Чтобы проверить разметку, используйте верификатор разметки, такой как Служба верификации разметки консорциума W3C.

После того, как веб-страницы ASP.NET созданы, можете проверить, будут ли они правильно отображать XHTML. Если страница содержит серверные веб-элементы управления ASP.NET, то ее невозможно проверить во время записи, так как элементы управления отображают XHTML только при запуске страницы.

exc57y7e.alert_note(ru-ru,VS.100).gifПримечание.

Некоторые визуальные конструкторы, например, Visual Studio могут осуществлять верификацию разметки XHTML во время разработки.

Чтобы проверить соответствие страниц спецификации XHTML, необходимо использовать службу, которая запускает страницу и проверяет выходные данные. Как правило, страницы развертывают на общедоступном сервере. Сервер может быть тестовым. Не рекомендуется делать это на рабочем сервере. Однако сервер должен быть доступен из Интернет. Затем можно использовать службу проверки, которая программно читает страницы.

Как правило, проверка выполняется с помощью службы верификации разметки консорциума W3C, которая поддерживается консорциумом Интернет. Чтобы использовать данный верификатор, введите URL-адрес страницы, которую требуется проверить. Верифицирующий узел запрашивает страницу и создает отчет со всеми найденными ошибками. Кроме того, можно сохранить код веб-страницы и отправить его в виде файла для проверки. Дополнительные сведения о данной службе проверки см. на \веб-сайте W3C.

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

Настройка возможностей веб-обозревателя для проверки разметки

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

Если отправить веб-страницу ASP.NET в службу проверки, например, в службе верификации разметки консорциума W3C, ASP.NET может отобразить версию страницы, которая не соответствуют стандартам XHTML. Это происходит потому, что проверяющая служба не сообщает о себе как об веб-обозревателе, который распознается ASP.NET, например, Internet Explorer или Mozilla. Если ASP.NET не может распознать тип веб-обозревателя, по умолчанию используется низкоуровневая разметка, которая не включает XHTML совместимые элементы и атрибуты или такие возможности, как каскадные таблицы стилей.

Можно настроить приложение для отправки правильной XHTML-совместимой разметки в службу проверки путем создания определения обозревателя для строки агента пользователя службы проверки. Например, служба верификации разметки консорциума W3C сообщает агенту пользователя о том, что начинается с «W3C_Validator». Чтобы создать определение веб-обозревателя для службы проверки W3C, необходимо в папке App_Browsers приложения создать файл с расширением BROWSER (файл с расширением BROWSER может иметь любое название) и добавить следующий элемент browsers.

<browsers>
  <browser id="W3C_Validator" parentID="default">
    <identification>
        <userAgent match="^W3C_Validator" />
    </identification>
    <capabilities>
      <capability name="browser"              value="W3C Validator" />
      <capability name="ecmaScriptVersion"    value="1.2" />
      <capability name="javascript"           value="true" />
      <capability name="supportsCss"          value="true" />
      <capability name="tables"               value="true" />
      <capability name="tagWriter" 
         value="System.Web.UI.HtmlTextWriter" />
      <capability name="w3cdomversion"        value="1.0" />
    </capabilities>
  </browser>
</browsers>

Дополнительные сведения о создании определений веб-обозревателя см. в разделе Схема файла определения веб-обозревателя (элемент browsers).

Хотя ASP.NET генерирует XHTML-совместимую разметку, некоторые элементы управления поддерживают дополнительные возможности, использование которых может привести к несовместимой разметке.

exc57y7e.alert_note(ru-ru,VS.100).gifПримечание.

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

Целевой атрибут

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

Страницы, содержащие элементы управления с установленным атрибутом target, не будет верифицироваться XHTML 1.1. Если все же требуется создать страницы, являющиеся на 100% совместимыми со стандартами XHTML 1.1, следует избегать использования параметров, таких как атрибут target, которые приводят к несовместимой разметке.

Элемент Select

Элемент управления DropDownList или ListBox можно использовать для выбора одного или нескольких элементов. Элементы управления DropDownList и ListBox отображают HTML элемент select. Если элемент управления DropDownList или ListBox не содержит ни одного элемента управления ListItem, то элемент select не содержит дочерних элементов option и не будет верифицироваться XHTML 1.1.

Показ: