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>