Navigace

Hlavnφ menu

 

ASP.NET 2.0 - Master Pages

P°i tvorb∞ slo₧it∞jÜφch webov²ch aplikacφ je pot°eba, aby vÜechny strßnky aplikace m∞ly stejn² vzhled a n∞kolik spoleΦn²ch Φßstφ, kterΘ se budou chovat na vÜech strßnkßch stejn∞. Ve starÜφ verzi ASP.NET se tento problΘm obvykle °eÜφ p°idßvßnφm ovlßdacφch prvk∙, kterΘ obsahujφ tyto spoleΦnΘ Φßsti, do ka₧dΘ strßnky aplikace. V novΘ verzi ASP.NET je mo₧nΘ tento problΘm °eÜit pomocφ "master pages".

WebovΘ aplikaci se vytvo°φ jedna master page, kterß obsahuje spoleΦnΘ prvky a mß vyznaΦenß mφsta, do kter²ch lze vklßdat obsah. Ostatnφ strßnky (content pages) potΘ k master page dopl≥ujφ pouze po₧adovan² obsah.

Pokud si chcete p°i Φtenφ Φlßnku prochßzet zdrojovΘ k≤dy, nebo se podφvat jak aplikace fungujφ, jsou vßm k dispozici.

Zßklady prßce s Master Pages

V nßsledujφcφ ukßzce vytvo°φme jednu master page a jednu strßnku, kterß bude dodßvat k tΘto strßnce obsah (vÜe bude hned vysv∞tleno).

Master page

<!-- MasterPage.master -->
<%@ Master Language="C#" %>
<html><head runat="server">
   <title>Master pages demo</title>
</head><body>
<form id="form1" runat="server">

   <!-- Cast spolecna pro vsechny stranky -->
   <h1>Nadpis z master page</h1>
   <div id="menu">
      <a href="first.aspx">Prvni stranka</a>
      <a href="second.aspx">Druha stranka</a>
   </div>

   <!-- Zde se bude vkladat obsah stranek -->
   <asp:contentplaceholder id="mainContent" runat="server">
   </asp:contentplaceholder>

</form>
</body></html>

Tato master page vypadß na prvnφ pohled jako ·pln∞ obyΦejnß ASP.NET strßnka. JedinΘ rozdφly jsou v tom, ₧e soubor mß mφsto p°φpony aspx p°φponu master a mφsto direktivy Page obsahuje direktivu Master. Vnit°n∞ existuje jeÜt∞ jeden rozdφl, a sice ₧e normßlnφ strßnka je potomkem t°φdy System.¡Web.¡UI.¡Page a master page d∞dφ od System.¡Web.¡UI.¡MasterPage. V master page m∙₧e b²t, krom∞ libovoln²ch ostatnφch ovlßdacφch prvk∙, jeden nebo vφce prvk∙ asp:ContentPlaceHolder, kterΘ urΦujφ mφsta, kam mohou strßnky s obsahem (content pages) vklßdat obsah.

Content page

<!-- First.aspx -->
<%@ Page Language="C#" Title="Hello world"
      MasterPageFile="~/MasterPage.master" %>

<!-- Vlozit obsah do ContentPlaceHolderu -->
<asp:Content ContentPlaceHolderID="mainContent" runat="server">
   Hello world from First.aspx!
</asp:Content>

Tato content page dopl≥uje obsah do master page, kterß je urΦena v direktiv∞ Page, a to pomocφ atributu MasterPageFile. Dßle je do direktivy Page p°idßn atribut Title, proto₧e samotn² element title se nachßzφ v master page a nenφ tedy mo₧nΘ titulek nastavovat p°φmo (z tohoto d∙vodu je takΘ pot°eba, aby element head v master page obsahoval runat="server"). JednotlivΘ fragmenty strßnky se do master page vklßdajφ pomocφ ovlßdacφho prvku asp:Content, kterΘmu je pot°eba p°edat ID ContetnPlaceHolderu z master page pomocφ atributu ContetnPlaceHolderID.

V²chozφ obsah Φßsti

Krom∞ rozlo₧enφ a chovßnφ spoleΦn²ch ovlßdacφch prvk∙ lze v master page takΘ urΦit v²chozφ obsah jednotliv²ch Φßstφ, kter² se pou₧ije, pokud v content page nebude asp:Content s ContentPlaceHolderID odpovφdajφ Φßsti. Takto lze nap°φklad vytvo°it menu, kterΘ bude na v∞tÜin∞ strßnek stejnΘ, ale v p°φpad∞ pot°eby m∙₧e b²t u n∞jakΘ strßnky mφrn∞ upravenΘ. V²chozφ obsah Φßstφ se vklßdß v master page dovnit° tagu asp:ContentPlaceHolder, jak je vid∞t v nßsledujφcφ ukßzce:

<!-- Zde se bude vkladat menu stranky -->
<asp:contentplaceholder id="menuContent" runat="server">

   <!-- Vychozi odkazy v menu, ktere je mozne zmenit -->
   <a href="first.aspx">Prvni stranka</a>
   <a href="second.aspx">Druha stranka</a>

</asp:contentplaceholder>

Podpora ve Visual Studiu 2005

Novß verze Visual Studia proÜla °adou velmi podstatn²ch zm∞n. Nejzßsadn∞jÜφ zm∞nou je, ₧e se Visual Studio sna₧φ v co nejmenÜφ mφ°e zasahovat do k≤du napsanΘho p°i tvorb∞ strßnky ruΦn∞. Dßle Visual Studio generuje k≤d, kter² je nejen validnφ XHTML, ale i p°ehledn². Dφky tomu je takΘ zajφmavß jeho podpora pro master pages, proto₧e dokß₧e usnadnit mnoho obvykl²ch operacφ.

Strßnky master pages je mo₧nΘ p°idßvat do projektu pomocφ dialogu "Add new item" a p°i p°idßvßnφ aspx strßnky je mo₧nΘ rovnou vybrat master page, kterß se mß pro strßnku pou₧φvat. Po otev°enφ master page v "design view" lze do strßnky p°idßvat krom∞ obvykl²ch ovlßdacφch prvk∙ i ovlßdacφ prvky typu asp:ContentPlaceHolder. DalÜφ p°φjemnou zm∞nou je, ₧e ovlßdacφ prvky lze z panelu nßstroj∙ p°etahovat nejen p°i zobrazenφ v "design view", ale i v "code view".

Content page ve Visual Studiu
Strßnka pou₧φvajφcφ master page ve Visual Studiu 2005

P°i otev°enφ strßnky, kterΘ pou₧φvß master page, Visual Studio nalezne danou master page a zobrazφ strßnku p°esn∞ tak, jak se bude zobrazovat ve webovΘm prohlφ₧eΦi. VÜimn∞te si, ₧e obsah, kter² se naΦφtß z master page, je zobrazen Üediv∞ a nenφ mo₧no ho upravovat. M∞nit lze pouze Φßsti strßnky, kterΘ jsou do master page vklßdßny, a pokud strßnka jeÜt∞ neobsahuje prvky asp:Content pro dan² asp:ContentPlaceHolder, lze je rovnou v "design view" p°idat.

Komplikovan∞jÜφ strßnky

Vno°enΘ master pages

P°i tvorb∞ komplikovan∞jÜφ aplikace m∙₧e b²t pot°eba, aby m∞ly vÜechny strßnky spoleΦnou pouze hlaviΦku a patiΦku, a zb²vajφcφ Φßsti se dßle liÜily podle toho, v jakΘ Φßsti aplikace se strßnka nachßzφ. Toho je mo₧no dosßhnout vytvo°enφm vno°en²ch master pages. Ve zkratce vÜe funguje tak, ₧e vytvo°φme jednu master page, kterß bude obsahovat prvky spoleΦnΘ pro vÜechny strßnky (nap°φklad Global.master), a dßle n∞kolik dalÜφch master pages, kterΘ majφ jako master page nastavenu strßnku Global.master. V t∞chto strßnkßch se p°idajφ prvky specifickΘ pro jednotlivΘ sekce aplikace a prvky typu asp:ContentPlaceHolder, do kter²ch se bude vklßdat samotn² obsah.

Nested master pages
Mo₧nΘ pou₧itφ vno°en²ch master pages ve slo₧itΘ aplikaci

Vytvo°enφ master page, kterΘ d∞dφ vzhled od hlavni master page, nenφ slo₧itΘ. StaΦφ vytvo°it obvyklou master page a do direktivy Master p°idat atribut MasterPageFile, kter²m urΦφme strßnku, od nφ₧ chceme master page odvozovat. PotΘ staΦφ odstranit obsah strßnky a nahradit ho jednφm nebo vφce ovlßdacφmi prvky asp:Content se sprßvn∞ nastaven²mi vlastnostmi ContentPlaceHolderID. V mφstech, kam budou obsah dodßvat jednotlivΘ content pages, staΦφ vlo₧it ji₧ znßm² prvek asp:ContentPlaceHolder.

<!-- Master page, ktera je odvozena od Global.master -->
<%@ Master Language="C#" MasterPageFile="~/Global.master" %>
<asp:Content ContentPlaceHolderID="mainContent" runat="server">

   <!-- Cast spolecna pro vsechny odvozene stranky -->
   <b>Produkty:</b>
   <a href="product1.aspx">Prvni produkt</a>
   <a href="product2.aspx">Druhy produkt</a>

   <!-- Cast ktera se bude v odvozenych strankach menit -->
   <asp:ContentPlaceHolder ID="productsContent" runat="server">
   </asp:ContentPlaceHolder>

</asp:Content>

Volba master page podle za°φzenφ

DalÜφ u₧iteΦnou vlastnostφ master pages je mo₧nost naΦφtat r∙znou master page pro r∙znß za°φzenφ nebo webovΘ prohlφ₧eΦe. Tato vlastnost existuje v ASP.NET 2 hlavn∞ kv∙li podpo°e mobilnφch za°φzenφ, ale lze ji pou₧φt i k odliÜenφ prohlφ₧eΦ∙. Seznam vÜech za°φzenφ a prohlφ₧eΦ∙ je ulo₧en v podadresß°i CONFIG\Browsers adresß°e, kam se instaluje .NET Framework. Identifikace za°φzenφ a prohlφ₧eΦ∙ je rozd∞lena do vφce soubor∙, tak₧e je mo₧nΘ velmi snadno p°idßvat novΘ.

Jinß master page pro r∙znΘ prohlφ₧eΦe
Jinß master page pro r∙znΘ prohlφ₧eΦe

Specifickß master page pro r∙znß za°φzenφ se nastavuje v direktiv∞ Page, a to pomocφ atributu MasterPageFile, p°ed kter² se p°idß dvojteΦkou odd∞lenß p°edpona odpovφdajφcφ "id" prohlφ₧eΦe nastavenΘmu ve v²Üe uvedenΘm konfiguraΦnφm adresß°i. Nßsledujφcφ p°φklad naΦφtß zvlßÜtnφ master page (IeMaster.master) pro prohlφ₧eΦe zalo₧enΘ na Microsoft Internet Exploreru:

<!-- Rozliseni master page podle zarizeni/prohlizece -->
<%@ Page Language="C#" Title="Ukazkova stranka"
      MasterPageFile="~/Master.master"
      Ie:MasterPageFile="~/IeMaster.master" %>

Nastavenφ master page ve web.config

Pokud vφte, ₧e ve svΘ aplikaci budete pou₧φvat master page na vÜech strßnkßch, m∙₧ete ji nastavit globßln∞ pomocφ konfiguraΦnφho souboru. Takto nastavenß master page se automaticky pou₧ije pro vÜechny strßnky, kterΘ obsahujφ ovlßdacφ prvky typu asp:Content (tedy je z°ejmΘ, ₧e vy₧adujφ nastavenφ master page). Pokud do aplikace p°idßte strßnku, kterß bude obsahovat obvykl² XHTML k≤d, nebude na nφ master page pou₧ita. V²chozφ nastavenφ je mo₧nΘ potlaΦit takΘ uvedenφm jinΘ master page v direktiv∞ Page (atribut MasterPageFile), potΘ se mφsto v²chozφ strßnky pou₧ije tato nov∞ nastavenß. Nßsledujφcφ ukßzka obsahuje Φßst konfiguraΦnφho souboru, kterß nastavuje Default.master jako v²chozφ master page:

<?xml version="1.0" ?>
<configuration>
<system.web>

   <!-- Nastavi master page pro vsechny stranky -->
   <pages masterPageFile="Default.master" />

</system.web>
</configuration>

P°φstup k Master page z k≤du

P°φstup k dat∙m v master page

Doposud jsme ve vÜech p°φkladech pracovali pouze s ASP.NET a XHTML znaΦkami. Je tedy na Φase ukßzat, jak lze s master pages manipulovat p°φmo ze zdrojovΘho k≤du strßnek. P°esto₧e k≤d, kter² pracuje s ovlßdacφmi prvky v master page, by sßm m∞l b²t takΘ v master page, m∙₧e b²t pot°eba p°istupovat k master page z k≤du jednotliv²ch odvozen²ch strßnek. K tomu slou₧φ vlastnost Master, kterß vracφ objekt typu MasterPage reprezentujφcφ strßnku. Pro usnadn∞nφ p°φstupu ke strßnce je mo₧nΘ definovat typ master page (bu∩ pomocφ souboru master nebo pomocφ jmΘna codebehind t°φdy). Pokud je takto urΦen typ strßnky, vracφ vlastnost Master p°φmo objekt danΘ strßnky.

Nßsledujφcφ k≤d ukazuje master page obsahujφcφ ovlßdacφ prvek, ve kterΘm si u₧ivatel m∙₧e vybrat z n∞kolika mo₧nostφ. Vybranß mo₧nost je zp°φstupn∞na pomocφ vlastnosti SelectedOption:

<%@ Master Language="C#"%>
<script runat="server">
   // Vlastnost vraci text vybrane polozky
   public string SelectedOption
   {
      get { return listChoose.SelectedItem.Value; }
   }
</script>

<form id="form" runat="server">
   <!-- Zde si muze uzivatel neco zvolit -->
   <asp:DropDownList runat="server" ID="listChoose">
      <asp:ListItem>Prvni moznost</asp:ListItem>
      <asp:ListItem>Druha moznost</asp:ListItem>
   </asp:DropDownList>

   <!-- ContentPlaceHolder pro vkladani obsahu -->
</form>

V nßsledujφcφ strßnce, kterß pou₧φvß v²Üe uvedenou master page, budeme p°i naΦtenφ stßnky zjiÜ¥ovat vybranou mo₧nost zp°φstupn∞nou pomocφ SelectedOption. VÜimn∞te si direktivy MasterType, kterß urΦuje typ master page, a proto nenφ p°i zjiÜ¥ovßnφ vybranΘ polo₧ky v master page pot°eba p°etypovßnφ.

<!-- Direktiva MasterType urcuje typ master page -->
<%@ Page Language="C#" Title="Prvni stranka"
      MasterPageFile="~/MasterPage.master" %>
<%@ MasterType VirtualPath="~/MasterPage.master" %>

<script runat="server">
   // Zjistuje vybranou moznost z master page
   void Page_Load(object sender, EventArgs e)
   {
      lblOption.Text=Master.SelectedOption;
   }
</script>

<asp:Content ...>
   Vybrana moznost je <asp:Label ID="lblOption" Runat="server" />
</asp:Content>

DynamickΘ naΦφtßnφ master page

Ji₧ jsem zmφnil, ₧e je mo₧nΘ master page volit podle za°φzenφ nebo webovΘho prohlφ₧eΦe. N∞kdy ale m∙₧e b²t pot°eba, aby se master page volila podle n∞jak²ch slo₧it∞jÜφch pravidel (nap°φklad aplikace, kterß b∞₧φ pod n∞kolika r∙zn²mi domΘnami, m∙₧e mφt pro ka₧dou domΘnu r∙zn² vzhled), proto je mo₧nΘ naΦφtat master page dynamicky p°ed samotn²m naΦφtßnφm strßnky. V novΘ verzi ASP.NET p°ibyla udßlost PreInit, kterß se volß p°edtφm, ne₧ se zaΦne strßnka naΦφtat. V tΘ chvφli je takΘ mo₧no m∞nit master page, kterß se mß pro strßnku pou₧φt (pokud se pokusφte m∞nit master page pozd∞ji, dostanete v²jimku). Nßsledujφcφ ukßzka nßhodn∞ volφ jednu ze dvou master pages:

// Zvolit nahodne Master1 nebo Master2
void Page_PreInit(object sender, EventArgs e)
{
   Random r=new Random();
   if (r.Next(2)==0)
      MasterPageFile="~/Master1.master";
   else
      MasterPageFile="~/Master2.master";
}

Pr∙b∞h zpracovßvßnφ udßlostφ

P°i naΦφtßnφ strßnky pou₧φvajφcφ master page se vytvß°φ objekt samotnΘ strßnky, ale takΘ objekt master page. Proto je dobrΘ v∞d∞t, ₧e udßlosti, kterΘ mohou b²t vyvolßny v objektu obou strßnek (jako je nap°φklad Page_Load), jsou vyvolßny nejprve ve strßnce s obsahem a a₧ potΘ v master page.

Pet°φΦek, TomßÜ (23. 9. 2005)

ASP.NET 2.0 - podrobn² pr∙vodce

Pokud uva₧ujete nad ASP.NET, urΦit∞ se vßm vyplatφ zaΦφt hned jeho novou verzφ 2.0. Seznßmφme vßs postupn∞ se vÜemi podstatn²mi principy a nßstroji, kterΘ pot°ebujete znßt. Tato sΘrie Φlßnk∙ dosud nebyla ukonΦena!