Kontejnerování

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>

Připomínky a postřehy

Máte-li nějakou připomínku, dobrý nápad nebo jste našli v dokumentaci chybu, rádi od vás uslyšíme.