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
<%@ 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
<%@ 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:
<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".
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.
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 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
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:
<%@ 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:
<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
:
<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φ.
<%@ 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:
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.
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!
- ASP.NET 2.0 - navigace
- ASP.NET 2.0 - Master Pages (prßv∞ Φtete)