Professional Documents
Culture Documents
Spis treci
Przykadowy rozdzia
Katalog ksiek
Katalog online
Zamw drukowany
katalog
Twj koszyk
Dodaj do koszyka
Cennik i informacje
Zamw informacje
o nowociach
Zamw cennik
Czytelnia
Fragmenty ksiek
online
Kontakt
Helion SA
ul. Kociuszki 1c
44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl
Helion 19912010
ASP.NET 4 z wykorzystaniem
C# i VB. Zaawansowane
programowanie
Autor: Bill Evjen, Scott Hanselman, Devin Rader
Tumaczenie: Wojciech Moch, Tomasz Walczak
ISBN: 978-83-246-2846-9
Tytu oryginau: Professional ASP.NET 4 in C# and VB
Format: 172245, stron: 1792
Spis treci
Wstp ............................................................................................................. 29
Rozdzia 1.
Rozdzia 3.
Spis treci 9
Rozdzia 5.
Rozdzia 6.
Spis treci 11
Rozdzia 8.
Spis treci 13
Spis treci 15
Spis treci 17
Spis treci 19
Spis treci 21
Spis treci 23
Spis treci 25
Dodatek B
Spis treci 27
Dodatek C
Dodatek D
Dodatek E
5
Praca ze stronami wzorcowymi
ZAWARTO ROZDZIAU:
Rysunek 5.1
Na pokazanym zrzucie ekranu warto zwrci uwag midzy innymi na sekcj nagwka, sekcj nawigacji i sekcj stopki. Wikszo stron aplikacji korzysta z tych samych elementw. Przed
er stron wzorcowych take istniay sposoby umieszczania tych samych elementw na wszystkich stronach. W wikszoci przypadkw przy stosowaniu rnych rozwiza pojawiay si
problemy.
Niektrzy programici zwyczajnie kopiowali i wklejali kod wsplnych sekcji do kadej strony,
ktra go potrzebowaa. To dziaao, ale wymagao duego nakadu pracy. Istnieje jednak problem powaniejszy. Gdy potrzebna bya zmiana w jednej z tych sekcji, wtedy programista zmuszony by do przejrzenia wszystkich stron portalu i wprowadzenia do kadej ze stron podobnych
zmian. To nie jest oczywicie przyjemne. Istniej lepsze sposoby wykorzystania czasu.
W czasach klasycznego jzyka ASP (ang. Active Server Pages) popularnym rozwizaniem byo
umieszczenie wsplnych sekcji w pliku doczanym. Taki plik mg by potem umieszczany na
stronie w taki oto sposb:
<!--
Problem podczas korzystania z plikw doczanych polega na tym, e naleao bra pod uwag
otwarte znaczniki jzyka HTML z nagwkowego pliku doczanego. Znaczniki musiay by
zamknite w gwnym dokumencie lub w kolejnym pliku doczanym (ze stopk). Bardzo trudno byo w takich sytuacjach utrzyma porzdek znacznikw jzyka HTML, zwaszcza wtedy, gdy
nad jednym projektem pracowao kilka osb. Strony internetowe czasami byy pokazywane
w dziwny sposb. Gdzie bowiem po drodze mg znale si niewaciwy lub nieistniejcy
znacznik zamykajcy lub otwierajcy. Trudno byo take pracowa z plikami doczanymi w projektancie formularzy. Uycie plikw doczanych powodowao, e projektant nie by w stanie
wywietli strony tak, jak powinna by pokazywana w przegldarce. Programista koczy pisanie strony w sekcjach i mia nadziej, e wszystkie kawaki w jaki sposb poskadaj si zgodnie
z planem. Wiele godzin byo marnowane na ciganie tabel otwartych w pliku doczanym
i prawdopodobnie zamknitych pniej!
Wraz z wprowadzeniem ASP.NET 1.0 w 2000 roku programici zaczli uywa kontrolek
uytkownika do ukrywania powtarzajcych si sekcji stron WWW. Mona byo na przykad
stworzy stron, ktra zawieraa nagwek, panel nawigacji i stopk, przecigajc i upuszczajc te sekcje kodu na kad stron, ktra tych elementw potrzebowaa.
Ta technika dziaaa, ale take powodowaa pewne problemy. Przed pojawieniem si rodowiska
Visual Studio 2005 oraz technologii ASP.NET 2.0 kontrolki uytkownika prowadziy do problemu omwionego przy okazji plikw doczanych. Podczas pracy w widoku projektanta stron
w rodowisku Visual Studio .NET 2002 i 2003 wsplne obszary byy wywietlane w postaci szarych prostoktw. To utrudniao tworzenie strony. Nie dao si zobaczy, jak tworzona wanie
strona wyglda, dopki projekt nie zosta skompilowany i uruchomiony w przegldarce. Kontrolki uytkownika nie byy te wolne od drugiego problemu dotyczcego plikw doczanych
naleao waciwie sparowa otwierajce i zamykajce znaczniki jzyka HTML umieszczone
w dwch rnych plikach. Generalnie kontrolki uytkownika s lepsze ni pliki doczane, ale to
take nie jest doskonay sposb na rozwizanie omawianych problemw w aplikacjach. Mona
zauway, e w rodowisku Visual Studio poprawiono kilka problemw zwizanych z renderowaniem zawartoci kontrolek uytkownika w oknie projektowym. Kontrolki uytkownika s
dobre wtedy, gdy trzeba umieci na stronach jakie niewielkie sekcje. Problem w dalszym cigu
nie jest rozwizany, gdy zachodzi potrzeba zastosowania ich jako wikszych wzorcw.
W wietle problemw pojawiajcych si przy plikach doczanych i kontrolkach uytkownika
grupa odpowiedzialna za rozwj ASP.NET wpada na pomys stron wzorcowych to nowy
sposb stosowania wzorcw w aplikacjach. Zmieniono dziki temu sposb, w jaki programici
atakowali ten problem. Strony wzorcowe umieszczone s poza tworzonymi stronami. Jest to
przeciwiestwo kontrolek uytkownika, ktre umieszczane byy na stronie i byy wielokrotnie
powielane. Strony wzorcowe pozwalaj oddzieli wsplne obszary, ktre umieszczane s na
kadej stronie, i obszary, ktre s unikatowe dla kadej ze stron. Wkrtce pokaemy, e praca
ze stronami wzorcowymi jest atwa i przyjemna. W kolejnym podpunkcie omwione zostan
podstawowe elementy pracy ze stronami wzorcowymi ASP.NET.
Rysunek 5.2
Jedn z przyjemniejszych rzeczy w trakcie pracy ze stronami wzorcowymi jest to, e podczas
tworzenia stron z zawartoci w IDE mona zobaczy podgld wzorca. W zwizku z tym, e
podczas pracy widoczna jest caa strona, znacznie atwiej mona j rozwija. Podczas pracy ze
stron z zawartoci wszystkie elementy pochodzce ze wzorca s wyszarzone i nie mona ich
modyfikowa. Elementy, ktre mona edytowa, s wyrnione. Te obszary robocze, zwane
obszarami zawartoci, s zdefiniowane w samej stronie wzorcowej. Na stronie wzorcowej okrela si obszary strony, ktre mog by uywane przez strony z zawartoci. Na stronie wzorcowej, jeeli zachodzi taka potrzeba, moe znale si wicej takich obszarw zawartoci. Na rysunku 5.3 pokazano stron wzorcow z kilkoma obszarami zawartoci.
Rysunek 5.3
Patrzc na zrzut ekranu zaprezentowany na rysunku 5.3, mona zauway dwa zdefiniowane
obszary obszary zawartoci. Obszar zawartoci wyrniany jest w widoku Design za pomoc
jasnego prostokta z ramk w postaci punktw. W ten sposb reprezentowana jest kontrolka
ContentPlaceHolder. Oprcz tego, jeeli najedziemy kursorem myszy nad obszar zawartoci,
nad kontrolk pojawi si jej nazwa (pprzezroczysta). Moment najechania wskanikiem myszy nad kontrolk jest take ujty na rysunku 5.3.
Dla firm i instytucji wykorzystanie stron wzorcowych to idealne rozwizanie. Technologia ta
doskonale odpowiada typowym wymaganiom biznesowym. Wiele firm tworzy wszystkie swoje
strony intranetowe tak, e ich wygld i obsuga s podobne. Mog one teraz udostpni dziaom firmy stron wzorcow .master do stworzenia strony wydziau w intranecie. Taki proces zdecydowanie uatwia zachowanie jednolitego wygldu i podobnej obsugi strony w caym intranecie.
Rysunek 5.4
Dodawanie stron wzorcowych podobne jest do tworzenia zwykych stron .aspx. W oknie dialogowym Add New Item znajduje si element, ktry pozwala utworzy strony wzorcowe. Mona
skorzysta z modelu code-inline lub umieci kod dla strony w oddzielnym pliku. Jeeli nie
umiecimy kodu serwera w oddzielnym pliku, bdzie to oznaczao, e podczas tworzenia strony wzorcowej wykorzystywany jest model code-inline. Pozwala to utworzy pojedynczy plik
.master. Wybranie opcji Place code in separate file oznacza, e podczas tworzenia strony wykorzystywany jest model code-behind. Zaznaczenie pola wyboru Place code in separate file pozwala utworzy pojedyncz stron .master oraz skojarzony z ni plik .master.vb lub .master.cs.
Istnieje take moliwo osadzenia strony wzorcowej w innej stronie wzorcowej poprzez wybranie opcji Select master page. Pokazane jest to w dalszej czci rozdziau.
Przykadowa strona wzorcowa, ktra wykorzystuje model code-inline, pokazana jest na listingu 5.1.
Listing 5.1. Przykadowa strona wzorcowa
<%@ Master Language="VB" %>
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Strona wzorcowa mojej firmy</title>
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<table cellpadding="3" border="1">
<tr style="background:silver">
<td colspan="2">
<h1>Strona domowa mojej firmy</h1>
</td>
</tr>
<tr>
<td>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1"
runat="server">
</asp:ContentPlaceHolder>
</td>
<td>
<asp:ContentPlaceHolder ID="ContentPlaceHolder2"
runat="server">
</asp:ContentPlaceHolder>
</td>
</tr>
<tr>
<td colspan="2">
Copyright 2010 - Moja firma
</td>
</tr>
</table>
</form>
</body>
</html>
Jest to prosta strona wzorcowa. Wspaniae przy tworzeniu stron wzorcowych w Visual Studio
2010 jest to, e mona pracowa z ni w widoku kodu, ale mona rwnie przeczy si do widoku projektanta i utworzy t stron tak, jak tworzy si kad inn stron ASP.NET.
Rozpoczniemy od analizy kodu strony wzorcowej. Pierwszy wiersz to dyrektywa:
<%@ Master Language="VB" %>
Zamiast uywa dyrektywy Page tak, jak w zwykych stronach .aspx, dla stron wzorcowych uywa si dyrektywy Master. Pokazana strona wzorcowa korzysta tylko z jednego atrybutu, Language. Wartoci atrybutu Language jest w tym przypadku VB, ale oczywicie mona uy C#, jeeli
tworzy si strony wzorcowe z wykorzystaniem tego jzyka.
Pozostaa cz kodu strony wzorcowej wyglda tak samo jak kada inna strona .aspx. Mona
korzysta z kontrolek serwerowych, zwykego kodu w HTML-u i tekstu, obrazkw, zdarze oraz
wszystkich innych skadnikw wykorzystywanych na stronach .aspx. Oznacza to, e strona
wzorcowa moe obsugiwa zdarzenie Page_Load oraz inne potrzebne zdarzenia.
W kodzie pokazanym na listingu 5.1 warto zwrci uwag na wykorzystanie nowej kontrolki
serwerowej kontrolki <asp:ContentPlaceHolder>. Kontrolka definiuje obszary strony wzorcowej, w ktrym strona z zawartoci moe umieszcza swoje elementy:
<tr>
<td>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1"
runat="server">
</asp:ContentPlaceHolder>
</td>
<td>
<asp:ContentPlaceHolder ID="ContentPlaceHolder2"
W pokazanej stronie wzorcowej istniej dwa zdefiniowane obszary, gdzie mona umieszcza
zawarto. Strona zawiera oprcz tego obszar nagwka i obszar stopki. Zdefiniowane s take
dwa obszary, w ktrych strony dziedziczce mog wstawia swoje wasne elementy. Przyjrzyjmy
si teraz, w jaki sposb strona z zawartoci wykorzystuje t stron wzorcow.
Rysunek 5.5
Po nazwaniu strony z zawartoci i klikniciu przycisku Add w oknie dialogowym Add New
Item pojawi si okno dialogowe Select a Master Page pokazane na rysunku 5.6.
Okno dialogowe pozwala wybra stron wzorcow, na podstawie ktrej tworzona bdzie strona
z zawartoci. Wyboru mona dokona spord wszystkich stron wzorcowych dostpnych
w aplikacji. W tym przypadku wybierzmy stron wzorcow pokazan na listingu 5.1 i kliknijmy
OK. W ten sposb tworzona jest nowa strona z zawartoci. Nowa strona jest zwyk stron
.aspx. Zawiera tylko kilka wierszy kodu. Pokazano to na listingu 5.2.
Rysunek 5.6
Listing 5.2. Utworzona strona z zawartoci
<%@ Page Language="VB" MasterPageFile="~/Wrox.master" Title="" %>
<script runat="server">
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"
Runat="Server">
</asp:Content>
Strona z zawartoci nie rni si bardzo od typowej strony .aspx, ktr mielimy okazj tworzy wczeniej. Du rnic jest obecno w dyrektywie Page atrybutu MasterPageFile. Dziki
wykorzystaniu tego atrybutu mona wskaza, e ta konkretna strona .aspx tworzona jest na podstawie innej strony. Pooenie strony wzorcowej w aplikacji okrelone jest przez warto atrybutu MasterPageFile.
Kolejn du rnic jest to, e strona nie zawiera adnych znacznikw <form id="form1"
runat="server"> ani adnych otwierajcych i zamykajcych znacznikw jzyka HTML, ktre
w normalnej stronie .aspx powinny by obecne.
Strona z zawartoci moe si wydawa prosta, ale jeeli przeczymy si na widok projektanta
w Visual Studio 2010, wtedy bdzie mona dostrzec moliwoci, jakie daj strony wzorcowe.
Dziki dziedziczeniu wizualnemu otrzymujemy rezultat pokazany na rysunku 5.7.
Na pokazanym zrzucie ekranu mona zauway, e aby wykorzysta stron wzorcow z pliku
Wrox.master poprzez dziedziczenie wizualne, wystarczy doda atrybut MasterPageFile do dyrektywy Page. Korzystajc z widoku projektanta w rodowisku Visual Studio, mona take zobaczy, ktra strona wzorcowa jest obecnie uywana. Nazwa aktywnej strony wzorcowej pokazywana jest w prawym grnym rogu widoku Design. Jeeli sprbujemy klikn na wyszarzonym
obszarze reprezentujcym cz dziedziczon ze strony wzorcowej, wtedy bdzie mona zobaczy, e kursor si zmienia. Sygnalizuje to, e wykonanie tej operacji jest niemoliwe. Pokazano
to na rysunku 5.8 (kursor znajduje si nad sowem firmy).
Rysunek 5.7
Rysunek 5.8
Wszystkie wsplne obszary zdefiniowane w stronie wzorcowej s wyszarzone. Obszary zawartoci oznaczone w stronie wzorcowej za pomoc kontrolki serwerowej <asp:ContentPlaceHolder> s
pokazane wyranie i umoliwiaj wstawienie dodatkowych elementw. Do tych obszarw zawartoci mona wstawi dowolne elementy. Odbywa si to tak samo, jak w przypadku zwykych
stron .aspx. Przykad wykorzystania strony wzorcowej w stronie z zawartoci przedstawiono
na listingu 5.3.
Listing 5.3. Strona z zawartoci korzystajca ze strony wzorcowej Wrox.master
<%@ Page Language="VB" MasterPageFile="~/Wrox.master" %>
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object,
ByVal e As System.EventArgs)
Label1.Text = "Witaj, " & TextBox1.Text & "!"
End Sub
</script>
<asp:Content ID="Content1" ContentPlaceHolderId="ContentPlaceHolder1"
runat="server">
<b>Wpisz swoje imi :</b><br />
<asp:Textbox ID="TextBox1" runat="server" />
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Zatwierd"
OnClick="Button1_Click" /><br />
<br />
<asp:Label ID="Label1" runat="server" Font-Bold="True" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderId="ContentPlaceHolder2"
runat="server">
<asp:Image ID="Image1" runat="server" ImageUrl="wrox.gif" />
</asp:Content>
<%@ Page Language="C#" MasterPageFile="~/Wrox.master" %>
<script runat="server">
protected void Button1_Click(object sender, System.EventArgs e)
{
Label1.Text = "Witaj, " + TextBox1.Text + "!";
}
</script>
Od razu mona zauway rnice. Jak ju wspomnielimy, strona nie posiada znacznika <form
id="form1" runat="server"> ani adnego otwierajcego lub zamykajcego znacznika <html>.
Te znaczniki nie s umieszczone na tej stronie, poniewa znajduj si na stronie wzorcowej.
Warto take zwrci uwag na now kontrolk serwerow <asp:Content>.
<asp:Content ID="Content1" ContentPlaceHolderId="ContentPlaceHolder1"
runat="server">
...
</asp:Content>
Rysunek 5.9
VB (plik code-behind)
Partial Class MyContentPage
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = "Witaj, " & TextBox1.Text & "!"
End Sub
End Class
C# (plik code-behind)
public partial class MyContentPage : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "Witaj, " + TextBox1.Text + "!";
}
}
Pomimo e strona wzorcowa korzysta z modelu code-inline, mona z atwoci tworzy strony z zawartoci (na przykad takie, jak ta pokazana na listingu 5.4), ktre wykorzystuj model
code-behind. Strony w dalszym cigu bd dziaay doskonale.
Samo czenie dwch modeli pisania kodu to nie wszystko, co mona zrobi przy stosowaniu
stron wzorcowych. Mona take miesza jzyki programowania uywane podczas pisania stron
wzorcowych i stron z waciw zawartoci. To, e strona wzorcowa utworzona jest za pomoc
jzyka C#, nie oznacza wcale, e jzyk C# musi by uywany na wszystkich stronach, ktre tej
strony wzorcowej uywaj. Strony z zawartoci mog by tworzone take w jzyku Visual Basic. Jako dobry przykad stwrzmy stron wzorcow w jzyku C#, ktra korzysta ze zdarzenia Page_Load, a nastpnie dodajmy do tego stron z zawartoci, ktra zostaa napisana w jzyku Visual Basic. Po zrobieniu wszystkiego jak naley sprbujmy uruchomi stron. Dziaa ona
doskonale. Oznacza to, e nawet wtedy, gdy strona wzorcowa napisana jest w jednym z dostpnych jzykw .NET, grupy programistyczne korzystajce podczas tworzenia aplikacji ze strony wzorcowej mog uywa takiego jzyka .NET, jakiego tylko chc. Warto pokocha otwarto,
ktr oferuje nam platforma .NET.
Oprcz wskazywania uywanej strony wzorcowej na poziomie strony istnieje drugi sposb wykonania tego samego zadania. Stron wzorcow mona okreli za pomoc pliku konfiguracyjnego aplikacji web.config. Pokazano to na listingu 5.5.
Wskazanie strony wzorcowej w pliku web.config spowoduje, e kada strona z zawartoci tworzona w aplikacji bdzie dziedziczya po okrelonej stronie wzorcowej. Jeeli stron zadeklarujemy w pliku web.config, wtedy bdzie mona tworzy dowoln ilo stron z zawartoci
i wszystkie one bd korzystay z podanej strony wzorcowej. Po wskazaniu strony w ten sposb
dyrektyw Page mona skonstruowa w nastpujcy sposb:
<%@ Page Language="VB" %>
Mona w atwy sposb przesoni to ustawienie dla caej aplikacji, deklarujc na stronie z zawartoci inn stron wzorcow:
<%@ Page Language="VB" MasterPageFile="~/MyOtherCompany.master" %>
Wskazanie strony wzorcowej w pliku web.config nie oznacza, e wszystkie strony .aspx musz
korzysta z tej strony wzorcowej. Jeeli stworzymy i uruchomimy zwyk stron Web Form,
rodowisko ASP.NET bdzie wiedziao, e nie jest to strona z zawartoci. Strona ta zostanie
przetworzona tak samo, jak zwyka strona .aspx.
Jeeli zachodzi potrzeba zastosowania strony wzorcowej tylko do okrelonego zestawu stron
(na przykad do stron umieszczonych w okrelonym katalogu aplikacji), wtedy mona uy
elementu <location> w pliku web.config. Pokazano to na listingu 5.6.
Listing 5.6. Wskazywanie strony wzorcowej dla okrelonego katalogu w pliku web.config
<configuration>
<location path="AdministrationArea">
<system.web>
<pages masterPageFile="~/WroxAdmin.master" />
</system.web>
</location>
</configuration>
Dodajc w pliku web.config sekcj <location>, mona wskaza, e okrelony katalog (AdministrationArea) bdzie uywa innego pliku strony wzorcowej. Zrealizowane jest to poprzez uycie atrybutu path elementu <location>. Wartoci atrybutu path moe by tak jak tutaj nazwa
katalogu, ale moe to by take okrelona strona na przykad AdminPage.aspx.
na, naley w kodzie strony z zawartoci uy obiektu Master. Obiekt Master posiada wygodn
waciwo o nazwie Title. Wartoci tej waciwoci jest tytu strony uywany przez strony
z zawartoci. Mona go zmieni w sposb pokazany na listingu 5.7.
Listing 5.7. Kod zmieniajcy tytu strony z zawartoci
<%@ Page Language="VB" MasterPageFile="~/Wrox.master" %>
<script runat="server">
Protected Sub Page_LoadComplete(ByVal sender As Object, _
ByVal e As System.EventArgs)
Master.Page.Title = "Strona zostaa wygenerowana: " & _
DateTime.Now.ToString()
End Sub
</script>
<%@ Page Language="C#" MasterPageFile="~/Wrox.master" %>
<script runat="server">
protected void Page_LoadComplete(object sender, EventArgs e)
{
Master.Page.Title = "Strona zostaa wygenerowana: " +
DateTime.Now.ToString();
}
</script>
Teraz na stronie wzorcowej znajduje si kontrolka Label, do ktrej mona uzyska dostp
z poziomu strony z zawartoci. Jest kilka sposobw na wykonanie tego zadania. Pierwszy z nich
to wykorzystanie metody FindControl(), ktra jest udostpniana przez stron wzorcow. Taki
sposb rozwizania problemu pokazano na listingu 5.9.
Listing 5.9. Pobieranie wartoci Text kontrolki Label na stronie z zawartoci
<%@ Page Language="VB" MasterPageFile="~/wrox.master" %>
<script runat="server" language="vb">
Protected Sub Page_LoadComplete(ByVal sender As Object, _
ByVal e As System.EventArgs)
Label1.Text = CType(Master.FindControl("Label1"), Label).Text
End Sub
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Label2.Text = "Witaj, " & TextBox1.Text & "!"
End Sub
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderId="ContentPlaceHolder1"
runat="server">
<b>Twj numer GUID ze strony wzorcowej to:<br />
<asp:Label ID="Label1" runat="server" /></b><p>
<b>Wpisz swoje imi :</b><br />
<asp:Textbox ID="TextBox1" runat="server" />
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Zatwierd"
OnClick="Button1_Click" /><br />
<br />
<asp:Label ID="Label2" runat="server" Font-Bold="True" /></p>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderId="ContentPlaceHolder2"
runat="server">
<asp:Image ID="Image1" runat="server" ImageUrl="Wrox.gif" />
</asp:Content>
<%@ Page Language="C#" MasterPageFile="~/wrox.master" %>
<script runat="server">
protected void Page_LoadComplete(object sender, EventArgs e)
{
Label1.Text = (Master.FindControl("Label1") as Label).Text;
}
protected void Button1_Click(object sender, EventArgs e)
{
Label2.Text = "<b>Witaj " + TextBox1.Text + "!</b>";
}
</script>
W przykadzie pokazanym na listingu 5.8 strona wzorcowa tworzy identyfikator GUID i zapamituje go w postaci wartoci tekstowej w kontrolce serwerowej Label. Sama kontrolka jest take umieszczona na stronie wzorcowej. Wartoci ID kontrolki Label jest Label1. Strona wzorcowa generuje identyfikator GUID tylko podczas obsugi pierwszego dania tej konkretnej
strony. Od tego momentu strona generowana jest wraz z kontrolk uzupenion t wartoci.
W powyszym przykadzie pokazano stron wzorcow, ktra udostpnia wasn waciwo PageHeadingTitle. Domyln wartoci waciwoci jest Moja firma. Warto waciwoci
umieszczana jest w kodzie w HTML-u strony wzorcowej, pomidzy znacznikami <h1>. Dziki temu
domylna warto staje si nagwkiem uywanym przez stron wzorcow. Pomimo e strona
wzorcowa posiada ju warto uywan jako tytu, to kada strona z zawartoci korzystajca ze
strony wzorcowej moe nadpisa nagwek <h1>. Cay proces pokazany jest na listingu 5.11.
End Set
End Property
</script>
<%@ Master Language="C#" %>
<script runat="server">
public Label MasterPageLabel
{
get
{
return Label1;
}
set
{
Label1 = value;
}
}
</script>
W tym przypadku publiczna waciwo o nazwie MasterPageLabel1 umoliwia uzyskanie dostpu do kontrolki Label, ktrej ID jest rwne Label1. Mona teraz utworzy egzemplarz waciwoci MasterPageLabel1 na stronie z zawartoci i nadpisa dowolny atrybut kontrolki serwerowej Label. Jeeli trzeba na przykad zmieni rozmiar identyfikatora GUID, ktry jest
tworzony przez stron wzorcow i wywietlany przez kontrolk serwerow Label1, wtedy wystarczy zwyczajnie nadpisa atrybut Font.Size tej kontrolki Label. Pokazano to na listingu 5.13.
Listing 5.13. Nadpisywanie atrybutu kontrolki Label umieszczonej na stronie wzorcowej
<%@ Page Language="VB" MasterPageFile="~/Wrox.master" %>
<%@ MasterType VirtualPath="~/Wrox.master" %>
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Master.MasterPageLabel1.Font.Size = 25
End Sub
</script>
<%@ Page Language="C#" MasterPageFile="~/Wrox.master" %>
<%@ MasterType VirtualPath="~/Wrox.master" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Master.MasterPageLabel1.Font.Size = 25;
}
</script>
Takie podejcie moe by najbardziej efektywne spord tych, ktre pozwalaj pobra referencj
do dowolnej kontrolki serwerowej udostpnianej przez stron wzorcow.
Aby umieci domyln tre w obszarze zawartoci na stronie wzorcowej, wystarczy na samej
stronie wzorcowej umieci kontrolk serwerow ContentPlaceHolder. Kada strona z zawartoci dziedziczca po tej stronie wzorcowej dziedziczy take domyln tre. Na listingu 5.15
pokazano stron z zawartoci, ktra przesania tylko jeden obszar zawartoci strony wzorcowej.
Listing 5.15. Przesanianie domylnej zawartoci na stronie z zawartoci
<%@ Page Language="VB" MasterPageFile="~/MasterPage.master" %>
<asp:Content ID="Content3" ContentPlaceHolderId="ContentPlaceHolder2"
runat="server">
Tu jest jaka nowa zawarto
.
</asp:Content>
Pokazany kod pozwala utworzy stron z jednym obszarem zawartoci, ktry dziedziczony jest
po samej stronie wzorcowej, oraz z drugim obszarem, pochodzcym ze strony z zawartoci
(zobacz rysunek 5.10).
Rysunek 5.10
Kolejnym interesujcym udogodnieniem jest to, e podczas pracy z obszarami zawartoci w widoku projektanta Visual Studio 2010 pojawiaj si inteligentne znaczniki, ktre uatwiaj prac
z domyln treci.
Rozpoczynajc prac ze stronami z zawartoci, mona zauway, e w kontrolkach serwerowych Content na pocztku pojawia si domylna zawarto. Mona zmieni t zawarto, klikajc inteligentny znacznik i wybierajc z menu podrcznego opcj Create Custom Content.
Opcja pozwala przesoni zawarto strony wzorcowej i wstawi swoj wasn zawarto. Po
umieszczeniu wasnych elementw wewntrz obszaru zawartoci inteligentny znacznik pokae
inn opcj Default to Masters Content. Opcja pozwala przywrci domyln zawarto strony wzorcowej i usun wszystko, co zostao do tej pory umieszczone w obszarze zawartoci.
Skutkuje to powrotem do zawartoci domylnej. Po wybraniu tej opcji pojawi si ostrzeenie informujce o tym, e wszystkie elementy wstawione w kontrolce serwerowej zostan usunite.
Pokazano to na rysunku 5.11.
Rysunek 5.11
Content
Rysunek 5.12
W tym przypadku strona jest generowana dynamicznie. Strona wzorcowa przypisywana jest
do strony z zawartoci na pocztku procesu konstrukcji strony. Naley zwrci szczegln
uwag na to, e strona z zawartoci musi si spodziewa kontrolek Content, w przeciwnym razie
pojawi si bd.
Rysunek 5.13
Plik ReutersMain.master
To prosta strona wzorcowa, ale doskonale nadaje si do pokazania funkcji osadzania. Gwna
strona wzorcowa jest uywana globalnie w caej firmie. Obejmuje ona kontrolk serwerow
ContentPlaceHolder. Wartoci ID kontrolki jest ContentPlaceHolder1.
Podczas tworzenia podstrony wzorcowej lub osadzonej strony wzorcowej wykonuje si te same
zadania i w ten sam sposb, ktry by stosowany przy tworzeniu zwykej strony wzorcowej.
Z okna dialogowego Add New Item wybierzmy opcj Master Page i upewnijmy si, e zaznaczona jest
opcja Select master page. Pokazano to na rysunku 5.14. W ten sposb po raz kolejny przejdziemy
do okna dialogowego, ktre pozwala wybra stron wzorcow.
Rysunek 5.14
Na listingu 5.18 pokazano, w jaki sposb mona korzysta ze strony wzorcowej w pliku podstrony wzorcowej.
Listing 5.18. Podstrona wzorcowa
<%@ Master Language="VB" MasterPageFile="~/ReutersMain.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"
runat="Server">
<asp:Label ID="Label1" runat="server" BackColor="#E0E0E0" BorderColor="Black"
BorderStyle="Dotted" BorderWidth="2px" Font-Size="Large">
Reuters dla Europy </asp:Label><br /><hr />
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</asp:Content>
Plik ReutersEurope.master
Patrzc na kod zaprezentowanej strony, mona zauway, e nie rni si ona bardzo od typowej strony .aspx, ktra korzysta ze strony wzorcowej. Atrybut MasterPageFile jest ten sam.
Umieszczony jest on jednak w dyrektywie @Master, podczas gdy zwyka strona uywa dyrektywy
@Page. Kontrolka Content2 take uywa atrybutu ContentPlaceHolderId kontrolki Content.
Atrybut czy obszar zawartoci z obszarem zawartoci ContentPlaceHolder1, zdefiniowanym
w gwnej stronie wzorcowej.
Jedn z funkcji ASP.NET jest moliwo podgldu osadzonych stron wzorcowych bezporednio w widoku Design rodowiska Visual Studio 2010. Wersje starsze od rodowiska Visual
Studio 2008 wywietlay bd, gdy prbowano pokaza osadzon stron wzorcow. Na rysunku
5.15 przedstawiono osadzon stron wzorcow w widoku Design rodowiska Visual Studio 2010.
Rysunek 5.15
Jak mona zauway, w pokazanej stronie wzorcowej wartoci atrybutu MasterPageFile w dyrektywie Page jest utworzona podstrona wzorcowa. Dziedziczenie po stronie wzorcowej ReutersEurope powoduje, e wynikowa strona wzorcowa czy w sobie obie strony (ReutersMain.master oraz ReutersEurope.master) w pojedyncz stron wzorcow. Kontrolka Content
strony z zawartoci wskazuje na obszar zawartoci rwnie zdefiniowany przez podstron wzorcow. Jak mona zauway, w kodzie wykorzystano do tego atrybut ContentPlaceHolderId.
W rezultacie otrzymujemy niezbyt adn stron kocow. Pokazano j na rysunku 5.16.
Rysunek 5.16
Obserwujc rezultat kocowy, mona si przekona, e podstrona wzorcowa dziaa cakiem niele.
czas ogldania stron. Mona dziki temu wykorzysta moliwoci oferowane przez konkretne
przegldarki. Sposb wykorzystania wielu stron wzorcowych pokazany jest na listingu 5.20.
Listing 5.20. Strona z zawartoci, ktra moe pracowa z wicej ni jedn stron wzorcow
<%@ Page Language="VB" MasterPageFile="~/Wrox.master"
Mozilla:MasterPageFile="~/WroxMozilla.master"
Opera:MasterPageFile="~/WroxOpera.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderId="ContentPlaceHolder1"
runat="server">
Witaj, wiecie
</asp:Content>
Jak mona zauway na pokazanym listingu strony z zawartoci, moe ona dziaa z trzema
rodzajami stron wzorcowych. Pierwszy z nich korzysta z atrybutu MasterPageFile. To ustawienie domylne, uywane przez te przegldarki, ktre nie speniaj kryteriw naoonych przez
kolejne opcje. Oznacza to, e jeeli danie nie przychodzi od przegldarki Opera lub Mozilla,
wtedy uywana jest domylna strona wzorcowa Wrox.master. Jeeli jednak danie przychodzi od
przegldarki Opera, wtedy uywany jest plik WroxOpera.master. Pokazano to na rysunku 5.17.
Rysunek 5.17
Dziki temu strona bdzie przechowywana w pamici podrcznej serwera przez 10 sekund.
Wielu programistw korzysta z techniki buforowania danych wyjciowych w celu zwikszenia
wydajnoci swoich stron ASP.NET. Takie rozwizanie ma take sens w przypadku stron z danymi, ktre nie trac swojej wanoci zbyt szybko.
W jaki sposb mona zastosowa buforowanie danych wyjciowych stron ASP.NET
w przypadku stron wzorcowych? Po pierwsze, nie mona zastosowa buforowania wycznie
w odniesieniu do stron wzorcowych. Nie mona umieci dyrektywy OutputCache na samej
stronie wzorcowej. Jeeli sprbujemy co takiego zrobi, wtedy podczas drugiego pobrania
strony pojawi si bd. Aplikacja nie bdzie moga odnale strony w pamici podrcznej.
Aby moliwa bya wsppraca mechanizmu buforowania ze stronami wzorcowymi, naley
umieci dyrektyw OutputCache na stronie z zawartoci. W ten sposb buforowana bdzie tre zarwno strony z zawartoci, jak i strony wzorcowej (naley pamita, e w tym
miejscu jest to ju jedna strona). Dyrektywa OutputCache umieszczona na stronie wzorcowej
nie spowoduje, e pojawi si bd. Strona nie bdzie jednak buforowana. Dyrektywa dziaa
tylko ze stronami z zawartoci.
Inn now i ciekaw funkcj rodowiska ASP.NET 4 w obszarze buforowania jest moliwo
sprawdzania stanu na poziomie kontrolek. Cho natychmiast przychodzi na myl moliwo
kontrolowania w ten sposb stanu takich kontrolek jak GridView i innych obejmujcych rozbudowany stan, technik t mona zastosowa take do kontrolek ContentPlaceHolder.
Mona na przykad napisa kod podobny do poniszego:
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"
ViewStateMode="Disabled">
</asp:ContentPlaceHolder>
Przy takich ustawieniach kontrolka ContentPlaceHolder1 nie bdzie korzysta ze stanu, nawet
jeli bd go uywa pozostae elementy strony. Opcja ViewStateMode przyjmuje wartoci Disabled, Enabled i Inherit. Ustawienie Disabled powoduje wyczenie obsugi stanu kontrolki,
opcja Enabled wcza t funkcj, a opcja Inherit spowoduje zastosowanie wartoci okrelonej
w dyrektywie @Page. Wyczenie obsugi stanu prowadzi do poprawy wydajnoci stron.
Kada strona, ktra bdzie korzystaa z technologii AJAX, musi obejmowa kontrolk ScriptManager. Jeeli tworzona strona z zawartoci korzystajca z AJAX-a dziedziczy po stronie wzorcowej, wtedy kontrolka ScriptManager musi by umieszczona na stronie wzorcowej.
UWAGA
Naley pamita, e na stronie moe znajdowa si tylko jedna kontrolka ScriptManager.
Jak mona zauway na listingu 5.21, jedyn rnic pomidzy stron wzorcow w technologii AJAX a standardow stron wzorcow jest obecno w kodzie kontrolki serwerowej ScriptManager. Technik t naley stosowa wtedy, gdy strona wzorcowa korzysta z pewnych udogodnie technologii AJAX, a nawet wtedy, gdy strony z zawartoci w ogle nie korzystaj z AJAX-a.
Kontrolka ScriptManager na stronie wzorcowej jest przydatna take wtedy, gdy istniej pewne
wsplne fragmenty kodu w jzyku JavaScript, wykorzystywane na wszystkich stronach aplikacji. Na
listingu 5.22 pokazano, w jaki sposb mona atwo umieci kod w jzyku JavaScript na wszystkich
stronach korzystajcych ze strony wzorcowej.
Listing 5.22. Wczanie skryptw poprzez stron wzorcow
<%@ Master Language="VB" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
W tym przypadku strona z zawartoci korzysta z kontrolki ScriptManagerProxy w celu dodania na stron kolejnych skryptw. Kontrolka ScriptManagerProxy dziaa dokadnie tak samo jak
gwna kontrolka ScriptManager. Rnica polega na tym, e kontrolka ScriptManagerProxy
przewidziana jest do pracy ze stronami z zawartoci dziedziczcymi po stronach wzorcowych.
Kontrolka ScriptManagerProxy bdzie wsppracowa z kontrolk ScriptManager i wykona
wszystkie wymagane operacje.
Podsumowanie
W czasie tworzenia aplikacji, w ktrej prawie kada strona korzysta ze wsplnego nagwka, stopki lub sekcji nawigacyjnej, dobrym rozwizaniem jest zastosowanie stron wzorcowych. Strony
wzorcowe s atwe w implementacji i pozwalaj wprowadzi zmiany do kadej strony aplikacji
poprzez modyfikacj pojedynczego pliku. Wystarczy sobie wyobrazi, o ile atwiejsze jest takie
zadanie przy aplikacji, ktra zawiera tysice stron.
W niniejszym rozdziale opisano strony wzorcowe w ASP.NET i wyjaniono sposb tworzenia
stron wzorcowych w aplikacjach sieciowych. Oprcz podstawowych zagadnie poruszono take
temat porzdku wywoywania zdarze, buforowanie oraz dostosowanie stron wzorcowych do
konkretnych przegldarek. Na koniec maa rada. Jeeli w aplikacji wystpuje pewien szablon,
naturalnym odruchem powinno by wykorzystanie stron wzorcowych technika ta daje olbrzymie moliwoci.