Artykuł pochodzi w serii przygotowań do egzaminu 70-562 ASP.NET.
W dzisiejszej lekcji mowa będzie o dwóch rzeczach a mianowicie: Master Pages oraz Content Pages.
Czym jest Master Page
Najprościej mówiąc Master Page jest to jakaś główna część naszej strony, która pozostaje niezmienna, w której możemy umieścić jakąś wspólną funkcjonalność strony. Np. layout, który ma jakiś top, stopkę i menu. Wrzucamy to w master page bo jest to część która nie zmienia się na naszej stronie. Wymienny jest tylko środek layoutu czyli strony typu Content, o których powiemy sobie później.
Master page definiujemy w pliku z rozszerzeniem *.master. Plik ten jest bardzo podobny do zwykłej strony .aspx. Jedną z różnic pomiędzy tymi plikami jest to, że master page dziedziczy po klasie MasterPage.
Tworzenie Master Page
Aby stworzyć nowy master page wybieramy: Add New Item –> Master Page.
Przykładowy kod takiego pliku może wyglądać tak:
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2: "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3: <html xmlns="http://www.w3.org/1999/xhtml">
4: <head runat="server">
5: <title>Contoso Inc.</title>
6: <asp:ContentPlaceHolder id="head" runat="server">
7: </asp:ContentPlaceHolder>
8: <link href="SiteStyles.css" rel="stylesheet" type="text/css" />
9: </head>
10: <body>
11: <form id="form1" runat="server">
12: <div class="header">
13: <img src="images/contoso.jpg" alt="Contoso" />
14: <a href="products.aspx" class="topNav"> Products</a>
15: <a href="services.aspx" class="topNav"> Services</a>
16: <a href="about.aspx" class="topNav"> About</a>
17: <a href="contact.aspx" class="topNav"> Contact</a>
18: <hr /> </div>
19: <asp:ContentPlaceHolder id="ContentPlaceHolderMain" runat="server">
20: </asp:ContentPlaceHolder>
21: <div class="footer">Copyright <%= DateTime.Now.Year.ToString() %>
22: Contoso </div>
23: </form>
24: </body>
25: </html>
W tym przykładzie dołączyliśmy do master page style css, zrobiliśmy za ich pomocą nawigację, cały top oraz stopkę strony. Pomiędzy górną nawigacja a stopką strony widzimy miejsce, w którym umieszczane będą strony z treścią.

Tworzenie stron z zawartością
Tworzenie stron z treścią/zawartością (ang. content pages) tworzy się praktycznie identycznie jak zwykłe strony. Jedyną rzeczą, którą dodatkowo musimy zrobić podczas tworzenia, jest zaznaczenie checkboxa “Select Master Page”. W projekcie asp .net web application nie będzie checkboxa ale inny typ widoku: content web form. Tam również zostaniemy poproszeni o wybranie pliku z master page.
Po stworzeniu strony zobaczymy mniej więcej coś takiego:
1: <%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master"
2: AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"
3: Inherits="test.Web.WebForm1" %>
4: <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
5: </asp:Content>
6:
7: <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolderMain"
8: runat="server">
9: </asp:Content>
Widzimy, że w dyrektywach dodana jest MasterPageFile. Dalej mamy dwa ContentPlaceHolder’y. Odpowiadają one tym samym, które są w master page. Jeśli np. wstawimy naszą zawartość w ContentPlaceHolderMain, wtedy pojawi się ona (bazując na przykładzie pokazywanym wyżej) między nawigacją na górze a stopką.
Tworzenie właściwości w Master Page
W master page możemy tworzyć właściwości w celu udostępnienia jakiś specyficznych ustawień itp. Np. jeśli wiele stron z zawartością potrzebuje Id użytkownika, możemy stworzyć właściwość wewnątrz master page i udostępnić ją do różnych stron. W poniższym przykładzie tworzymy właściwość UserId, do której będziemy mieli dostęp jak tylko będziemy mieli referencję w stronie z zawartością:
1: public string UserId
2: {
3: get { return (String)Session["UserId"]; }
4: set { Session["UserId"] = value; }
5: }
Aby teraz skorzystać z niej w stronie z zawartością należy dodać nową dyrektywę:
1: <%@ MasterType VirtualPath="~/SiteMaster.Master" %>
Po dodaniu dyrektywy przechodzimy do code behind strony i tam odwołujemy się do naszej właściwości poprzez klasę master np. tak:
1: Login1.UserName = Master.UserId;
To tyle z grubsza o Master Page :) Zapraszam w piątek na kolejną część z naszej serii :)