User Controls v ASP.NET – zbavujeme se include z ASP

18. března 2003

V předchozím článku jsme si ukázali, jak převést ASP stránku do ASP.NET aplikace. Aplikace sice začala být funkční, ovšem stále si s sebou nese určité nešvary minulosti. V dnešním článku se naučíme nahrazovat statické části stránek, pro které jsme doposud byli zvyklí používat include.

Metodu <!-- #include file="zahlavi.inc.asp" --> je sice stále možné používat, ale tato se neslučuje s moderním principem objektového programování, oddělení logiky od designu. Je to historická relikvie, která by nadále už neměla jakkoli znepřehledňovat náš kód – prostě ji nahradíme.

V první fázi se naučíme nahradit statické části, tedy ty, které nemají žádnou výkonnou funkci, kde jde třeba jen o vložení kódu záhlaví nebo zápatí stránky. Náhradu částí, které obsahují výkonný kód, si ukážeme v příštím článku (kód je potřeba přepsat do části skriptu, někdy je vhodné též vytvořit vlastní namespace – ale nepředbíhejme).

Jako náhradu zastaralého include využijeme novou metodu vytváření takzvaných uživatelských ovládacích prvků (prvek ve skutečnosti nemusí nic ovládat, ovšem ve většině případů jsou tyto prvky určeny pro webové formuláře, a zde už co ovládat mají – proto název ovládací prvek). Ovládací prvek vytvoříme z libovolného fragmentu statického HTML kódu naší původní stránky nebo souboru, který byl určen pro include. Od ASP.NET stránky se rozpozná tak, že má povinně příponu ascx a obsahuje direktivu @Control.

Vezměme si tedy náš původní soubor zahlavi.inc.asp a uložme ho jako Zahlavi.ascx. (Povšiměte si také, že používám velké písmeno v názvu souboru. Z principu je to jedno, ale pro přehlednost v objektově orientovaném systému .net, je velmi vhodné používat názvy, které co nejlépe vystihují vlastnosti subjektu — například EditUserProfile.aspx, EditUserProfileForm.ascx.)

Ukázka kompletního souboru Zahlavi.ascx:

<%@ Control Language=“C#“ %>
<%@ OutputCache Duration=“360″ VaryByParam=“none“ %><?xml version=“1.0″ encoding=“utf-8″ ?>
<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Transitional//EN“ „http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=“http://www.w3.org/1999/xhtml“ xml:lang=“cs_CZ“ lang=“cs_CZ“ dir=“ltr“>
<head>
<meta http-equiv=“Content-type“ content=“text/html; charset=utf-8″ />
<meta http-equiv=“Content-script-type“ content=“text/javascript“ /> 
<meta http-equiv=“Cache-control“ content=“no-cache“ />
<meta http-equiv=“Pragma“ content=“no-cache“ />
<meta http-equiv=“Expires“ content=“mon, 01 Dec 1997 01:00:00 GMT“ />
<meta name=“Language“ content=“cs-CZ“ />
<meta http-equiv=“Imagetoolbar“ content=“no“ />
<meta http-equiv=“MSThemeCompatible“ content=“no“ />
<meta name=“MSSmartTagsPreventParsing“ content=“true“ />
<link href=“Style.css“ rel=“StyleSheet“ media=“screen“ type=“text/css“ />
<title>Naše aplikace</title>
</head>
<body> 

Ukázka souboru Zapati.ascx:

<%@ Control Language=“C#“ %>
<%@ OutputCache Duration=“360″ VaryByParam=“none“ %>
</body>
</html>

Jak vidíte, do vyjmutého fragmentu kódu jsme přidali dvě direktivy: <%@ Control Language="C#" %> (říká, že jde o ovládací prvek (control), použitý jazyk je C#) a <%@ OutputCache Duration="360" VaryByParam="none" %> (zapne cachování prvku po dobu 6 minut nezávisle na parametrech předávaných aplikaci, která náš prvek využívá).

Jak dostat náš uživatelský prvek do stránky? Je to úplně jednoduché – náš prvek vlastně rozšíří množinu prvků, která má ASP.NET standardně k dispozici (vkládají se do stránky tagem asp). Nejprve je potřeba náš prvek ve stránce zaregistrovat (aby .net framework o našem prvku věděl). To provedeme direktivou @Register. Při registraci se také uvádí jméno tagu, který budeme používat pro přístup k našemu prvku. Poté už můžeme kdekoli ve stránce a kolikrát chceme náš prvek vložit.

Celá stránka by mohla vypadat jako tento soubor Default.aspx:

<%@ Page Language=“C#“ %>
<%@ OutputCache Duration=“120″ VaryByParam=“*“ %>
<%@ Register TagPrefix=“mycode“ TagName=“header“ Src=“Zahlavi.ascx“ %>
<%@ Register TagPrefix=“mycode“ TagName=“footer“ Src=“Zapati.ascx“ %>
<script language=“C#“ runat=“server“>
</script>
<mycode:header Id=“Header“ RunAt=“server“ />
<h1>Nějaký nadpis</h2>
<div>Zde je prostor pro obsah stránky…</div>
<mycode:footer Id=“Footer“ RunAt=“server“ />

Ve stránce vidíme nastavení cachování celé stránky na dvě minuty v závislosti na libovolném předávaném parametru (přičemž vkládané prvky mají samy o sobě nastaveny cachování jinak, cachují se déle a nezávisle na předávaných parametrech), dále je vidět registrace obou ovládacích prvků pro záhlaví a zápatí. Vidět je i místo pro obslužný program (script). Vlastní stránka potom začíná naším uživatelským prvkem, pokračuje nějakým obsahem a zakončena je ovládacím prvkem zápatí. Výsledek takto složené stránky si můžete prohlédnout.

Není tedy problém nahradit include tak, aby aplikace získala na přehlednosti. Dokonce jsme získali ještě další výkon, díky inteligentnímu cachování ovládacích prvků. Dobře je také patrné, že není problém, aby ASP.NET aplikace generovala ryze čistý XHTML kód – záleží jen na nás, jak si připravíme hlavičku, patičku a jak budeme pečliví při práci s kódem stránky. Vyzkoušejte si také, jak se server zachová, pokud by někdo zadal přímo URL k souboru našeho ovládacího prvku – přístup bude odepřen, nehrozí zde problém jako v případě, kdy někdo v klasickém ASP pro include použije příponu .inc!

Jistě vám tu však chybí jedna věc, a to možnost dynamicky ovlivnit třeba titulek stránky, nebo do hlavičky zahrnout i nadpis a tento také dynamicky měnit. I to je samozřejmě možné, podrobný postup si ukážeme v dalším článku. (Soubory ukázky si lze stáhnout.)

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek Interval.cz pod rentgenem
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *