Kontejner slouží k předání aktuálního kontextu controlům, které jsou v něm vnořené. Kontejnery lze do sebe vnořovat a mají jasně danou hierarchii. Díky kontejnerům lze přistupovat k obsahu polí proměnných relativně (field=".title"
) a control <je:avar>
je používá ke konstrukci dynamických odkazů.
Při práci s kontejnery se vždy společně dějí dvě věci:
- kontejner určuje tzv. kontejnerovou proměnnou vnořeným controlům
- a zároven controly obsažené v daném kontejneru tuto kontejnerovou proměnnou přebírají
Kontejner určuje kontejnerovou proměnnou
Kontejnerem může být:
- Repeater – všechny controly, které iterují přes prvky kolekce (typicky
<je:repeater>
), při každém jednotlivém průchodu mění kontejnerovou proměnnou na aktuálně procházený prvek. - Kontejner – control
<je:container>
určuje kontejnerovou proměnnou podle aktuální URL nebo zadané proměnné. Například pro stránku, která zobrazuje detail článku v blogu, je kontejnerovou proměnnou aktuálně zobrazený článek. Tato proměnná je určena URL adresou (.../article/clanek-abcXYZ.aspx
).
Control přebírá kontejnerovou proměnnou
Všechny controly uvnitř kontejneru automaticky přebírají jeho kontejnerovou proměnnou. Lépe to osvětlí příklad:
Mějme blog, vypíšeme seznam všech článků a odkazy na ně:
<je:repeater runat="server" source="articles"> <%-- je:repeater určuje kontejnerovou proměnnou na aktuálně zpracovávaný prvek --%> <item> <je:avar runat="server" href="/cs/article.aspx"> <%-- je:avar automaticky přebírá kontejnerovou proměnnou a generuje odkaz unikátní pro aktuálně zpracovávaný prvek --%> <je:item runat="server" field=".title" /> <%-- je:item automaticky přebírá kontejnerovou proměnnou a vypisuje pole title aktuálně zpracovávaného prvku (díky relativnímu odkazu na proměnnou) --%> </je:avar> </item> </je:repeater>
Na stránce článku získáme aktuální kontejnerovou proměnnou z URL:
<je:container runat="server" expect="article"> <%-- je:container získá kontejnerovou proměnnou z aktuální URL (/article/clanek-abcXYZ.aspx --%> <je:item runat="server" field=".title" tag="h1" /> <je:item runat="server" field=".text" /> <%-- je:item automaticky přebírá kontejnerovou proměnnou a vypisuje příslušná pole konkrétní proměnné (díky relativnímu odkazu na proměnnou) --%> </je:container>
Zanořování kontejnerů
Pokud je v sobě zanořeno více kontejnerů, pak je aktuální kontejnerová proměnná určena nejhlouběji zanořeným kontejnerem. Je-li třeba controlu předat proměnnou z jiného kontejneru, je nutné tento označit unikátním id
a v controlu se na něj pomocí tohoto id
odkázat. Více opět osvětlí příklad:
Máme situaci, kdy článek blogu může mít přiřazené tagy (tedy i více než jeden). Na stránce tag.aspx
zobrazíme seznam odkazů na články, které jsou označeny daným tagem. Zároveň chceme mít možnost se ze stránky s detailem článku vrátit na stránku s detailem tagu. Protože článek může být označen více tagy, není na stránce s výpisem článku jak zjistit, ze kterého tagu jsme na stránku přišli. Proto si tuto informaci předáme jako součást odkazu. Stránka tag.apsx
by vypadala takto:
<je:container runat="server" expect="tag" id="tagContainer"> <je:repeater runat="server" source="articles" restrictField="tag"> <item> <je:avar runat="server" href="article.aspx" secondContainer="tagContainer"> <je:item runat="server" field=".title" /> </je:rplink> </item> </je:repeater> </je:container>
Stránka s detailem článku by pak vypadala takto:
<je:container runat="server" expect="tag" bindTo="secondVar" id="tagContainer"> <je:container runat="server" expect="article"> <je:item runat="server" field=".title" tag="h1" /> <je:item runat="server" field=".text" /> <je:avar runat="server" href="tag.aspx" container="tagContainer"> Zpět na tag: <je:item runat="server" field=".title" container="tagContainer" /> </je:avar> </je:container> </je:container>