• Microsoft .NET
  • ASP.NET
  • Динамическая установка заголовка страницы в ASP.NET 2.0

Динамическая установка заголовка страницы в ASP.NET 2.0

Стандартный язык HTML содержит несколько элементов метаданных, которые могут быть добавлены на веб-страницу. Одним из наиболее распространенных является элемент <title>, который встречается в пределах элемента <head> и содержит название страницы. Значение элемента Title, в случае если оно указано, появляется в области заголовка окна браузера, а также является стандартным именем закладки при ее создании. Более того, многие поисковые системы отображают заголовок страницы в виде ссылки на странице результатов поиска. Для этого, с точки зрения разработчика, одной из главных задач является назначение описательного, значащего заголовка страницы. В то время как <title> может быть статически установлен  на веб-странице ASP.NET, во многих случаях заголовок зависит от отображенной на странице информации. К примеру, веб-сайт может иметь ShowProduct.aspx?ID=productID page. Вместо того чтобы использовать статический <title>, значение <title> в идеале будет названием просматриваемого товара (то есть того товара, чей ProductID равен значению productID, переданному через строку запроса). К сожалению, в ASP.NET версии 1.x установка элементов метаданных в HTML (таких как <title>) требовала от разработчика добавления элемента управления Literal в определенном месте HTML-разметки и затем программно установить его значение в классе code-behind страницы ASP.NET.

В ASP.NET 2.0, страницы могут включать в себя область <head>, чьи значения могут быть считаны и программно назначены. В данной статье мы рассмотрим, как динамически установить заголовок страницы. Мы также рассмотрим метод, который вы можете включить в класс своей мастер-страницы либо простой страницы для того, чтобы автоматически установить заголовок, основываясь на информации из карты сайта (аналогично элементу SiteMapPath). Читайте далее, чтобы узнать больше об этом!

Создание программно-доступной области <head>

Одной из главных возможностей в ASP.NET 2.0 является программно-доступная область <head>, которая может быть добавлена на страницу ASP.NET при помощи следующей разметки:

<head runat="server">
    <title>Untitled Page</title>
   
    ... other <head>-level elements ...
</head>

По умолчанию данную разметку (за исключением "... other <head>-level elements ...") Visual Studio добавляет в новую ASP.NET страницу либо мастер-страницу. Стоит отметить runat="server". Когда запрашивается ASP.NET-страница, механизм ASP.NET анализирует HTML-блок и создает иерархию элементов управления страницы. Во время данного процесса разметка, которая преобразует элементы управления серверной стороны, конвертируется в соответствующий экземпляр объекта. К примеру, во время данного процесса анализируется разметка элемента управления TextBox (<asp:TextBox runat="server" id="myTextBox" ... />) и создается экземпляр класса TextBox для последующего участия во время событий жизненного цикла страницы.

Код runat="server" указывает механизму ASP.NET на то, что определенная часть разметки является элементом управления серверной стороны относительно статического HTML. Разметка <head runat="server"> релаизована как экземпляр класса HtmlHead, который обладает свойствами, преобразованными в настройки уровня <head>, включая:

  • Title - заголовок страницы
  • Style - набор записей каскадной таблицы стилей (CSS), указанных для страницы

Для того чтобы программно получить доступ к данным строкам уровня <head>, вам необходимо убедиться, что вы добавили <head runat="server"> к вашей ASP.NET-странице или мастер-странице, если этой разметки там еще нет.

Работаем с областью <head>

Допустим, что у вас есть программно-доступная область <head> на вашей странице либо мастер-странице, вы можете программно получить доступ к ней при помощи свойства Header класса Page. К примеру, чтобы программно настроить заголовок страницы, добавьте следующую строку кода в обработчик события Page_Load:

Page.Header.Title = "The current time is:  " & DateTime.Now.ToString() 

В качестве альтернативы вы можете использовать свойство Page.Title как ссылку на Page.Header.Title. Более того, если вы используете мастер-страницы, данный код может работать либо из мастер-страницы, либо ASP.NET-страницы, которая использует мастер-страницу. В таком случае область <head> должна быть определена в мастер-странице, но ASP.NET- страница может иметь доступ посредством Page.Header.

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

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

При помощи нескольких строк мы можем создать в мастер-странице метод, который автоматически создаст и назначит соответствующий заголовок запрашиваемой страницы. При посещении пользователем стартовой страницы заголовок будет изменяться  на "Amazon.com Homepage".  Когда он посещает страницу Books, заголовок будет "Amazon.com Homepage :: Books", а когда посетит Novels - то увидит "Amazon.com Homepage :: Books :: Novels".

Чтобы реализовать это, нам нужно создать метод, который будет иметь доступ к посещаемому узлу карты сайта, и затем пройтись вверх по иерархии карты сайта пока мы не достигнем корня. Наконец, элементы Title каждого экземпляра SiteMapNode должны быть перечислены и соединены в один заголовок. Элемент SiteMapNode который преобразует текущую запрашиваемую страницу, может быть доступен посредством свойства CurrentNode класса SiteMap. Проход вверх по иерархии до корня может быть совершен при помощи свойства ParentNode, принадлежащего SiteMapNode.

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

Private Function GetPageTitleBasedOnSiteNavigation() As String
    If SiteMap.CurrentNode Is Nothing Then
        Throw New ArgumentException("currentNode cannot be Nothing")
    End If

    'Мы посещаем страницу, указанную в карте сайта - построим заголовок страницы
    'основываясь на положении узлов карты сайта в иерархии
    Dim output As String = String.Empty
    Dim currentNode As SiteMapNode = SiteMap.CurrentNode

    While currentNode IsNot Nothing
        If output.Length > 0 Then
            output = currentNode.Title & " :: " & output
        Else
            output = currentNode.Title
        End If

        currentNode = currentNode.ParentNode
    End While

    Return output
End Function

Данный метод предполагает, что SiteMap.CurrentNode не будет пустым. Данное значение может быть равно Nothing, если запрашиваемая страница не определена в карте сайта. Предполагая то, что Assuming SiteMap.CurrentNode не имеет значения, метод продвигается вверх по иерархии, обрабатывая текущий элемент Title в строковую переменную output. Как только он встретит пустой currentNode - то есть мы только что обработали корень - мы возвращаем output.

Данный метод может быть использован из обработчика события Page_Load мастер-страницы при помощи следующего кода:

'Константы, определяющие заголовок для неназванной страницы ("unnamed") 
Const DEFAULT_UNNAMED_PAGE_TITLE As String = "Untitled Page"
Const DEFAULT_PAGE_TITLE As String = "Welcome to my Website!!"

'Устанавливающие заголовок страницы , если необходимо
If String.IsNullOrEmpty(Page.Title) OrElse _
   Page.Title = DEFAULT_UNNAMED_PAGE_TITLE Then
   
    If SiteMap.CurrentNode Is Nothing Then
        Page.Title = DEFAULT_PAGE_TITLE
    Else
        Page.Title = GetPageTitleBasedOnSiteNavigation()
    End If
   
End If

Данный код всего лишь устанавливает свойство Page.Title в значение возвращаемое из GetPageTitleBasedOnSiteNavigation() в случае, если заголовок страницы еще не был установлен, либо установлен в стандартное значение Visual Studio, "Untitled Page". Тем не менее, если SiteMap.CurrentNode равняется Nothing (пусто), вместо того чтобы вызывать GetPageTitleBasedOnSiteNavigation() заголовок страницы приравнивается значению "Welcome to my Website!!" (вы можете изменить это на все что вам пожелается).

Вывод

В данной статье мы рассмотрели способ программной работы с заголовком страницы в ASP.NET 2.0. Несмотря на то, что в нашей статье это не было рассмотрено, однако элементы каскадной таблицы стилей (CSS) в пределах <head> также могут быть программно доступны при помощи той же технологии. Данная статья завершилась рассмотрением метода установки заголовка страницы, основанного на запрашиваемой странице, а также ее положение в иерархии карты сайта. Данный метод, а также полный рабочий пример приведены в конце данной статьи.

Scott Mitchell

Исходный код примеров