Notka: Niniejsze opracowanie powstało w oparciu o następujące źródła:
|
- konieczność powielania kodu,
- wykorzystanie iFrame,
- dołączanie (include) fragmentów wspólnego kodu,
- wykorzystanie mechanizmu własnych kontrolek.
Poniższy rysunek pokazuje koncepcyjnie jak działa mechanizm stron wzorcowych:
Patrząc od strony praktycznej, dla tworzonego serwisu Web, strona
wzorcowa, to plik z rozszerzeniem .master. Jest ona podobna do
standardowych stron typu .aspx, zawiera kod HTML, kontrolki, a nawet
własny plik code-behind. W odróżnieniu, dziedziczy ona po klasie
MasterPage oraz posiada dyrektywą @ Master (dla zwykłych stron jest to
@ Page). Zawiera specjalne kontrolki: ContentPlaceHolder, które
definiują miejsce wykorzystywane przez strony zawartości.
Oczywiście
serwer WWW przetwarza strony wzorcowe i zawartości, by w efekcie
zwrócić do klienta (przeglądarki internetowej) konkretną stronę, w
praktyce dzieje się to następująco:
- Użytkownik żąda określoną stronę zawartości poprzez podanie URL
- Strona jest ładowana, dyrektywa @ Page jest odczytywana, stamtąd pobierane są informacje na temat strony wzorcowej i strona wzorcowa jest odczytywana
- W przypadku gdy żądanie określonej strony jest wykonywane po raz pierwszy, obie strony są kompilowane
- Kontrolki strony zawartości są wstawiane do odpowiednich kontrolek (ContentPlaceHolder) strony wzorcowej
- Rezultat poprzedniego kroku jest renderowany i przesyłany do przeglądarki klienta jako jedna strona.
Oczywiście powyższy opis przekłada się na generowane podczas przygotowania strony zdarzenia, ich kolejność jest następująca:
- Content page PreInit event.
- Master page controls Init event.
- Content controls Init event.
- Master page Init event.
- Content page Init event.
- Content page Load event.
- Master page Load event.
- Master page controls Load event.
- Content page controls Load event.
- Content page PreRender event.
- Master page PreRender event.
- Master page controls PreRender event.
- Content page controls PreRender event.
- Master page controls Unload event.
- Content page controls Unload event.
- Master page Unload event.
- Content page Unload event.
Strony Wzorcowe w praktyce
Przejdźmy do zagadnień praktycznych i zobaczmy jak tworzyć strony wzorcowe i strony zawartości:- Aby dodać stronę wzorcową należy:
- dodać nowy element do projektu: "Add -> New Item" i wybranie: "Master Page" oraz nazwy strony wzorcowej
- nowo dodaną stronę wzorcową należy dostosować (podobnie jak przypadku standardowych stron aspx możemy używać styli, tabel, kontrolek itp...), ważne jest by znajdowała się na stronie wzorcowej kontrolka typu ContenPlaceHolder.
- Strony zawartości są natomiast tworzone poprzez:
- jak każda strona .aspx, standardowo poprzez dodanie nowego elementu do projektu, jednakże przy dodawaniu należy:
- zaznaczyć chęć wyboru strony wzorcowej, checkbox: "Select Master Page" (tak mówi Training Kit wspomniany w literaturze wcześniej, ja takiej opcji nie odnalazłem)
- przy dodawaniu nowego elementu wybrać szablon: "Web Content Form"
- dodać zwykłą stronę i później w źródle strony dodać atrybut MasterPageFile do dyrektywy @ Page (tutaj pewna uwaga: należy zwrócić uwagę by strona nie zawierała standardowych nagłówków HTML (jak to bywa domyślnie) a tylko elementy typu ContentPlaceHolder.
- dodanie odpowiedniej zawartości
Oczywiście
strona zawartości musi być przywiązana do strony wzorcowej, aby
mechanizm działał. ASP.NET przewiduje kilka sposobów na przywiązywanie
strony wzorcowej do strony zawartości.
- dla jednej strony można to zrobić w definicji strony w dyrektywie @ Page: <%@ Page Title="" Language="C#" MasterPageFile="~/MySite.Master" %>
- dla projektu w pliku Web.config: <pages masterPageFile="~/MySite.Master" /> (UWAGA: zawartość strony .aspx musi zawierać tylko elementy typu Content, bez standardowych nagłówków i ciała HTML)
- dla pewnego folderu (odpowiedni plik Web.config powinien być dodany do folderu)
Na koniec chciałbym jeszcze wspomnieć o pewnych dodatkowych cechach mechanizmu stron wzorcowych:
- Ustawienia strony wzorcowej mają priorytet nad ustawieniami stron zawartości (Przykład: ustawienie EnableViewState = true w stronie zawartości i na wartość false w stronie wzorcowej, powoduje wyłączenie mechanizmu view state)
- Strona zawartości jest świadoma swojej strony wzorcowej i ma dostęp do properties i kontrolek strony wzorcowej:
- W przypadku properties należy w stronie dodać dyrektywę @ MasterType: <%@ MasterType VirtualPath="~/MySite.Master" %> wtedy do properties można się odwoływać z wykorzystaniem właściwości Master strony aspx.
- W przypadku kontrolek można wykorzystać Master.FindControl
- Strony wzorcowe mogą być w sobie zagnieżdżone
- Można dynamicznie (z poziomu kodu, podczas działania) zmieniać stronę wzorcową, w tym celu modyfikujemy właściwość MasterPageFile dla strony zawartości.
zobacz cały materiał:
OdpowiedzUsuń70-562: Dostosowanie i Personalizacja Aplikacji Web [PL]