Поделиться через


Указание названия, метатегов и других заголовков HTML на эталонной странице (C#)

Скотт Митчелл

Загрузить PDF-файл

Рассматриваются различные методы определения различных головных <> элементов главной страницы на странице содержимого.

Введение

Новые страницы master, созданные в Visual Studio 2008, по умолчанию содержат два элемента управления ContentPlaceHolder: один с именем head и расположенный в элементе<head>, а один ContentPlaceHolder1— в веб-форме. Цель ContentPlaceHolder1 — определить регион в веб-форме, который можно настраивать постранично. ContentPlaceHolder head позволяет страницам добавлять пользовательское содержимое в <head> раздел. (Конечно, эти два ContentPlaceHolders можно изменить или удалить, а на страницу master можно добавить дополнительный ContentPlaceHolder. В настоящее время на странице Site.mastermaster имеется четыре элемента управления ContentPlaceHolder.)

Элемент HTML <head> служит репозиторием для получения сведений о документе веб-страницы, который не является частью самого документа. Сюда входят такие сведения, как заголовок веб-страницы, метаданные, используемые поисковыми системами или внутренними средствами-обходчиками, а также ссылки на внешние ресурсы, такие как RSS-каналы, JavaScript и CSS-файлы. Некоторые из этих сведений могут иметь отношение ко всем страницам веб-сайта. Например, может потребоваться глобально импортировать одни и те же правила CSS и файлы JavaScript для каждой страницы ASP.NET. Однако есть части <head> элемента, относящиеся к странице. Заголовок страницы является ярким примером.

В этом руководстве мы рассмотрим, как определить глобальную разметку и разметку разделов для конкретной <head> страницы на странице master и на ее страницах содержимого.

Изучение раздела главной<head>страницы

Файл страницы master по умолчанию, созданный Visual Studio 2008, содержит следующую разметку в своем <head> разделе:

<head runat="server">
 <title>Untitled Page</title>
 <asp:ContentPlaceHolder id="head" runat="server">
 </asp:ContentPlaceHolder>
</head>

Обратите внимание, что <head> элемент содержит runat="server" атрибут , который указывает, что он является серверным элементом управления (а не статическим HTML). Все ASP.NET страницы являются производными Page от класса , который находится в System.Web.UI пространстве имен. Этот класс содержит Header свойство, которое предоставляет доступ к региону страницы <head> . Header С помощью свойства можно задать заголовок страницы ASP.NET или добавить дополнительную разметку в отображаемый <head> раздел. Таким образом, можно настроить элемент страницы <head> содержимого, написав немного кода в обработчике событий страницы Page_Load . Мы рассмотрим, как программно задать заголовок страницы на шаге 1.

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

Помимо элемента и заголовка <title> ContentPlaceHolder, элемент страницы <head> master должен содержать любую <head>разметку уровня, общую для всех страниц. На нашем веб-сайте все страницы используют правила CSS, определенные в Styles.css файле . Следовательно, мы обновили <head> элемент в учебнике Создание макета Site-Wide с помощью главных страниц , чтобы включить соответствующий <link> элемент. Текущая Site.master<head> разметка страницы master показана ниже.

<head runat="server">
 <title>Untitled Page</title>
 <asp:ContentPlaceHolder id="head" runat="server">
 </asp:ContentPlaceHolder>
 <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>

Шаг 1. Настройка заголовка страницы содержимого

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

Примечание

По умолчанию Visual Studio задает <title> элемент на странице master значение "Без названия страница". Аналогичным образом для новых ASP.NET страниц <title> также задано значение "Без названия". Так как можно легко забыть задать для заголовка страницы соответствующее значение, в Интернете есть много страниц с заголовком "Безымянные страницы". Поиск веб-страниц Google с этим заголовком возвращает примерно 2 460 000 результатов. Даже корпорация Майкрософт подвержена публикации веб-страниц с заголовком "Безымянные страницы". На момент написания этой статьи поиск Google сообщил о 236 таких веб-страницах в Microsoft.com домене.

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

  • Путем размещения значения непосредственно в элементе <title>
  • Использование атрибута Title в директиве <%@ Page %>
  • Программное задание свойства страницы Title с помощью кода, например Page.Title="title" или Page.Header.Title="title".

Страницы содержимого не содержат <title> элемента, как это определено на странице master. Таким образом, чтобы задать заголовок страницы содержимого, можно использовать <%@ Page %> атрибут директивы Title или задать его программным способом.

Декларативное задание заголовка страницы

Заголовок страницы содержимого можно задать декларативно с помощью Title атрибута директивы<%@ Page %> . Это свойство можно задать путем непосредственного изменения директивы <%@ Page %> или с помощью окно свойств. Давайте рассмотрим оба метода.

В представлении Источник найдите директиву <%@ Page %> , которая находится в верхней части декларативной разметки страницы. Директива <%@ Page %> для Default.aspx следующего:

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>

Директива <%@ Page %> задает атрибуты страницы, используемые подсистемой ASP.NET при анализе и компиляции страницы. Сюда входят его master файл подкачки, расположение файла кода и его заголовок, а также другие сведения.

По умолчанию при создании новой страницы содержимого Visual Studio задает для атрибута Title значение Без названия Страница. Измените Default.aspxTitle атрибут с "Без названия страницы" на "Руководства по эталонным страницам", а затем просмотрите страницу в браузере. На рисунке 1 показана строка заголовка браузера, в которой отображается новый заголовок страницы.

В строке заголовка браузера теперь отображаются

Рис. 01. В строке заголовка браузера теперь отображаются "Учебники по эталонным страницам" вместо "Страница без названия"

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

Вы также можете настроить заголовок в окне свойств.

Рис. 02. Вы также можете настроить заголовок в окне свойств

Установка заголовка страницы программным способом

Разметка <head runat="server"> страницы master преобразуется в HtmlHead экземпляр класса при отрисовке страницы подсистемой ASP.NET. Класс HtmlHead имеет Title свойство , значение которого отражается в отрисовываемом элементе <title> . Это свойство доступно из класса кода программной части страницы ASP.NET через Page.Header.Title; это же свойство также можно получить через Page.Title.

Чтобы попрактиковаться в настройке заголовка страницы программным способом, перейдите к классу About.aspx кода программной части страницы и создайте обработчик события страницы Load . Затем задайте для заголовка страницы значение "Учебники по эталонным страницам :: О программе :: дата", где date — это текущая дата. После добавления этого кода Page_Load обработчик событий должен выглядеть примерно так:

protected void Page_Load(object sender, EventArgs e)
{
    Page.Title = string.Format("Master Page Tutorials :: About :: {0:d}", DateTime.Now);
}

На рисунке 3 показана строка заголовка браузера при посещении About.aspx страницы.

Заголовок страницы устанавливается программным способом и включает текущую дату

Рис. 03. Заголовок страницы задается программным способом и включает текущую дату

Шаг 2. Автоматическое назначение заголовка страницы

Как мы видели на шаге 1, заголовок страницы можно задать декларативно или программно. Однако если вы забудете явно изменить заголовок на более описательное, страница будет иметь заголовок по умолчанию "Безымянные страницы". В идеале заголовок страницы задается автоматически в том случае, если мы не указываем его значение явным образом. Например, если во время выполнения заголовок страницы — "Страница без названия", может потребоваться, чтобы заголовок автоматически обновлялся, чтобы он совпадал с именем файла ASP.NET страницы. Хорошей новостью является то, что с немного авансовой работы можно иметь название автоматически назначено.

Все ASP.NET веб-страницы являются производными Page от класса в System.Web.UI пространстве имен. Класс Page определяет минимальные функциональные возможности, необходимые странице ASP.NET, и предоставляет основные свойства, такие как IsPostBack, IsValid, Requestи Response, среди многих других. Часто для каждой страницы в веб-приложении требуются дополнительные функции или функции. Распространенным способом предоставления этого является создание пользовательского класса базовой страницы. Настраиваемый базовый класс страницы — это класс, который является производным от Page класса и включает дополнительные функциональные возможности. После создания этого базового класса вы можете получить наследование страниц ASP.NET от него (а не Page класса ), тем самым предлагая расширенные функциональные возможности для ASP.NET страниц.

На этом шаге мы создадим базовую страницу, которая автоматически задает для заголовка страницы имя файла ASP.NET страницы, если заголовок не был задан явным образом. В шаге 3 рассматривается настройка заголовка страницы на основе карты сайта.

Примечание

Тщательное изучение создания и использования пользовательских классов базовых страниц выходит за рамки область этой серии учебников.

Создание класса базовой страницы

Наша первая задача — создать базовый класс страницы, который является классом, расширяющим Page класс . Начните с добавления App_Code папки в проект, щелкнув правой кнопкой мыши имя проекта в Обозреватель решений, выберите Добавить ASP.NET папку, а затем выберите App_Code. Затем щелкните правой кнопкой мыши папку App_Code и добавьте новый класс с именем BasePage.cs. На рисунке 4 показана Обозреватель решений после App_Code добавления папки и BasePage.cs класса.

Добавление папки App_Code и класса BasePage

Рис. 04. Добавление App_Code папки и класса с именем BasePage

Примечание

Visual Studio поддерживает два режима управления проектами: проекты веб-сайтов и проекты веб-приложений. Папка App_Code предназначена для использования с моделью проекта веб-сайта. Если вы используете модель проекта веб-приложения, поместите BasePage.cs класс в папку с именем, отличной от App_Code, например Classes. Дополнительные сведения по этой теме см. в статье Перенос проекта веб-сайта в проект веб-приложения.

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

public class BasePage : System.Web.UI.Page
{

}

Каждый раз, когда запрашивается ASP.NET страница, она проходит через ряд этапов, кульминацией которых является отрисовка запрошенной страницы в ФОРМАТЕ HTML. Мы можем перейти к этапу, переопределив Page метод класса OnEvent . Для нашей базовой страницы давайте автоматически задаем заголовок, если он не был явно указан этапом LoadComplete (который, как вы могли догадаться, происходит после Load этапа).

Для этого переопределите OnLoadComplete метод и введите следующий код:

protected override void OnLoadComplete(EventArgs e)
{
    // Set the page's title, if necessary
    if (string.IsNullOrEmpty(Page.Title) || Page.Title == "Untitled Page")
    {
        // Determine the filename for this page
        string fileName = System.IO.Path.GetFileNameWithoutExtension(Request.PhysicalPath);

        Page.Title = fileName;
    }

    base.OnLoadComplete(e);
}

Метод OnLoadComplete начинается с определения, не задано ли Title свойство явным образом. Title Если свойство имеет nullзначение , пустую строку или имеет значение "Безымянная страница", оно присваивается имени файла запрошенной страницы ASP.NET. Физический путь к запрошенной странице ASP.NET , C:\MySites\Tutorial03\Login.aspxнапример, доступен через Request.PhysicalPath свойство . Метод Path.GetFileNameWithoutExtension используется для извлечения только части имени файла, а затем это имя файла присваивается свойству Page.Title .

Примечание

Я предлагаю вам улучшить эту логику, чтобы улучшить формат заголовка. Например, если имя файла страницы — Company-Products.aspx, приведенный выше код создаст заголовок "Company-Products", но в идеале дефис будет заменен пробелом, как в разделе "Продукты компании". Кроме того, рекомендуется добавлять пробел всякий раз, когда происходит изменение варианта. То есть рекомендуется добавить код, преобразующий имя OurBusinessHours.aspx файла в название "Наши рабочие часы".

Наследование страниц содержимого от класса базовой страницы

Теперь нам нужно обновить страницы ASP.NET на нашем сайте, чтобы они стали производными от пользовательской базовой Page страницы (BasePage) вместо класса . Для этого перейдите к каждому классу кода программной части и измените объявление класса с:

public partial class ClassName : System.Web.UI.Page

В:

public partial class ClassName : BasePage

После этого посетите сайт через браузер. При посещении страницы, название которой явно задано, например Default.aspx или About.aspx, используется явно указанный заголовок. Однако если вы посещаете страницу, заголовок которой не был изменен по сравнению со значением по умолчанию ("Страница без названия"), базовый класс страницы задает для заголовка имя файла страницы.

На рисунке 5 показана MultipleContentPlaceHolders.aspx страница при просмотре в браузере. Обратите внимание, что заголовок — это имя файла страницы (за вычетом расширения) MultipleContentPlaceHolders.

Если заголовок не указан явно, имя файла страницы используется автоматически.

Рис. 05. Если заголовок не указан явно, имя файла страницы используется автоматически (щелкните для просмотра полноразмерного изображения)

Шаг 3. Создание заголовка страницы на карте сайта

ASP.NET предлагает надежную платформу карты сайта, которая позволяет разработчикам страниц определять иерархическую карту сайта во внешнем ресурсе (например, в XML-файле или таблице базы данных), а также веб-элементы управления для отображения сведений о карте сайта (например, элементы управления SiteMapPath, Menu и TreeView).

Доступ к структуре карты сайта также можно получить программным способом из класса кода программной части страницы ASP.NET. Таким образом можно автоматически задать заголовок страницы в качестве заголовка соответствующего узла на карте сайта. Давайте улучшаем класс, созданный на BasePage шаге 2, чтобы он предлагал эту функцию. Но сначала необходимо создать карту сайта для нашего сайта.

Примечание

В этом руководстве предполагается, что читатель уже знаком с ASP. Функции карты сайта NET. Дополнительные сведения об использовании карты сайта см. в моей многокомпонентной серии статей Изучение ASP. Навигация сайта NET.

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

Система карты сайта построена на основе модели поставщика, которая отделяет API карты сайта от логики, которая сериализует сведения карты сайта между памятью и постоянным хранилищем. Платформа .NET Framework поставляется с классомXmlSiteMapProvider , который является поставщиком карты сайта по умолчанию. Как следует из названия, XmlSiteMapProvider в качестве хранилища карт сайта используется XML-файл. Давайте используем этот поставщик для определения карты сайта.

Начните с создания файла карты сайта в корневой папке веб-сайта с именем Web.sitemap. Для этого щелкните правой кнопкой мыши имя веб-сайта в Обозреватель решений, выберите Добавить новый элемент и выберите шаблон Карта сайта. Убедитесь, что файл имеет имя Web.sitemap , и нажмите кнопку Добавить.

Добавление файла с именем Web.sitemap в корневую папку веб-сайта

Рис. 06. Добавление файла с именем Web.sitemap в корневую папку веб-сайта (щелкните для просмотра полноразмерного изображения)

Добавьте следующий XML-код в Web.sitemap файл:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
 <siteMapNode url="~/Default.aspx" title="Home">
 <siteMapNode url="~/About.aspx" title="About the Author" />
 <siteMapNode url="~/MultipleContentPlaceHolders.aspx" title="Using Multiple ContentPlaceHolder Controls" />
 </siteMapNode>
</siteMap>

Этот XML-код определяет иерархическую структуру карты сайта, показанную на рис. 7.

Карта сайта в настоящее время состоит из трех узлов карты сайта

Рис. 07. Карта сайта в настоящее время состоит из трех узлов карты сайта

Мы будем обновлять структуру карты сайта в будущих руководствах по мере добавления новых примеров.

Обновление главной страницы для включения веб-элементов управления навигацией

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

Примечание

Элемент управления ListView является новым для ASP.NET версии 3.5. Если вы используете более рановую версию ASP.NET, используйте вместо него элемент управления Repeater.

Начните с удаления существующей разметки неупорядоченного списка из раздела Уроки. Затем перетащите элемент управления ListView с панели элементов и под заголовком Уроки. ListView находится в разделе Данные панели элементов вместе с другими элементами управления представлениями: GridView, DetailsView и FormView. Присвойте свойству Идентификатор ListView значение LessonsList.

В мастере настройки источника данных выберите привязку ListView к новому элементу управления SiteMapDataSource с именем LessonsDataSource. Элемент управления SiteMapDataSource возвращает иерархическую структуру из системы карты сайта.

Привязка элемента управления SiteMapDataSource к элементу управления LessonsList ListView

Рис. 08. Привязка элемента управления SiteMapDataSource к элементу LessonsList управления ListView (щелкните для просмотра полноразмерного изображения)

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

<asp:ListView ID="LessonsList" runat="server" DataSourceID="LessonsDataSource">
 <LayoutTemplate>
 <ul>
 <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
 </ul>
 </LayoutTemplate>
 
 <ItemTemplate>
 <li><asp:HyperLink runat="server" ID="lnkLesson" NavigateUrl='<%# Eval("Url") %>'
 Text='<%# Eval("Title") %>' /></li>
 </ItemTemplate>
</asp:ListView>

создает LayoutTemplate разметку для неупорядоченного списка (<ul>...</ul>), в то время как ItemTemplate отображает каждый элемент, возвращенный SiteMapDataSource, как элемент списка (<li>), содержащий ссылку на конкретный урок.

После настройки шаблонов ListView посетите веб-сайт. Как показано на рисунке 9, раздел Уроки содержит один маркированный элемент Home. Где находятся уроки About и Using Multiple ContentPlaceHolder Controls? SiteMapDataSource предназначен для возврата иерархического набора данных, но элемент управления ListView может отображать только один уровень иерархии. Следовательно, отображается только первый уровень узлов карты сайта, возвращаемых SiteMapDataSource.

Раздел

Рис. 09. Раздел "Уроки" содержит один элемент списка (щелкните для просмотра полноразмерного изображения)

Чтобы отобразить несколько уровней, можно вложить несколько ListView в ItemTemplate. Этот метод был рассмотрен в руководстве по эталонным страницам и навигации по сайтусерии учебников по работе с данными. Однако для этой серии учебников наша карта сайта будет содержать только два уровня: Home (верхний уровень); и каждый урок, как ребенок Дома. Вместо создания вложенного элемента ListView можно указать SiteMapDataSource не возвращать начальный узел, задав для его ShowStartingNode свойства значение false. Результатом является то, что SiteMapDataSource начинается с возврата второго уровня узлов карты сайта.

После этого изменения ListView отображает маркированные элементы для уроков About и Using Multiple ContentPlaceHolder Controls, но пропускает маркированный элемент для Home. Чтобы устранить эту проблему, мы можем явно добавить маркированный элемент для Home в LayoutTemplate:

<LayoutTemplate>
 <ul>
 <li><asp:HyperLink runat="server" ID="lnkLesson"
 NavigateUrl="~/Default.aspx" Text="Home" /></li>
 <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
 </ul>
</LayoutTemplate>

После настройки SiteMapDataSource пропуска начального узла и явного добавления маркированного элемента Home раздел Уроки теперь отображает нужные выходные данные.

Раздел

Рис. 10. Раздел "Уроки" содержит маркированный элемент для домашнего и каждого дочернего узла (щелкните для просмотра полноразмерного изображения)

Задание заголовка на основе карты сайта

Используя карту сайта, мы можем обновить класс BasePage для использования заголовка, указанного в карте сайта. Как и в шаге 2, мы хотим использовать заголовок узла карты сайта, только если заголовок страницы не был явно задан разработчиком страницы. Если запрашиваемая страница не имеет явно заданного заголовка страницы и не найдена в карте сайта, мы вернемся к использованию имени файла запрошенной страницы (за вычетом расширения), как это было в шаге 2. На рисунке 11 показан этот процесс принятия решений.

При отсутствии явно заданного заголовка страницы используется заголовок соответствующего узла карты сайта.

Рис. 11. При отсутствии явно заданного заголовка страницы используется заголовок соответствующего узла карты сайта

Обновите BasePage метод класса, OnLoadComplete включив в него следующий код:

protected override void OnLoadComplete(EventArgs e)
{
    // Set the page's title, if necessary
    if (string.IsNullOrEmpty(Page.Title) || Page.Title == "Untitled Page")
    {
        // Is this page defined in the site map?
        string newTitle = null;

        SiteMapNode current = SiteMap.CurrentNode;
        if (current != null)
        {
            newTitle = current.Title;
        }
        else
        {
            // Determine the filename for this page
            newTitle = System.IO.Path.GetFileNameWithoutExtension(Request.PhysicalPath);
        }

        Page.Title = newTitle;
    }

    base.OnLoadComplete(e);
}

Как и OnLoadComplete ранее, метод начинается с определения того, задан ли заголовок страницы явным образом. Если Page.Title имеет значение null, пустая строка или присваивается значение Untitled Page, то код автоматически присваивает значение Page.Title.

Чтобы определить используемый заголовок, код начинается с ссылки на SiteMap свойство классаCurrentNode. CurrentNodeSiteMapNode возвращает экземпляр в карте сайта, соответствующий текущей запрошенной странице. При условии, что запрошенная в данный момент страница найдена Title в карте сайта, свойству SiteMapNodeприсваивается заголовок страницы. Если запрошенная в данный момент страница не находится на карте сайта, CurrentNode возвращается null и имя файла запрошенной страницы используется в качестве заголовка (как это было сделано на шаге 2).

На рисунке 12 показана MultipleContentPlaceHolders.aspx страница при просмотре в браузере. Так как заголовок этой страницы не задан явным образом, вместо него используется заголовок соответствующего узла карты сайта.

Заголовок страницы MultipleContentPlaceHolders.aspx извлекается из карты сайта

Рис. 12. Заголовок MultipleContentPlaceHolders.aspx страницы извлекается из карты сайта

Шаг 4. Добавление других Page-Specific разметки в<head>раздел

В шагах 1, 2 и 3 была выполнена <title> настройка элемента постранично. В дополнение к разделу <head><title>могут содержаться <meta> элементы и <link> . Как отмечалось ранее в этом руководстве, Site.masterраздел содержит <link> элемент для Styles.css.<head> Так как этот <link> элемент определен на странице master, он включается в <head> раздел для всех страниц содержимого. Но как добавлять <meta> элементы и <link> на постраничной основе?

Самый простой способ добавить содержимое конкретной страницы в <head> раздел — создать элемент управления ContentPlaceHolder на странице master. У нас уже есть такой Объект ContentPlaceHolder (с именем head). Поэтому, чтобы добавить пользовательскую <head> разметку, создайте соответствующий элемент управления Содержимое на странице и поместите на нее разметку.

Чтобы проиллюстрировать добавление пользовательской <head> разметки на страницу, давайте добавим <meta> элемент описания в текущий набор страниц содержимого. Элемент <meta> description предоставляет краткое описание веб-страницы. Большинство поисковых систем используют эту информацию в той или иной форме при отображении результатов поиска.

Элемент <meta> description имеет следующую форму:

<meta name="description" content="description of the web page" />

Чтобы добавить эту разметку на страницу содержимого, добавьте приведенный выше текст в элемент управления Контент, который сопоставляется с заголовком ContentPlaceHolder master страницы. Например, чтобы определить <meta> элемент описания для Default.aspx, добавьте следующую разметку:

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
 <meta name="description" content="Welcome to Scott Mitchell's Master Page Tutorials series." />
</asp:Content>

Так как заголовок ContentPlaceHolder не находится в тексте HTML-страницы, разметка, добавленная в элемент управления Содержимое, не отображается в представлении конструктора. Чтобы просмотреть элемент описания, <meta> посетите Default.aspx страницу в браузере. После загрузки страницы просмотрите источник и обратите внимание, что <head> раздел содержит разметку, указанную в элементе управления Контент.

Удаляйте время, чтобы добавить <meta> элементы описания в About.aspx, MultipleContentPlaceHolders.aspxи Login.aspx.

Программное добавление разметки в<head>регион

Заголовок ContentPlaceHolder позволяет декларативно добавлять пользовательскую разметку в регион master страницы<head>. Пользовательская разметка также может быть добавлена программным способом. Помните, что Page свойство класса Header возвращает экземпляр, определенный HtmlHead на странице master ().<head runat="server">

Возможность программного добавления содержимого в <head> регион полезна, если добавляемый контент является динамическим. Возможно, это зависит от того, что пользователь посещает страницу; Может быть, он извлекается из базы данных. Независимо от причины, вы можете добавить содержимое в , HtmlHead добавив элементы управления в его коллекцию Controls следующим образом:

// Programmatically add a <meta> element to the Header
HtmlMeta keywords = new HtmlMeta();
keywords.Name = "keywords";
keywords.Content = "master page,asp.net,tutorial";

Page.Header.Controls.Add(keywords);

Приведенный выше код добавляет <meta> элемент keywords в <head> область, которая предоставляет разделенный запятыми список ключевых слов, описывающих страницу. Обратите внимание, что для добавления тега <meta> необходимо создать HtmlMeta экземпляр, задать его Name свойства и Content , а затем добавить его в HeaderControls коллекцию . Аналогичным образом, чтобы программно добавить <link> элемент, создайте HtmlLink объект, задайте его свойства, а затем добавьте его в HeaderControls коллекцию .

Примечание

Чтобы добавить произвольную LiteralControl разметку, создайте экземпляр, задайте его Text свойство, а затем добавьте его в ControlsHeaderколлекцию .

Сводка

В этом руководстве мы рассмотрели различные способы добавления <head> разметки региона постранично. Страница master должна содержать HtmlHead экземпляр (<head runat="server">) с ContentPlaceHolder. Экземпляр HtmlHead позволяет страницам содержимого программно обращаться к <head> региону и декларативно и программно задавать заголовок страницы. Элемент управления ContentPlaceHolder позволяет декларативно добавлять настраиваемую разметку в <head> раздел с помощью элемента управления Контент.

Счастливое программирование!

Дополнительные материалы

Дополнительные сведения по темам, рассматриваемым в этом руководстве, см. в следующих ресурсах:

Об авторе

Скотт Митчелл (Scott Mitchell), автор нескольких книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 3,5 в 24 часа. Скотт можно связаться по адресу mitchell@4GuysFromRolla.com или через его блог по адресу http://ScottOnWriting.NET.

Отдельная благодарность

Эта серия учебников была проверена многими полезными рецензентами. В этом руководстве были ведущие рецензенты Зак Джонс (Zack Jones) и Suchi Banerjee (Сучи Банерджи). Хотите ознакомиться с моими предстоящими статьями MSDN? Если да, опустите мне строку в mitchell@4GuysFromRolla.com.