Określanie tytułu, tagów meta i innych nagłówków HTML na stronie wzorcowej (VB)

Autor : Scott Mitchell

Pobierz plik PDF

Przyjrzyj się różnym technikom definiowania różnych <elementów głowy> na stronie wzorcowej na stronie zawartości.

Wprowadzenie

Nowe strony wzorcowe utworzone w programie Visual Studio 2008 domyślnie mają dwie kontrolki ContentPlaceHolder: jedną o nazwie i znajdującą <head> się w elemecie oraz jedną o nazwie headContentPlaceHolder1, umieszczoną w formularzu sieci Web. Celem programu ContentPlaceHolder1 jest zdefiniowanie regionu w formularzu internetowym, który można dostosować na podstawie strony po stronie. Element head ContentPlaceHolder umożliwia dodawanie zawartości niestandardowej <head> do sekcji na stronach. (Oczywiście te dwa symbole ContentPlaceHolder można modyfikować lub usuwać, a dodatkowy element ContentPlaceHolder można dodać do strony wzorcowej. Nasza strona wzorcowa , Site.masterobecnie ma cztery kontrolki ContentPlaceHolder).

Element HTML <head> służy jako repozytorium informacji o dokumencie strony internetowej, który nie jest częścią samego dokumentu. Obejmuje to informacje, takie jak tytuł strony internetowej, metadane używane przez wyszukiwarki lub wewnętrzne przeszukiwarki oraz linki do zasobów zewnętrznych, takich jak kanały informacyjne RSS, pliki JavaScript i CSS. Niektóre z tych informacji mogą być istotne dla wszystkich stron w witrynie internetowej. Możesz na przykład zaimportować globalnie te same reguły CSS i pliki JavaScript dla każdej strony ASP.NET. Istnieją jednak fragmenty <head> elementu, które są specyficzne dla strony. Tytuł strony jest doskonałym przykładem.

W tym samouczku dowiesz się, jak zdefiniować znaczniki sekcji globalnej i strony <head> na stronie wzorcowej i na jej stronach zawartości.

Badanie sekcji strony wzorcowej<head>

Domyślny plik strony wzorcowej utworzony przez program Visual Studio 2008 zawiera następujące znaczniki w sekcji <head> :

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

Zwróć uwagę, że <head> element zawiera runat="server" atrybut, który wskazuje, że jest to kontrolka serwera (a nie statyczny kod HTML). Wszystkie strony ASP.NET pochodzą z Page klasy, która znajduje się w System.Web.UI przestrzeni nazw. Ta klasa zawiera Header właściwość , która zapewnia dostęp do regionu strony <head> . Header Za pomocą właściwości możemy ustawić tytuł strony ASP.NET lub dodać dodatkowe znaczniki do renderowanej <head> sekcji. Następnie można dostosować element strony <head> zawartości, pisząc trochę kodu w procedurze obsługi zdarzeń strony Page_Load . Sprawdzamy, jak programowo ustawić tytuł strony w kroku 1.

Znaczniki pokazane w powyższym elemecie <head> zawierają również kontrolkę ContentPlaceHolder o nazwie head. Ta kontrolka ContentPlaceHolder nie jest konieczna, ponieważ strony zawartości mogą programowo dodawać zawartość niestandardową <head> do elementu. Jest to jednak przydatne w sytuacjach, w których strona zawartości musi dodać statyczne znaczniki do <head> elementu, ponieważ statyczne adiustacje można dodać deklaratywnie do odpowiedniej kontrolki zawartość, a nie programowo.

Oprócz <title> elementu i head elementu ContentPlaceHolder element strony wzorcowej <head> powinien zawierać dowolne <head>znaczniki na poziomie , które są wspólne dla wszystkich stron. W naszej witrynie internetowej wszystkie strony używają reguł CSS zdefiniowanych Styles.css w pliku . W związku z tym zaktualizowaliśmy element w samouczku <head>Tworzenie układu Site-Wide za pomocą stron wzorcowych w celu uwzględnienia odpowiedniego <link> elementu. Bieżąca Site.master<head> adiustacja naszej strony wzorcowej jest pokazana poniżej.

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

Krok 1. Ustawianie tytułu strony zawartości

Tytuł strony internetowej jest określany za pośrednictwem <title> elementu . Ważne jest, aby ustawić tytuł każdej strony na odpowiednią wartość. Podczas odwiedzania strony jej tytuł jest wyświetlany na pasku tytułu przeglądarki. Ponadto podczas tworzenia zakładek przeglądarki używają tytułu strony jako sugerowanej nazwy zakładki. Ponadto wiele aparatów wyszukiwania wyświetla tytuł strony podczas wyświetlania wyników wyszukiwania.

Uwaga

Domyślnie program Visual Studio ustawia <title> element na stronie wzorcowej na "Strona bez tytułu". Podobnie nowe strony ASP.NET mają też <title> ustawioną wartość "Strona bez tytułu". Ponieważ można łatwo zapomnieć o ustawieniu tytułu strony na odpowiednią wartość, istnieje wiele stron w Internecie z tytułem "Strona bez tytułu". Wyszukiwanie stron internetowych Google o tym tytule zwraca około 2460 000 wyników. Nawet firma Microsoft jest podatna na publikowanie stron internetowych z tytułem "Strona bez tytułu". W momencie pisania tego tekstu wyszukiwanie Google zgłosiło 236 takich stron internetowych w domenie Microsoft.com.

Strona ASP.NET może określić jej tytuł w jeden z następujących sposobów:

  • Umieszczając wartość bezpośrednio w elemecie <title>
  • Używanie atrybutu Title<%@ Page %> w dyrektywie
  • Programowe ustawianie właściwości strony Title przy użyciu kodu takiego jak Page.Title="title" lub Page.Header.Title="title".

Strony zawartości nie mają <title> elementu, ponieważ są zdefiniowane na stronie wzorcowej. W związku z tym, aby ustawić tytuł strony zawartości, można użyć <%@ Page %> atrybutu Title dyrektywy lub ustawić ją programowo.

Deklaratywne ustawianie tytułu strony

Tytuł strony zawartości można ustawić deklaratywnie za pomocą Title atrybutu <%@ Page %> dyrektywy. Tę właściwość można ustawić bezpośrednio, modyfikując dyrektywę <%@ Page %> lub za pomocą okno Właściwości. Przyjrzyjmy się obu podejść.

W widoku Źródło znajdź dyrektywę <%@ Page %> , która znajduje się w górnej części znacznika deklaratywnego strony. Dyrektywa <%@ Page %> dla Default.aspx następujących:

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

Dyrektywa <%@ Page %> określa atrybuty specyficzne dla strony używane przez aparat ASP.NET podczas analizowania i kompilowania strony. Obejmuje to między innymi plik strony wzorcowej, lokalizację pliku kodu i jego tytuł.

Domyślnie podczas tworzenia nowej strony zawartości program Visual Studio ustawia Title atrybut na "Strona bez tytułu". Zmień Default.aspxatrybut "s Title " z "Strona bez tytułu" na "Samouczki dotyczące strony wzorcowej", a następnie wyświetl stronę za pośrednictwem przeglądarki. Rysunek 1 przedstawia pasek tytułu przeglądarki, który odzwierciedla nowy tytuł strony.

Pasek tytułu przeglądarki pokazuje teraz

Rysunek 01. Pasek tytułu przeglądarki pokazuje teraz "Samouczki dotyczące strony wzorcowej" zamiast "Strona bez tytułu"

Tytuł strony można również ustawić na podstawie okno Właściwości. Z okno Właściwości wybierz pozycję DOKUMENT z listy rozwijanej, aby załadować właściwości na poziomie strony, które obejmują Title właściwość . Rysunek 2 przedstawia okno Właściwości po Title ustawieniu pozycji "Samouczki dotyczące strony wzorcowej".

Tytuł można skonfigurować również w oknie Właściwości.

Rysunek 02. Tytuł można skonfigurować również w oknie Właściwości.

Programowe ustawianie tytułu strony

Znaczniki strony wzorcowej <head runat="server"> są tłumaczone na HtmlHead wystąpienie klasy , gdy strona jest renderowana przez aparat ASP.NET. Klasa HtmlHead ma Title właściwość , której wartość jest odzwierciedlana w renderowanych <title> elementach. Ta właściwość jest dostępna z klasy za pomocą kodu strony ASP.NET za pośrednictwem metody Page.Header.Title. Dostęp do tej samej właściwości można również uzyskać za pośrednictwem metody Page.Title.

Aby ćwiczyć programowe ustawianie tytułu strony, przejdź do About.aspx klasy kodowej strony i utwórz procedurę obsługi zdarzeń dla zdarzenia strony Load . Następnie ustaw tytuł strony na "Samouczki strony wzorcowej :: Informacje o :: data", gdzie data jest bieżącą datą. Po dodaniu tego kodu Page_Load program obsługi zdarzeń powinien wyglądać podobnie do następującego:

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

Rysunek 3 przedstawia pasek tytułu przeglądarki podczas odwiedzania About.aspx strony.

Tytuł strony jest ustawiany programowo i uwzględnia bieżącą datę

Rysunek 03. Tytuł strony jest ustawiany programowo i uwzględnia bieżącą datę

Krok 2. Automatyczne przypisywanie tytułu strony

Jak pokazano w kroku 1, tytuł strony można ustawić deklaratywnie lub programowo. Jeśli jednak zapomnisz jawnie zmienić tytuł na bardziej opisowy, strona będzie mieć domyślny tytuł "Strona bez tytułu". Najlepiej, aby tytuł strony był ustawiany automatycznie w przypadku, gdy nie określimy jawnie jej wartości. Jeśli na przykład w czasie wykonywania tytuł strony to "Strona bez tytułu", możemy chcieć, aby tytuł był automatycznie aktualizowany tak samo jak nazwa pliku strony ASP.NET. Dobrą wiadomością jest to, że przy odrobinie pracy z góry można automatycznie przypisać tytuł.

Wszystkie strony internetowe ASP.NET pochodzą z Page klasy w przestrzeni nazw System.Web.UI. Klasa Page definiuje minimalną funkcjonalność wymaganą przez stronę ASP.NET i udostępnia podstawowe właściwości, takie jak IsPostBack, IsValid, Requesti Response, między innymi. Często każda strona w aplikacji internetowej wymaga dodatkowych funkcji lub funkcji. Typowym sposobem zapewnienia tego jest utworzenie niestandardowej klasy strony bazowej. Niestandardowa klasa strony bazowej to tworzona klasa, która pochodzi z Page klasy i zawiera dodatkowe funkcje. Po utworzeniu tej klasy bazowej możesz uzyskać od niej strony ASP.NET (a nie klasę Page ), oferując w ten sposób rozszerzoną funkcjonalność stron ASP.NET.

W tym kroku utworzymy stronę podstawową, która automatycznie ustawia tytuł strony na nazwę pliku strony ASP.NET, jeśli tytuł nie został jawnie ustawiony. Krok 3 przedstawia ustawienie tytułu strony na podstawie mapy witryny.

Uwaga

Dokładne badanie tworzenia i używania niestandardowych klas stron podstawowych wykracza poza zakres tej serii samouczków.

Tworzenie klasy strony bazowej

Naszym pierwszym zadaniem jest utworzenie klasy strony bazowej, która jest klasą rozszerzającą klasę Page . Zacznij od dodania App_Code folderu do projektu, klikając prawym przyciskiem myszy nazwę projektu w Eksplorator rozwiązań, wybierając pozycję Dodaj ASP.NET Folder, a następnie wybierając pozycję App_Code. Następnie kliknij prawym przyciskiem myszy App_Code folder i dodaj nową klasę o nazwie BasePage.vb. Rysunek 4 przedstawia Eksplorator rozwiązań po App_Code dodaniu folderu i BasePage.vb klasy.

Dodawanie folderu App_Code i klasy o nazwie BasePage

Rysunek 04. Dodawanie App_Code folderu i klasy o nazwie BasePage

Uwaga

Program Visual Studio obsługuje dwa tryby zarządzania projektami: projekty witryn sieci Web i projekty aplikacji internetowych. Folder App_Code jest przeznaczony do użycia z modelem projektu witryny sieci Web. Jeśli używasz modelu projektu aplikacji internetowej, umieść klasę BasePage.vb w folderze o nazwie innej niż App_Code, na przykład Classes. Aby uzyskać więcej informacji na ten temat, zobacz Migrowanie projektu witryny sieci Web do projektu aplikacji internetowej.

Ponieważ niestandardowa strona podstawowa służy jako klasa bazowa dla klas kodowych stron ASP.NET, musi rozszerzyć klasę Page .

Public Class BasePage
 Inherits System.Web.UI.Page

End Class

Za każdym razem, gdy żądana jest strona ASP.NET, przechodzi ona przez serię etapów, co kończy się renderowaniem żądanej strony w kodzie HTML. Możemy wykorzystać etap, przesłaniając Page metodę klasy OnEvent . W przypadku naszej strony bazowej automatycznie ustawimy tytuł, jeśli nie został jawnie określony przez LoadComplete etap (który, jak można się domyślić, występuje po Load etapie).

Aby to osiągnąć, zastąpij metodę OnLoadComplete i wprowadź następujący kod:

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

Metoda OnLoadComplete rozpoczyna się od określenia, czy Title właściwość nie została jeszcze jawnie ustawiona. Title Jeśli właściwość to Nothing, pusty ciąg lub ma wartość "Strona bez tytułu", jest przypisana do nazwy pliku żądanej strony ASP.NET. Ścieżka fizyczna do żądanej strony ASP.NET — C:\MySites\Tutorial03\Login.aspxna przykład — jest dostępna za pośrednictwem Request.PhysicalPath właściwości . Metoda Path.GetFileNameWithoutExtension jest używana do wyciągania tylko części nazwy pliku, a ta nazwa pliku jest następnie przypisywana do Page.Title właściwości.

Uwaga

Zapraszam do ulepszenia tej logiki w celu ulepszenia formatu tytułu. Jeśli na przykład nazwa pliku strony to Company-Products.aspx, powyższy kod spowoduje wygenerowanie tytułu "Produkty firmowe", ale w idealnym przypadku kreska zostanie zastąpiona spacją, tak jak w sekcji "Produkty firmowe". Należy również rozważyć dodanie spacji za każdym razem, gdy wystąpi zmiana wielkości liter. Oznacza to, że rozważ dodanie kodu, który przekształca nazwę pliku OurBusinessHours.aspx na tytuł "Nasze godziny pracy".

Posiadanie stron zawartości dziedziczy klasę strony bazowej

Teraz musimy zaktualizować strony ASP.NET w naszej witrynie, aby pochodziły z niestandardowej strony bazowej Page (BasePage) zamiast klasy. Aby to zrobić, przejdź do każdej klasy za kodem i zmień deklarację klasy z:

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

Do:

Partial Class About
 Inherits BasePage
   ...
End Class

Po wykonaniu tej czynności odwiedź witrynę za pośrednictwem przeglądarki. Jeśli odwiedzasz stronę, której tytuł jest jawnie ustawiony, na przykład Default.aspx lub About.aspx, jest używany jawnie określony tytuł. Jeśli jednak odwiedzasz stronę, której tytuł nie został zmieniony z domyślnego ("Strona bez tytułu"), klasa strony bazowej ustawia tytuł na nazwę pliku strony.

Rysunek 5 przedstawia MultipleContentPlaceHolders.aspx stronę po wyświetleniu za pośrednictwem przeglądarki. Należy pamiętać, że tytuł jest dokładnie nazwą pliku strony (mniej rozszerzeniem), "MultipleContentPlaceHolders".

Jeśli tytuł nie jest jawnie określony, nazwa pliku strony jest automatycznie używana

Rysunek 05. Jeśli tytuł nie jest jawnie określony, nazwa pliku strony jest automatycznie używana (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 3. Oparcie tytułu strony na mapie witryny

ASP.NET oferuje niezawodną strukturę mapy witryny, która umożliwia deweloperom stron definiowanie hierarchicznej mapy lokacji w zasobie zewnętrznym (takim jak plik XML lub tabela bazy danych) wraz z kontrolkami sieci Web do wyświetlania informacji o mapie witryny (takich jak kontrolki SiteMapPath, Menu i TreeView).

Dostęp do struktury mapy witryny można również uzyskać programowo z poziomu klasy ASP.NET strony. W ten sposób możemy automatycznie ustawić tytuł strony na tytuł odpowiedniego węzła na mapie witryny. Rozszerzmy klasę utworzoną BasePage w kroku 2, aby oferuje ona tę funkcję. Najpierw musimy jednak utworzyć mapę witryny dla naszej witryny.

Uwaga

W tym samouczku założono, że czytelnik jest już zaznajomiony z platformą ASP. Funkcje mapy witryny platformy NET. Aby uzyskać więcej informacji na temat korzystania z mapy witryny, zapoznaj się z serią artykułów wieloczęściowych , Badanie platformy ASP. Nawigacja po witrynie platformy NET.

Tworzenie mapy witryny

System mapy lokacji jest zbudowany na szczycie modelu dostawcy, który oddziela interfejs API mapy lokacji od logiki, która serializuje informacje o mapowaniu lokacji między pamięcią a magazynem trwałym. .NET Framework jest dostarczany z klasąXmlSiteMapProvider, która jest domyślnym dostawcą mapy lokacji. Jak wskazuje jego nazwa, XmlSiteMapProvider używa pliku XML jako magazynu mapy witryny. Użyjmy tego dostawcy do zdefiniowania mapy witryny.

Zacznij od utworzenia pliku mapy witryny w folderze głównym witryny o nazwie Web.sitemap. Aby to osiągnąć, kliknij prawym przyciskiem myszy nazwę witryny internetowej w Eksplorator rozwiązań, wybierz pozycję Dodaj nowy element i wybierz szablon Mapa witryny. Upewnij się, że plik ma nazwę Web.sitemap i kliknij przycisk Dodaj.

Dodawanie pliku o nazwie Web.sitemap do folderu głównego witryny sieci Web

Rysunek 06. Dodawanie pliku o nazwie Web.sitemap do folderu głównego witryny internetowej (kliknij, aby wyświetlić obraz pełnowymiarowy)

Dodaj następujący kod XML do Web.sitemap pliku:

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

Ten kod XML definiuje hierarchiczną strukturę mapy lokacji pokazaną na rysunku 7.

Mapa witryny składa się obecnie z trzech węzłów mapy lokacji

Rysunek 07. Mapa witryny składa się obecnie z trzech węzłów mapy lokacji

W przyszłych samouczkach zaktualizujemy strukturę mapy witryny, dodając nowe przykłady.

Aktualizowanie strony wzorcowej w celu uwzględnienia kontrolek sieci Web nawigacji

Teraz, gdy mamy zdefiniowaną mapę witryny, zaktualizujmy stronę wzorcową, aby uwzględnić kontrolki sieci Web nawigacji. W szczególności dodajmy kontrolkę ListView do lewej kolumny w sekcji Lekcje, która renderuje nieuporządkowaną listę z elementem listy dla każdego węzła zdefiniowanego na mapie witryny.

Uwaga

Kontrolka ListView jest nowa do ASP.NET w wersji 3.5. Jeśli używasz wcześniejszej wersji ASP.NET, użyj kontrolki Repeater.

Zacznij od usunięcia istniejącego nieuporządkowanego znacznika listy z sekcji Lekcje. Następnie przeciągnij kontrolkę ListView z przybornika i upuść ją pod nagłówkiem Lekcje. Element ListView znajduje się w sekcji Dane przybornika wraz z innymi kontrolkami widoku: GridView, DetailsView i FormView. Ustaw właściwość ListView ID na LessonsList.

W Kreatorze konfiguracji źródła danych wybierz powiązanie elementu ListView z nową kontrolką SiteMapDataSource o nazwie LessonsDataSource. Kontrolka SiteMapDataSource zwraca hierarchiczną strukturę z systemu mapy lokacji.

Wiązanie kontrolki SiteMapDataSource z kontrolką LessonsList ListView

Rysunek 08. Powiązanie kontrolki SiteMapDataSource z kontrolką LessonsList ListView (kliknij, aby wyświetlić obraz pełnowymiarowy)

Po utworzeniu kontrolki SiteMapDataSource należy zdefiniować szablony elementu ListView, aby renderowała nieuporządkowaną listę z elementem listy dla każdego węzła zwróconego przez kontrolkę SiteMapDataSource. Można to zrobić przy użyciu następującego znacznika szablonu:

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

Element LayoutTemplate generuje znaczniki dla listy nieurządkowanej (<ul>...</ul>), podczas gdy ItemTemplate renderuje każdy element zwrócony przez element SiteMapDataSource jako element listy (<li>), który zawiera link do konkretnej lekcji.

Po skonfigurowaniu szablonów elementu ListView odwiedź witrynę internetową. Jak pokazano na rysunku 9, sekcja Lekcje zawiera pojedynczy punktowany element Home. Gdzie znajdują się lekcje dotyczące kontrolek About and Using Multiple ContentPlaceHolder? Element SiteMapDataSource jest przeznaczony do zwracania hierarchicznego zestawu danych, ale kontrolka ListView może wyświetlać tylko jeden poziom hierarchii. W związku z tym wyświetlany jest tylko pierwszy poziom węzłów mapy lokacji zwróconych przez element SiteMapDataSource.

Sekcja Lekcje zawiera pojedynczy element listy

Rysunek 09. Sekcja Lekcji zawiera pojedynczy element listy (kliknij, aby wyświetlić obraz pełnowymiarowy)

Aby wyświetlić wiele poziomów, możemy zagnieżdżać wiele elementów ListView w obrębie elementu ItemTemplate. Ta technika została zbadana w samouczku dotyczącym stron wzorcowych i nawigacji witryny w serii samouczków Praca z danymi. Jednak w tej serii samouczków mapa witryny będzie zawierać tylko dwa poziomy: Strona główna (najwyższy poziom); i każda lekcja jako dziecko domu. Zamiast tworzyć zagnieżdżony element ListView, możemy zamiast tego poinstruować element SiteMapDataSource, aby nie zwracał węzła początkowego, ustawiając jejShowStartingNode właściwość na False. Efekt netto polega na tym, że element SiteMapDataSource rozpoczyna się od zwrócenia drugiej warstwy węzłów mapy lokacji.

Dzięki tej zmianie widok ListView wyświetla elementy punktorowe dla lekcji Informacje i Korzystanie z wielu kontrolek ContentPlaceHolder, ale pomija element punktorowy dla strony głównej. Aby rozwiązać ten problem, możemy jawnie dodać element punktor dla strony głównej w elemencie LayoutTemplate:

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

Po skonfigurowaniu elementu SiteMapDataSource w celu pominięcia węzła początkowego i jawnego dodania elementu punktora Narzędzia główne sekcja Lekcje wyświetla teraz zamierzone dane wyjściowe.

Sekcja Lekcje zawiera element punktorowy dla strony głównej i każdego węzła podrzędnego

Rysunek 10. Sekcja Lekcje zawiera element punktorowy dla strony głównej i każdego węzła podrzędnego (kliknij, aby wyświetlić obraz pełnowymiarowy)

Ustawianie tytułu na podstawie mapy witryny

Za pomocą mapy witryny możemy zaktualizować klasę BasePage tak, aby korzystała z tytułu określonego na mapie witryny. Tak jak w kroku 2, chcemy użyć tytułu węzła mapy witryny tylko wtedy, gdy tytuł strony nie został jawnie ustawiony przez dewelopera strony. Jeśli żądana strona nie ma jawnie ustawionego tytułu strony i nie zostanie znaleziona na mapie witryny, wrócimy do nazwy pliku żądanej strony (mniej rozszerzenia), tak jak w kroku 2. Rysunek 11 ilustruje ten proces decyzyjny.

W przypadku braku jawnie ustawionego tytułu strony odpowiedni tytuł węzła mapy witryny jest używany

Rysunek 11. W przypadku braku jawnego ustawienia tytułu strony odpowiedni tytuł węzła mapy witryny jest używany

Zaktualizuj metodę klasyOnLoadComplete, BasePage aby zawierała następujący kod:

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

Tak jak poprzednio, metoda rozpoczyna się od określenia, OnLoadComplete czy tytuł strony został jawnie ustawiony. Jeśli Page.Title to Nothing, pusty ciąg lub jest przypisywana wartość "Strona bez tytułu", kod automatycznie przypisuje wartość do Page.Title.

Aby określić tytuł do użycia, kod rozpoczyna się od odwołania do SiteMap właściwości klasyCurrentNode. CurrentNodeSiteMapNode Zwraca wystąpienie na mapie witryny odpowiadające aktualnie żądanej stronie. Zakładając, że aktualnie żądana strona znajduje się w mapie witryny, SiteMapNodewłaściwość "jest Title przypisana do tytułu strony". Jeśli aktualnie żądana strona nie znajduje się na mapie witryny, CurrentNode zwraca wartość , Nothing a nazwa pliku żądanej strony jest używana jako tytuł (tak jak to miało miejsce w kroku 2).

Rysunek 12 przedstawia MultipleContentPlaceHolders.aspx stronę po wyświetleniu za pośrednictwem przeglądarki. Ponieważ tytuł tej strony nie jest jawnie ustawiony, zamiast tego jest używany tytuł odpowiedniego węzła mapy witryny.

Tytuł strony MultipleContentPlaceHolders.aspx jest pobierany z mapy witryny

Rysunek 12. Tytuł strony MultipleContentPlaceHolders.aspx jest ściągany z mapy witryny

Krok 4. Dodawanie innych znaczników Page-Specific do<head>sekcji

Kroki 1, 2 i 3 przyjrzały się dostosowywaniu <title> elementu na podstawie strony po stronie. Oprócz <title>elementu <head> sekcja może zawierać <meta> elementy i <link> elementy. Jak wspomniano wcześniej w tym samouczku, Site.mastersekcja "s <head> " zawiera <link> element do Styles.csselementu . Ponieważ ten <link> element jest zdefiniowany na stronie wzorcowej, znajduje się w <head> sekcji dla wszystkich stron zawartości. Ale jak możemy dodawać <meta> elementy i <link> elementy na podstawie stron po stronie?

Najprostszym sposobem dodania zawartości specyficznej dla strony do <head> sekcji jest utworzenie kontrolki ContentPlaceHolder na stronie wzorcowej. Mamy już taki element ContentPlaceHolder (o nazwie head). W związku z tym, aby dodać znaczniki niestandardowe <head> , utwórz odpowiednią kontrolkę Zawartość na stronie i umieść tam znaczniki.

Aby zilustrować dodawanie niestandardowych <head> znaczników do strony, dołączmy <meta> element opisu do bieżącego zestawu stron zawartości. Element <meta> description zawiera krótki opis strony internetowej. Większość aparatów wyszukiwania zawiera te informacje w jakiejś formie podczas wyświetlania wyników wyszukiwania.

Element <meta> opisu ma następującą postać:

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

Aby dodać ten znacznik do strony zawartości, dodaj powyższy tekst do kontrolki Zawartość mapowania na element ContentPlaceHolder strony wzorcowej head . Aby na przykład zdefiniować <meta> element opisu dla Default.aspxelementu , dodaj następujące znaczniki:

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

Ponieważ element head ContentPlaceHolder nie znajduje się w treści strony HTML, znaczniki dodane do kontrolki Zawartość nie są wyświetlane w widoku projektowym. Aby wyświetlić <meta> element opisu, odwiedź Default.aspx przeglądarkę. Po załadowaniu strony wyświetl źródło i zwróć uwagę, że <head> sekcja zawiera znaczniki określone w kontrolce Zawartość.

Poświęć chwilę, aby dodać <meta> elementy opisu do About.aspxelementów , MultipleContentPlaceHolders.aspxi Login.aspx.

Programowe dodawanie znaczników do<head>regionu

Element head ContentPlaceHolder umożliwia deklaratywne dodawanie niestandardowych znaczników do regionu strony wzorcowej <head> . Adiustację niestandardową można również dodać programowo. Pamiętaj, że Page właściwość klasy Header zwraca HtmlHead wystąpienie zdefiniowane na stronie wzorcowej ().<head runat="server">

Możliwość programowego dodawania zawartości do <head> regionu jest przydatna, gdy zawartość do dodania jest dynamiczna. Być może jest ona oparta na użytkowniku odwiedzającym stronę; być może jest on ściągany z bazy danych. Niezależnie od przyczyny możesz dodać zawartość do obiektu HtmlHead , dodając kontrolki do swojej Controls kolekcji w następujący sposób:

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

Powyższy kod dodaje <meta> element keywords do <head> regionu, który zawiera rozdzielaną przecinkami listę słów kluczowych opisujących stronę. Pamiętaj, że aby dodać tag, należy utworzyć <meta>HtmlMeta wystąpienie, ustawić jego Name właściwości i Content , a następnie dodać go do Headerkolekcji .s Controls . Podobnie, aby programowo dodać <link> element, utworzyć obiekt, ustawić HtmlLink jego właściwości, a następnie dodać go do Headerkolekcji .s Controls .

Uwaga

Aby dodać dowolne znaczniki, utwórz LiteralControl wystąpienie, ustaw jego Text właściwość, a następnie dodaj ją do Headerkolekcji .s Controls .

Podsumowanie

W tym samouczku przyjrzeliśmy się różnym sposobom dodawania <head> znaczników regionów na podstawie strony po stronie. Strona wzorcowa powinna zawierać HtmlHead wystąpienie (<head runat="server">) z elementem ContentPlaceHolder. Wystąpienie HtmlHead umożliwia stronom zawartości programowe uzyskiwanie dostępu do <head> regionu oraz deklaratywne i programowe ustawianie tytułu strony. Kontrolka ContentPlaceHolder umożliwia deklaratywne dodawanie znaczników niestandardowych do <head> sekcji za pomocą kontrolki zawartość.

Szczęśliwe programowanie!

Dalsze informacje

Aby uzyskać więcej informacji na temat tematów omówionych w tym samouczku, zapoznaj się z następującymi zasobami:

Informacje o autorze

Scott Mitchell, autor wielu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 3,5 w ciągu 24 godzin. Scott można dotrzeć pod mitchell@4GuysFromRolla.com adresem lub za pośrednictwem swojego bloga pod adresem http://ScottOnWriting.NET.

Specjalne podziękowania

Ta seria samouczków została przejrzyona przez wielu przydatnych recenzentów. Głównymi recenzentami tego samouczka byli Zack Jones i Suchi Banerjee. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresem mitchell@4GuysFromRolla.com.