wtorek, 12 stycznia 2010

Strony Wzorcowe (Master Pages) [PL]

PromujPrzyjrzyjmy się bliżej mechanizmowi stron wzorcowych (Master Pages) dostępnemu w ASP.NET.
Notka: Niniejsze opracowanie powstało w oparciu o następujące źródła:
  1. "MCTS Self-Paced Training Kit (Exam 70-562): Microsoft .NET Framework 3.5—ASP.NET Application Development", Autorzy: Mike Snell; Glenn Johnson; Tony Northrup; and GrandMasters, Wydawnictwo: Microsoft Press, 2009
  2. "Microsoft Visual C# 2005 Księga eksperta", Autor: Kevin HoffMan, Wydawnictwo: Helion, 2007
  3. http://msdn.microsoft.com/ 
Na samym początku odpowiedzmy sobie na pytanie dlaczego powstał mechanizm stron wzorcowych (Master Pages)? Powszechnie wiadomo, że w przypadku aplikacji Web spójny i przemyślany interfejs użytkownika to jedna z podstaw dobrej aplikacji, do której będą chcieli wracać użytkownicy. Zastosowanie stron wzorcowych pozwala naszej aplikacji Web w prosty sposób utrzymać spójny wygląd i sposób obsługi. Przed wprowadzeniem tego mechanizmu programista tworzący aplikacją WEB miał ciężkie życie i musiał wybierać pomiędzy jedną z nastepujących opcji:
  • konieczność powielania kodu,
  • wykorzystanie iFrame,
  • dołączanie (include) fragmentów wspólnego kodu,
  • wykorzystanie mechanizmu własnych kontrolek.
Na szczęście począwszy od .NET 2.0 pojawił się w ASP.NET mechanizm stron wzorcowych. Umożliwiają one centralizację wspólnych funkcjonalności, tak by modyfikację wprowadzać w jednym miejscu. Pozwalają na stworzenie jednego zestawu kontrolek i i przypisanie go do zbioru stron (dzięki temu możemy np. na stworzyć wspólnego menu). Zapewniają jednocześnie szczegółową kontrolę nad końcowym układem  strony, poprzez umożliwienie kontroli nad osadzonymi kontrolkami. Mają funkcjonalny model obiektowy, który pozwala na dostosowanie stron wzorcowych z poziomu indywidualnych stron.
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:

  1. Content page PreInit event.
  2. Master page controls Init event.
  3. Content controls Init event.
  4. Master page Init event.
  5. Content page Init event.
  6. Content page Load event.
  7. Master page Load event.
  8. Master page controls Load event.
  9. Content page controls Load event.
  10. Content page PreRender event.
  11. Master page PreRender event.
  12. Master page controls PreRender event.
  13. Content page controls PreRender event.
  14. Master page controls Unload event.
  15. Content page controls Unload event.
  16. Master page Unload event.
  17. 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.
W następnej części zostanie pokazany prosty przykład wykorzystujący mechanizm stron wzorcowych.
Promuj

1 komentarz:

Posty powiązane / Related posts