ASP.NET QuickStart Príručka
Page Fragment Caching
Okrem cachovania výstupu celej stránky, poskytuje ASP.NET pre Vás jednoduchý spôsob
ako cachovať výstup z určitých častí obsahu stránky, ktorý je pomenovaný fragment
caching. Určite si región Vašej stránky pomocou
ovládacích prvkov,
a označíte ich pre cachovanie použitím direktívy @ OutputCache predstavenej
v predchádzajúcej kapitole. Táto direktíva určuje dobu trvania (v sekundách), počas
ktorej by mal byť obsah ovládacieho prvku cachovaný na serveri, tak isto ako hocijaké
iné prípadne podmienky, pri ktorých by malo dojsť k zmenám. Napríklad nasledujúca
direktíva nariaďuje ASP.NET, aby cachoval výstup ovládacieho prvku po dobu 120 sekúnd,
a obmeňuje cachovanie použitím dotazových reťazcov alebo formulárových parametrov
"CategoryID" a "SelectedID".
<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>
Atribút VaryByParam je extrémne výkonný a povoľuje autorovi ovládacieho prvku
nariadiť ASP.NET cachovať/uchovať viaceré inštancie regiónu cachovaného výstupu
na serveri. Napríklad nasledujúce URL na hostovanú stránku (host page) predošlého
ovládacieho prvku vyrovnávacej pamäte oddeľujú inštancie obsahu ovládacích prvkov.
http://localhost/mypage.aspx?categoryid=foo&selectedid=0
http://localhost/mypage.aspx?categoryid=foo&selectedid=1
Logicky vrámci ovládacieho prvku je potom možné dynamicky vygenerovať rôzny obsah
(ktorý je cachovaný oddelene) založený na poskytnutých argumentoch.
Namiesto atribútu VaryByParam, fragment caching taktiež podporuje atribút
VaryByControl. Kde atribút VaryByParam obmeňuje cachované výsledky
založené na pároch názov/hodnôt odoslaných použitím POST alebo GET,
atribút VaryByControl obmeňuje cachované fragmenty prvkami vo vnútri ovládacích
prvkov. Napríklad:
<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %>
Všimnite si, že podobne ako v prípade stránok s cachovaným výstupom, je potrebné
explicitné použite buď VaryByParam alebo VaryByControl aj v prípade,
že žiadne nie je použité. Ak ovládací prvok obsahoval prvok drop-down select box
pomenovaný Category, výstup ovládacieho prvku by sa obmeňoval podľa označenej hodnoty
v ovládacom prvku.
Nasledujúca ukážka kódu objasňuje ako cachovať dve menu sekcie stránky použitím
deklaratívneho ovládacieho prvku.
<%@ Page Language="VB" %>
<%@ Register TagPrefix="Acme" TagName="Menu" Src="Menu.ascx" %>
<html>
<body>
<table>
<tr>
<td>
<Acme:Menu Category="LeftMenu" runat=server/>
</td>
<td>
<h1>Hi, the time is now: <%=Now%> </h1>
</td>
<td>
<Acme:Menu Category="RightMenu" runat=server/>
</td>
<tr>
</table>
</body>
</html>
VB
Nasledujúca ukážka kódu ukazuje implementáciu ovládacieho prvku "Acme:Menu" s podporou
cachovania.
<%@ Control Language="VB" ClassName="AcmeMenu" %>
<%@ OutputCache Duration="120" VaryByParam="none" %>
<script runat=server>
Public Category As String;
Sub Page_Load(sender As Object, e As EventArgs)
Dim conn As AdoConnection = New AdoConnection("MyDSN")
MyMenu.DataSource = conn.Execute("select * from menu where category=" & Category)
MyMenu.DataBind()
End Sub
</script>
<asp:datagrid id="MyMenu" runat=server/>
VB
Všimnite si, že výstup tohoto príkladu cachuje odozvu každého ovládacieho prvku
po dobu 120 sekúnd. Celá logika potrebná pre opätovné vytvorenie každého ovládacieho
prvku menu počas pochybenia vyrovnávacej pamäte (buď kvôli uplynutiu 120 sekúnd
alebo kvôli nedostatočnej pamäti na serveri) je čisto uzavretá vo vnútri ovládacieho
prvku.
Nasledujúci príklad ukazuje jednoduchý fragment caching. Ukážka cachuje výstup z
ovládacieho prvku, ktorý vyvoláva dáta z databázy SQL Servera, zatiaľ čo si ponecháva
dynamické vlastnosti rodičovskej stránky. Môžete vidieť, že stránka je dynamická,
pretože čas je aktualizovaný pri každej požiadavke, zatiaľ čo ovládací prvok je
aktualizovaný každých 60 sekúnd.
VB Fragment Cache
Poznámka: Pokusy programovo ovplyvňovať ovládacie prvky, ktorých výstup je
cachovaný, zo stránky, ktorá ich obsahuje má za výsledok chybu. Napríklad pokusy
použiť deklaratívny výraz pripájania dát (data binding expression) v tagu ovládacieho
prvku generujú syntaktické chyby (parser errors), ako je ukázané v nasledujúcom
kóde.
<!-- The following tags generate parser errors. -->
<Acme:Menu Category='<%# Container.DataItem("Category")' runat="server"/>
Dôvod je jednoduchý. V prípadoch, keď je výstup obsahu ovládacích prvkov cachovaný,
je vytvorená inštancia ovládacieho prvku iba pri prvej požiadavke; teda po cachovaní
už nie je ovládací prvok prístupný. Namiesto toho by ste mali uzavrieť celú logiku
potrebnú pre vytvorenie obsahu ovládacieho prvku priamo do samotného ovládacieho
prvku; toto je zvyčajne vykonávané v rámci udalosti Page_Load alebo Page_PreRender
ovládacieho prvku.
Môžete deklarovať a použiť iné parametre deklaratívnych vlastností pre prispôsobenie.
Napríklad predošlé ovládacie prvky môžu byť prispôsobené nasledovne:
<Acme:Menu Category="LeftMenu" runat=server/>
<Acme:Menu Category="RightMenu" runat=server/>
Tieto deklarácie zapríčinia, aby bol príslušný kód vygenerovaný a spustený kompilátorom
(compiler) stránky počas udalosti, v ktorej je ovládací prvok vytvorený ako chyba
vyrovnávacej pamäte. Vývojári ovládacích prvkoch potom môžu sprístupniť tieto nastavenia
ako keby boli tieto ovládacie prvky necachované.
Fragment Caching API Novinka v 2.0
Namiesto používania direktívy @ OutputCache, teraz môžete nastaviť
cachovacie vlastnosti pre ovládacie prvky použitím Cache API. V nasledujúcom príklade
obmeňuje ovládací prvok čas, kedy bol cachovaný, podľa označeného stavu v dropdown
liste. Môžete vidieť čas, kedy bol ovládací prvok vrátený a čas, kedy bude cachovaný
záznam odstránený.
VB Fragment Cache API
|