Freigeben über


Angeben des Titels, der META-Tags und anderer HTML-Header auf der Masterseite (VB)

von Scott Mitchell

PDF herunterladen

Untersucht verschiedene Techniken zum Definieren von sortierten <Kopfelementen> in der Gestaltungsvorlage von der Inhaltsseite.

Einführung

Neue master Seiten, die in Visual Studio 2008 erstellt wurden, verfügen standardmäßig über zwei ContentPlaceHolder-Steuerelemente: eines mit dem <head> Namen headund befindet sich im Element; und eines namens ContentPlaceHolder1, das im Webformular platziert ist. Der Zweck von ContentPlaceHolder1 besteht darin, eine Region im Webformular zu definieren, die seitenweise angepasst werden kann. Mit head ContentPlaceHolder können Seiten dem <head> Abschnitt benutzerdefinierte Inhalte hinzufügen. (Natürlich können diese beiden ContentPlaceHolders geändert oder entfernt werden, und der master Seite kann zusätzliche ContentPlaceHolder hinzugefügt werden. Unsere master Seite enthält Site.masterderzeit vier ContentPlaceHolder-Steuerelemente.)

Das HTML-Element <head> dient als Repository für Informationen zum Webseitendokument, das nicht Teil des Dokuments selbst ist. Dies umfasst Informationen wie den Titel der Webseite, Metainformationen, die von Suchmaschinen oder internen Crawlern verwendet werden, und Links zu externen Ressourcen, z. B. RSS-Feeds, JavaScript- und CSS-Dateien. Einige dieser Informationen können für alle Seiten der Website relevant sein. Sie können beispielsweise die gleichen CSS-Regeln und JavaScript-Dateien für jede ASP.NET Seite global importieren. Es gibt jedoch Teile des Elements, die <head> seitenspezifisch sind. Der Seitentitel ist ein Paradebeispiel.

In diesem Tutorial wird untersucht, wie sie globales und seitenspezifisches <head> Abschnittsmarkup auf der master Seite und in den zugehörigen Inhaltsseiten definieren.

Untersuchen des Abschnitts der Gestaltungsvorlage<head>

Die standardmäßige master Seitendatei, die von Visual Studio 2008 erstellt wurde, enthält das folgende Markup in ihrem <head> Abschnitt:

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

Beachten Sie, dass das <head> Element ein runat="server" -Attribut enthält, das angibt, dass es sich um ein Serversteuerelement (anstelle von statischem HTML) handelt. Alle ASP.NET Seiten stammen von der Page -Klasse ab, die sich im System.Web.UI Namespace befindet. Diese Klasse enthält eine Header Eigenschaft , die den Zugriff auf die Region der Seite <head> ermöglicht. Mithilfe der Header -Eigenschaft können wir den Titel einer ASP.NET Seite festlegen oder dem gerenderten <head> Abschnitt zusätzliches Markup hinzufügen. Es ist dann möglich, das Element einer Inhaltsseite <head> anzupassen, indem ein wenig Code in den Ereignishandler der Seite Page_Load geschrieben wird. Wir untersuchen, wie Sie den Titel der Seite in Schritt 1 programmgesteuert festlegen.

Das im <head> obigen Element gezeigte Markup enthält auch ein ContentPlaceHolder-Steuerelement mit dem Namen head. Dieses ContentPlaceHolder-Steuerelement ist nicht erforderlich, da Inhaltsseiten dem <head> Element programmgesteuert benutzerdefinierte Inhalte hinzufügen können. Dies ist jedoch nützlich, wenn eine Inhaltsseite dem <head> Element statisches Markup hinzufügen muss, da das statische Markup dem entsprechenden Content-Steuerelement deklarativ und nicht programmgesteuert hinzugefügt werden kann.

Zusätzlich zum <title> Element und head ContentPlaceHolder sollte das Element der master Seite <head> jedes <head>Markup auf -Ebene enthalten, das allen Seiten gemeinsam ist. Auf unserer Website verwenden alle Seiten die in der Datei definierten CSS-Regeln Styles.css . Daher haben wir das <head> -Element im Tutorial Erstellen eines Site-Wide Layouts mit Gestaltungsvorlagen aktualisiert, um ein entsprechendes <link> Element einzuschließen. Das aktuelle <head> Markup unserer Site.master master Seite ist unten dargestellt.

<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>

Schritt 1: Festlegen des Titels einer Inhaltsseite

Der Titel der Webseite wird über das <title> -Element angegeben. Es ist wichtig, den Titel jeder Seite auf einen entsprechenden Wert festzulegen. Wenn Sie eine Seite besuchen, wird ihr Titel in der Titelleiste des Browsers angezeigt. Darüber hinaus verwenden Browser beim Lesezeichen einer Seite den Titel der Seite als vorgeschlagenen Namen für das Lesezeichen. Außerdem zeigen viele Suchmaschinen den Titel der Seite an, wenn Suchergebnisse angezeigt werden.

Hinweis

Standardmäßig legt Visual Studio das <title> Element auf der master Seite auf "Unbetitelte Seite" fest. In ähnlicher Weise ist <title> für neue ASP.NET Seiten auch "Unbenannte Seite" festgelegt. Da es leicht sein kann, den Titel der Seite auf einen entsprechenden Wert festzulegen, gibt es viele Seiten im Internet mit dem Titel "Unbetitelte Seite". Die Suche bei Google nach Webseiten mit diesem Titel liefert ungefähr 2.460.000 Ergebnisse. Selbst Microsoft ist anfällig für die Veröffentlichung von Webseiten mit dem Titel "Unbenannte Seite". Zum Zeitpunkt dieses Schreibens meldete eine Google-Suche 236 solcher Webseiten in der Microsoft.com Domäne.

Eine ASP.NET Seite kann ihren Titel auf eine der folgenden Arten angeben:

  • Durch direktes Platzieren des Werts <title> im Element
  • Verwenden des Title Attributs in der <%@ Page %> -Anweisung
  • Programmgesteuertes Title Festlegen der Eigenschaft der Seite mithilfe von Code wie Page.Title="title" oder Page.Header.Title="title".

Inhaltsseiten verfügen nicht über ein <title> Element, wie es auf der master-Seite definiert ist. Daher können Sie zum Festlegen des Titels einer Inhaltsseite entweder das Attribut der <%@ Page %> Direktive Title verwenden oder sie programmgesteuert festlegen.

Deklaratives Festlegen des Seitentitels

Der Titel einer Inhaltsseite kann über das Attribut der Title<%@ Page %> Direktive deklarativ festgelegt werden. Diese Eigenschaft kann durch direktes Ändern der <%@ Page %> Direktive oder über die Eigenschaftenfenster festgelegt werden. Sehen wir uns beide Ansätze an.

Suchen Sie in der Quellansicht nach der <%@ Page %> Direktive, die sich oben im deklarativen Markup der Seite befindet. Die <%@ Page %> Anweisung für Default.aspx folgt:

<%@ Page Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" Title="Untitled Page" %>

Die <%@ Page %> -Anweisung gibt seitenspezifische Attribute an, die vom ASP.NET-Engine beim Analysieren und Kompilieren der Seite verwendet werden. Dies umfasst unter anderem die master Seitendatei, den Speicherort der Codedatei und den Titel.

Beim Erstellen einer neuen Inhaltsseite legt Visual Studio das Title Attribut standardmäßig auf "Unbetitelte Seite" fest. Ändern Sie Default.aspxdas Attribut von "Unbenannte Seite" in "Gestaltungsvorlagen-Tutorials Title ", und zeigen Sie die Seite dann über einen Browser an. Abbildung 1 zeigt die Titelleiste des Browsers, die den neuen Seitentitel widerspiegelt.

Die Titelleiste des Browsers zeigt jetzt

Abbildung 01: Die Titelleiste des Browsers zeigt jetzt "Gestaltungsvorlagen-Tutorials" anstelle von "Unbetitelte Seite" an.

Der Titel der Seite kann auch über die Eigenschaftenfenster festgelegt werden. Wählen Sie in der Eigenschaftenfenster in der Dropdownliste DOKUMENT aus, um die Eigenschaften auf Seitenebene zu laden, die die Title -Eigenschaft enthalten. Abbildung 2 zeigt die Eigenschaftenfenster, nachdem Title auf "Gestaltungsvorlagen-Tutorials" festgelegt wurde.

Sie können den Titel auch über das Eigenschaftenfenster konfigurieren.

Abbildung 02: Sie können den Titel auch über das Eigenschaftenfenster konfigurieren.

Programmgesteuertes Festlegen des Seitentitels

Das Markup der <head runat="server"> master Seite wird in eine HtmlHead Klasse instance übersetzt, wenn die Seite von der ASP.NET-Engine gerendert wird. Die HtmlHead -Klasse verfügt über eine Title Eigenschaft , deren Wert im gerenderten Element widerspiegelt <title> wird. Auf diese Eigenschaft kann über die CodeBehind-Klasse Page.Header.Titleeiner ASP.NET Seite zugegriffen werden. Auf diese Eigenschaft kann auch über Page.Titlezugegriffen werden.

Um das programmgesteuerte Festlegen des Seitentitels zu üben, navigieren Sie zur CodeBehind-Klasse der About.aspx Seite, und erstellen Sie einen Ereignishandler für das Ereignis der Seite Load . Legen Sie als Nächstes den Titel der Seite auf "Masterseiten-Tutorials :: About :: date" fest, wobei date das aktuelle Datum ist. Nach dem Hinzufügen dieses Codes sollte Ihr Page_Load Ereignishandler wie folgt aussehen:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 Page.Title = String.Format("Master Page Tutorials :: About :: {0:d}", DateTime.Now)
End Sub

Abbildung 3 zeigt die Titelleiste des Browsers beim Besuch der About.aspx Seite.

Der Titel der Seite ist programmgesteuert festgelegt und enthält das aktuelle Datum.

Abbildung 03: Der Titel der Seite ist programmgesteuert festgelegt und enthält das aktuelle Datum.

Schritt 2: Automatisches Zuweisen eines Seitentitels

Wie wir in Schritt 1 gesehen haben, kann der Titel einer Seite deklarativ oder programmgesteuert festgelegt werden. Wenn Sie jedoch vergessen, den Titel explizit in etwas aussagekräftiger zu ändern, hat Ihre Seite den Standardtitel "Unbenannte Seite". Im Idealfall wird der Titel der Seite automatisch für uns festgelegt, falls wir den Wert nicht explizit angeben. Wenn der Titel der Seite beispielsweise zur Laufzeit "Unbenannte Seite" lautet, sollte der Titel automatisch mit dem Dateinamen der ASP.NET Seite aktualisiert werden. Die gute Nachricht ist, dass mit ein wenig Vorabarbeit möglich ist, dass der Titel automatisch zugewiesen wird.

Alle ASP.NET Webseiten werden von der Page -Klasse im System.Web.UI-Namespace abgeleitet. Die Page -Klasse definiert die minimale Funktionalität, die von einer ASP.NET Seite benötigt wird, und macht wichtige Eigenschaften wie IsPostBack, IsValid, Requestund Responseverfügbar. Häufig erfordert jede Seite in einer Webanwendung zusätzliche Features oder Funktionen. Eine gängige Möglichkeit, dies bereitzustellen, besteht darin, eine benutzerdefinierte Basisseitenklasse zu erstellen. Eine benutzerdefinierte Basisseitenklasse ist eine von Ihnen erstellte Klasse, die von der Page -Klasse abgeleitet wird und zusätzliche Funktionen enthält. Sobald diese Basisklasse erstellt wurde, können Sie ihre ASP.NET Seiten (anstelle der Page -Klasse) ableiten lassen, wodurch Sie Ihren ASP.NET Seiten die erweiterte Funktionalität bieten.

In diesem Schritt erstellen wir eine Basisseite, die den Titel der Seite automatisch auf den Dateinamen der ASP.NET Seite festlegt, wenn der Titel nicht explizit festgelegt wurde. Schritt 3 befasst sich mit dem Festlegen des Titels der Seite basierend auf der Siteübersicht.

Hinweis

Eine gründliche Untersuchung des Erstellens und Verwendens benutzerdefinierter Basisseitenklassen sprengt den Rahmen dieser Tutorialreihe.

Erstellen der Basisseitenklasse

Unsere erste Aufgabe besteht darin, eine Basisseitenklasse zu erstellen, bei der es sich um eine Klasse handelt, die die Page Klasse erweitert. Beginnen Sie mit dem Hinzufügen eines Ordners App_Code zu Ihrem Projekt, indem Sie mit der rechten Maustaste auf den Projektnamen im Projektmappen-Explorer klicken, ASP.NET Ordner hinzufügen und dann auswählenApp_Code. Klicken Sie als Nächstes mit der rechten Maustaste auf den App_Code Ordner, und fügen Sie eine neue Klasse mit dem Namen hinzu BasePage.vb. Abbildung 4 zeigt die Projektmappen-Explorer, nachdem der Ordner und BasePage.vb die App_Code Klasse hinzugefügt wurden.

Hinzufügen eines App_Code-Ordners und einer Klasse mit dem Namen BasePage

Abbildung 04: Hinzufügen eines Ordners App_Code und einer Klasse mit dem Namen BasePage

Hinweis

Visual Studio unterstützt zwei Arten der Projektverwaltung: Websiteprojekte und Webanwendungsprojekte. Der App_Code Ordner ist für die Verwendung mit dem Websiteprojektmodell konzipiert. Wenn Sie das Webanwendungsprojektmodell verwenden, platzieren Sie die BasePage.vb -Klasse in einem anderen Ordner mit App_Codedem Namen , z. B Classes. . Weitere Informationen zu diesem Thema finden Sie unter Migrieren eines Websiteprojekts zu einem Webanwendungsprojekt.

Da die benutzerdefinierte Basisseite als Basisklasse für codebehind-Klassen ASP.NET Seiten dient, muss sie die Page -Klasse erweitern.

Public Class BasePage
 Inherits System.Web.UI.Page

End Class

Wenn eine ASP.NET Seite angefordert wird, wird eine Reihe von Phasen durchlaufen, die in der Gerenderung der angeforderten Seite in HTML enden. Wir können auf eine Phase tippen, indem wir die -Methode der Page -Klasse OnEvent überschreiben. Für unsere Basisseite legen wir den Titel automatisch fest, wenn er nicht explizit von der LoadComplete Phase angegeben wurde (was, wie Sie vielleicht erraten haben, nach der Load Phase auftritt).

Um dies zu erreichen, überschreiben Sie die OnLoadComplete -Methode, und geben Sie den folgenden Code ein:

Protected Overrides Sub OnLoadComplete(ByVal e As EventArgs)
 ' Set the page's title, if necessary
 If String.IsNullOrEmpty(Page.Title) OrElse Page.Title = "Untitled Page" Then
 ' Determine the filename for this page
 Dim fileName As String = System.IO.Path.GetFileNameWithoutExtension(Request.PhysicalPath)

 Page.Title = fileName
 End If

 MyBase.OnLoadComplete(e)
End Sub

Die OnLoadComplete Methode bestimmt zunächst, ob die Title Eigenschaft noch nicht explizit festgelegt wurde. Wenn die Title -Eigenschaft eine leere Zeichenfolge ist Nothingoder den Wert "Unbenannte Seite" aufweist, wird sie dem Dateinamen der angeforderten ASP.NET Seite zugewiesen. Auf den physischen Pfad zur angeforderten ASP.NET Seite - C:\MySites\Tutorial03\Login.aspxbeispielsweise - kann über die Request.PhysicalPath -Eigenschaft zugegriffen werden. Die Path.GetFileNameWithoutExtension -Methode wird verwendet, um nur den Dateinamenteil herauszuziehen, und dieser Dateiname wird dann der Page.Title -Eigenschaft zugewiesen.

Hinweis

Ich lade Sie ein, diese Logik zu verbessern, um das Format des Titels zu verbessern. Wenn der Dateiname der Seite beispielsweise lautet Company-Products.aspx, erzeugt der obige Code den Titel "Company-Products", aber im Idealfall wird der Bindestrich durch ein Leerzeichen ersetzt, wie in "Unternehmensprodukte". Erwägen Sie außerdem, ein Leerzeichen hinzuzufügen, wenn sich die Groß- und Kleinschreibung ändert. Das heißt, erwägen Sie, Code hinzuzufügen, der den Dateinamen OurBusinessHours.aspx in den Titel "Unsere Geschäftszeiten" transformiert.

Die Inhaltsseiten erben die Basisseitenklasse

Wir müssen jetzt die ASP.NET Seiten auf unserer Website aktualisieren, um von der benutzerdefinierten Basisseite (BasePage) anstelle der Page -Klasse abzuleiten. Um dies zu erreichen, wechseln Sie zu jeder CodeBehind-Klasse, und ändern Sie die Klassendeklaration wie folgt:

Partial Class About
 Inherits System.Web.UI.Page
   ...
End Class

Nach:

Partial Class About
 Inherits BasePage
   ...
End Class

Besuchen Sie anschließend die Website über einen Browser. Wenn Sie eine Seite besuchen, deren Titel explizit festgelegt ist, z Default.aspx . B. oder About.aspx, wird der explizit angegebene Titel verwendet. Wenn Sie jedoch eine Seite besuchen, deren Titel nicht von der Standardeinstellung ("Unbetitelte Seite") geändert wurde, legt die Basisseitenklasse den Titel auf den Dateinamen der Seite fest.

Abbildung 5 zeigt die MultipleContentPlaceHolders.aspx Seite, wenn sie über einen Browser angezeigt wird. Beachten Sie, dass der Titel genau der Dateiname der Seite (abzüglich der Erweiterung) "MultipleContentPlaceHolders" ist.

Wenn ein Titel nicht explizit angegeben ist, wird der Dateiname der Seite automatisch verwendet.

Abbildung 05: Wenn ein Titel nicht explizit angegeben ist, wird der Dateiname der Seite automatisch verwendet (Klicken Sie hier, um das bild in voller Größe anzuzeigen).

Schritt 3: Basieren des Seitentitels auf der Websiteübersicht

ASP.NET bietet ein robustes Websiteübersichtsframework, das es Seitenentwicklern ermöglicht, eine hierarchische Siteübersicht in einer externen Ressource (z. B. eine XML-Datei oder Datenbanktabelle) zusammen mit Websteuerelementen zum Anzeigen von Informationen zur Siteübersicht (z. B. die Steuerelemente SiteMapPath, Menu und TreeView) zu definieren.

Auf die Struktur der Siteübersicht kann auch programmgesteuert über die Code-Behind-Klasse einer ASP.NET Seite zugegriffen werden. Auf diese Weise können wir den Titel einer Seite automatisch auf den Titel des entsprechenden Knotens in der Websiteübersicht festlegen. Wir erweitern die klasse, die BasePage in Schritt 2 erstellt wurde, sodass sie diese Funktionalität bietet. Zuerst müssen wir jedoch eine Site Map für unsere Website erstellen.

Hinweis

In diesem Tutorial wird davon ausgegangen, dass der Leser bereits mit ASP vertraut ist. NET-Siteübersichtsfeatures. Weitere Informationen zur Verwendung der Websiteübersicht finden Sie in meiner mehrteiligen Artikelreihe unter Untersuchen von ASP. NET-Websitenavigation.

Erstellen der Websiteübersicht

Das Siteübersichtssystem wird auf dem Anbietermodell erstellt, das die Siteübersichts-API von der Logik entkoppelt, die Siteübersichtsinformationen zwischen Arbeitsspeicher und einem persistenten Speicher serialisiert. Die .NET Framework wird mit der XmlSiteMapProvider -Klasse geliefert, bei der es sich um den Standardanbieter für die Standortübersicht handelt. Wie der Name schon sagt, XmlSiteMapProvider verwendet eine XML-Datei als Standortzuordnungsspeicher. Verwenden Sie diesen Anbieter, um unsere Websiteübersicht zu definieren.

Erstellen Sie zunächst eine Siteübersichtsdatei im Stammordner der Website namens Web.sitemap. Klicken Sie hierzu mit der rechten Maustaste auf den Websitenamen in Projektmappen-Explorer, wählen Sie Neues Element hinzufügen und dann die Vorlage Siteübersicht aus. Stellen Sie sicher, dass die Datei den Namen hat, Web.sitemap und klicken Sie auf Hinzufügen.

Hinzufügen einer Datei mit dem Namen Web.sitemap zum Stammordner der Website

Abbildung 06: Hinzufügen einer Datei namens Web.sitemap zum Stammordner der Website (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Fügen Sie der Datei den folgenden XML-Code Web.sitemap hinzu:

<?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>

Dieser XML-Code definiert die hierarchische Struktur der Websiteübersicht, die in Abbildung 7 dargestellt ist.

Die Siteübersicht besteht derzeit aus drei Site Map-Knoten

Abbildung 07: Die Standortübersicht besteht derzeit aus drei Standortübersichtsknoten.

Wir werden die Struktur der Siteübersicht in zukünftigen Tutorials aktualisieren, während wir neue Beispiele hinzufügen.

Aktualisieren der Gestaltungsvorlage zum Einschließen von Navigationswebsteuerelementen

Nachdem wir nun eine Websiteübersicht definiert haben, aktualisieren wir die master Seite so, dass sie Navigations-Websteuerelemente enthält. Insbesondere fügen wir der linken Spalte im Abschnitt Lektionen ein ListView-Steuerelement hinzu, das eine nicht sortierte Liste mit einem Listenelement für jeden knoten rendert, der in der Siteübersicht definiert ist.

Hinweis

Das ListView-Steuerelement ist neu in ASP.NET Version 3.5. Wenn Sie eine frühere Version von ASP.NET verwenden, verwenden Sie stattdessen das Repeater-Steuerelement.

Entfernen Sie zunächst das vorhandene ungeordnete Listenmarkup aus dem Abschnitt Lektionen. Ziehen Sie als Nächstes ein ListView-Steuerelement aus der Toolbox, und legen Sie es unter der Überschrift Lektionen ab. Die ListView befindet sich im Abschnitt Daten der Toolbox neben den anderen Ansichtssteuerelementen: GridView, DetailsView und FormView. Legen Sie die ListView-Eigenschaft ID auf fest LessonsList.

Wählen Sie im Datenquellenkonfigurations-Assistenten aus, um die ListView an ein neues SiteMapDataSource-Steuerelement mit dem Namen LessonsDataSourcezu binden. Das SiteMapDataSource-Steuerelement gibt die hierarchische Struktur aus dem Siteübersichtssystem zurück.

Binden eines SiteMapDataSource-Steuerelements an das LessonsList ListView-Steuerelement

Abbildung 08: Binden eines SiteMapDataSource-Steuerelements an das LessonsList ListView-Steuerelement (Klicken, um das bild in voller Größe anzuzeigen)

Nach dem Erstellen des SiteMapDataSource-Steuerelements müssen die Vorlagen von ListView definiert werden, damit eine nicht sortierte Liste mit einem Listenelement für jeden vom SiteMapDataSource-Steuerelement zurückgegebenen Knoten gerendert wird. Dies kann mithilfe des folgenden Vorlagenmarkups erreicht werden:

<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>

Generiert LayoutTemplate das Markup für eine nicht sortierte Liste (<ul>...</ul>), während jedes ItemTemplate von SiteMapDataSource zurückgegebene Element als Listenelement (<li>) gerendert wird, das einen Link zur jeweiligen Lektion enthält.

Besuchen Sie nach dem Konfigurieren der ListView-Vorlagen die Website. Wie Abbildung 9 zeigt, enthält der Abschnitt Lektionen ein einzelnes Aufzählungselement, Home. Wo sind die Lektionen Über und Verwenden mehrerer ContentPlaceHolder-Steuerelemente? SiteMapDataSource ist für die Rückgabe eines hierarchischen Datensatzes konzipiert, aber das ListView-Steuerelement kann nur eine einzelne Ebene der Hierarchie anzeigen. Folglich wird nur die erste Ebene der Site Map-Knoten angezeigt, die von SiteMapDataSource zurückgegeben werden.

Der Abschnitt Lektionen enthält ein einzelnes Listenelement

Abbildung 09: Der Abschnitt Lektionen enthält ein einzelnes Listenelement (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Um mehrere Ebenen anzuzeigen, können wir mehrere ListViews innerhalb des ItemTemplateSchachtelns schachteln. Dieses Verfahren wurde im Tutorial "Masterseiten und Websitenavigation" meiner Tutorialreihe "Arbeiten mit Daten" untersucht. Für diese Tutorialreihe enthält unsere Websiteübersicht jedoch nur zwei Ebenen: Home (die oberste Ebene); und jede Lektion als Kind von Zu Hause. Anstatt eine geschachtelte ListView zu erstellen, können wir die SiteMapDataSource stattdessen anweisen, den Startknoten nicht zurückzugeben, indem wir die ShowStartingNode -Eigenschaft auf Falsefestlegen. Der Nettoeffekt besteht darin, dass SiteMapDataSource zunächst die zweite Ebene von Site map-Knoten zurückgibt.

Mit dieser Änderung zeigt die ListView Aufzählungszeichen für die Lektionen About and Using Multiple ContentPlaceHolder Controls an, verzichtet jedoch auf ein Aufzählungszeichen für Home. Um dies zu beheben, können wir explizit ein Aufzählungszeichen für Home in hinzufügen LayoutTemplate:

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

Durch Konfigurieren der SiteMapDataSource zum Weglassen des Startknotens und explizites Hinzufügen eines Startpunktelements zeigt der Abschnitt Lektionen jetzt die beabsichtigte Ausgabe an.

Der Abschnitt Lektionen enthält ein Aufzählungszeichen für Start und jeden untergeordneten Knoten.

Abbildung 10: Der Abschnitt Lektionen enthält ein Aufzählungszeichen für Start und jeden untergeordneten Knoten (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Festlegen des Titels basierend auf der Standortübersicht

Wenn die Siteübersicht vorhanden ist, können wir unsere BasePage Klasse so aktualisieren, dass sie den in der Websiteübersicht angegebenen Titel verwendet. Wie in Schritt 2 möchten wir den Titel des Siteübersichtsknotens nur verwenden, wenn der Titel der Seite nicht explizit vom Seitenentwickler festgelegt wurde. Wenn die angeforderte Seite keinen explizit festgelegten Seitentitel aufweist und nicht in der Websiteübersicht gefunden wird, werden wir wie in Schritt 2 auf die Verwendung des Dateinamens der angeforderten Seite (abzüglich der Erweiterung) zurückgreifen. Abbildung 11 veranschaulicht diesen Entscheidungsprozess.

Wenn kein explizit festgelegter Seitentitel vorhanden ist, wird der Titel des entsprechenden Siteübersichtsknotens verwendet.

Abbildung 11: In Abwesenheit eines explizit festgelegten Seitentitels wird der Titel des entsprechenden Siteübersichtsknotens verwendet.

Aktualisieren Sie die -Methode der BasePageOnLoadComplete -Klasse, um den folgenden Code einzuschließen:

Protected Overrides Sub OnLoadComplete(ByVal e As EventArgs)
 ' Set the page's title, if necessary
 If String.IsNullOrEmpty(Page.Title) OrElse Page.Title = "Untitled Page" Then
 ' Is this page defined in the site map?
 Dim newTitle As String = Nothing

 Dim current As SiteMapNode = SiteMap.CurrentNode
 If current IsNot Nothing Then
 newTitle = current.Title
 Else
 ' Determine the filename for this page
 newTitle = System.IO.Path.GetFileNameWithoutExtension(Request.PhysicalPath)
 End If

 Page.Title = newTitle
 End If

 MyBase.OnLoadComplete(e)
End Sub

Wie zuvor beginnt die -Methode mit der OnLoadComplete Bestimmung, ob der Titel der Seite explizit festgelegt wurde. Wenn Page.Title ist Nothing, wird eine leere Zeichenfolge oder der Wert "Unbenannte Seite" zugewiesen, dann weist der Code automatisch einen Wert zu Page.Title.

Um den zu verwendenden Titel zu bestimmen, verweist der Code zunächst auf die -Eigenschaft derCurrentNodeSiteMap -Klasse. CurrentNodegibt die SiteMapNode instance in der Websiteübersicht zurück, die der aktuell angeforderten Seite entspricht. Wenn die aktuell angeforderte Seite in der Websiteübersicht gefunden wird, wird die SiteMapNode- Title Eigenschaft der Seite dem Titel der Seite zugewiesen. Wenn die aktuell angeforderte Seite nicht in der Websiteübersicht enthalten ist, wird zurückgegebenNothing, CurrentNode und der Dateiname der angeforderten Seite wird als Titel verwendet (wie in Schritt 2 ausgeführt).

Abbildung 12 zeigt die MultipleContentPlaceHolders.aspx Seite, wenn sie über einen Browser angezeigt wird. Da der Titel dieser Seite nicht explizit festgelegt ist, wird stattdessen der Titel des entsprechenden Siteübersichtsknotens verwendet.

Der Titel der MultipleContentPlaceHolders.aspx Seite wird aus der Websiteübersicht abgerufen.

Abbildung 12: Der Titel der MultipleContentPlaceHolders.aspx Seite wird aus der Websiteübersicht abgerufen

Schritt 4: Hinzufügen von anderen Page-Specific Markup zum<head>Abschnitt

In den Schritten 1, 2 und 3 wurde das Anpassen des <title> Elements seitenweise untersucht. Zusätzlich zu <title>kann der <head> Abschnitt Elemente und <link> Elemente enthalten<meta>. Wie weiter oben in diesem Tutorial erwähnt, Site.masterenthält der Abschnitt "s <head> " ein <link> -Element zu Styles.css. Da dieses <link> Element innerhalb der seite master definiert ist, ist es im <head> Abschnitt für alle Inhaltsseiten enthalten. Aber wie können wir elemente seiteweise hinzufügen <meta><link> ?

Die einfachste Möglichkeit, dem <head> Abschnitt seitenspezifische Inhalte hinzuzufügen, besteht darin, ein ContentPlaceHolder-Steuerelement auf der master Seite zu erstellen. Wir verfügen bereits über einen solchen ContentPlaceHolder (mit dem Namen head). Erstellen Sie daher ein entsprechendes Content-Steuerelement auf der Seite, und platzieren Sie das Markup dort, um benutzerdefiniertes <head> Markup hinzuzufügen.

Um das Hinzufügen von benutzerdefiniertem <head> Markup zu einer Seite zu veranschaulichen, fügen wir dem aktuellen Satz von Inhaltsseiten ein <meta> Beschreibungselement hinzu. Das <meta> description-Element bietet eine kurze Beschreibung der Webseite. Die meisten Suchmaschinen integrieren diese Informationen in irgendeiner Form, wenn suchergebnisse angezeigt werden.

Ein <meta> description-Element hat die folgende Form:

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

Um dieses Markup einer Inhaltsseite hinzuzufügen, fügen Sie den obigen Text dem Content-Steuerelement hinzu, das dem ContentPlaceHolder der master Seite head zugeordnet ist. Um beispielsweise ein <meta> description-Element für Default.aspxzu definieren, fügen Sie das folgende Markup hinzu:

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

Da sich contentPlaceHolder head nicht im Text der HTML-Seite befindet, wird das dem Inhaltssteuerelement hinzugefügte Markup nicht in der Entwurfsansicht angezeigt. Um das <meta> Description-Element anzuzeigen, besuchen Sie Default.aspx einen Browser. Nachdem die Seite geladen wurde, zeigen Sie die Quelle an, und beachten Sie, dass der <head> Abschnitt das im Content-Steuerelement angegebene Markup enthält.

Nehmen Sie sich einen Moment Zeit, um Beschreibungselemente zu , MultipleContentPlaceHolders.aspxund Login.aspxhinzuzufügen <meta>About.aspx.

Programmgesteuertes Hinzufügen von Markup zur<head>Region

Der head ContentPlaceHolder ermöglicht es uns, dem Bereich der master Seite deklarativ benutzerdefiniertes <head> Markup hinzuzufügen. Benutzerdefiniertes Markup kann auch programmgesteuert hinzugefügt werden. Denken Sie daran, dass die -Eigenschaft der Page -Klasse Header den HtmlHead instance zurückgibt, der auf der seite master definiert ist (die <head runat="server">).

Die Möglichkeit, der <head> Region programmgesteuert Inhalte hinzuzufügen, ist nützlich, wenn der hinzuzufügende Inhalt dynamisch ist. Vielleicht basiert es darauf, dass der Benutzer die Seite besucht; vielleicht wird es aus einer Datenbank abgerufen. Unabhängig vom Grund können Sie dem Inhalt hinzufügen, indem Sie seiner HtmlHead Sammlung Steuerelemente Controls wie folgt hinzufügen:

' Programmatically add a <meta> element to the Header
Dim keywords As New HtmlMeta()
keywords.Name = "keywords"
keywords.Content = "master page,asp.net,tutorial"

Page.Header.Controls.Add(keywords)

Der obige Code fügt dem Bereich das <meta><head> Keywords-Element hinzu, das eine durch Trennzeichen getrennte Liste von Schlüsselwörtern bereitstellt, die die Seite beschreiben. Beachten Sie, dass Sie zum Hinzufügen eines <meta> Tags eine HtmlMeta instance erstellen, dessen Name Eigenschaften und Content festlegen und sie dann der Auflistung von HeaderControls hinzufügen. Ähnlich wie beim programmgesteuerten Hinzufügen eines <link> Elements erstellen Sie ein HtmlLink Objekt, legen seine Eigenschaften fest, und fügen Sie es dann der Auflistung von Headerhinzu Controls .

Hinweis

Um beliebiges Markup hinzuzufügen, erstellen Sie eine LiteralControl instance, legen Die -Eigenschaft festText, und fügen Sie sie dann der Auflistung des Header-Objekts Controls hinzu.

Zusammenfassung

In diesem Tutorial haben wir eine Vielzahl von Möglichkeiten untersucht, wie Sie Regionsmarkup seitenweise hinzufügen <head> können. Eine master Seite sollte eine HtmlHead instance (<head runat="server">) mit einem ContentPlaceHolder enthalten. Die HtmlHead instance ermöglicht es Inhaltsseiten, programmgesteuert auf den <head> Bereich zuzugreifen und den Titel der Seite deklarativ und programmgesteuert festzulegen. Das ContentPlaceHolder-Steuerelement ermöglicht das deklarative Hinzufügen von benutzerdefiniertem Markup zum <head> Abschnitt über ein Content-Steuerelement.

Viel Spaß beim Programmieren!

Weitere Informationen

Weitere Informationen zu den in diesem Tutorial behandelten Themen finden Sie in den folgenden Ressourcen:

Zum Autor

Scott Mitchell, Autor mehrerer ASP/ASP.NET-Bücher und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft-Webtechnologien. Scott arbeitet als unabhängiger Berater, Trainer und Autor. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 3.5 in 24 Stunden. Scott kann unter mitchell@4GuysFromRolla.com oder über seinen Blog unter http://ScottOnWriting.NETerreicht werden.

Besonderer Dank an

Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Hauptprüfer für dieses Tutorial waren Zack Jones und Suchi Banerjee. Möchten Sie meine bevorstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter ab mitchell@4GuysFromRolla.com.