O „User controls“, které v ASP.NET nahrazují nepříliš výkonnou direktivu include z klasických ASP, bylo napsáno i zde na Interval.cz poměrně dost článků. Zcela neoprávněně však prozatím hraje roli Popelky vytváření vlastních serverových ovládacích prvků, které považuji za jeden z nejdůležitějších přínosů platformy ASP.NET.

Standardně dodávané serverové ovládací prvky (datagrid, repeater…) jsou využitelné při řešení mnoha typických vývojářských úkolů, jakými jsou například zobrazení dat z databáze v tabulkovém formátu nebo validace dat zadaných uživatelem. Přesto nepochybně existuje mnoho specifických problémů, které nelze efektivně řešit pouhou ad hoc kombinací dodávaných ovládacích prvků. Také je vhodné, abych v případě, že věnuji vyřešení určitého problému nezanedbatelné množství času, nezačínal u nového projektu opět na „zelené louce“, ale abych maximálně zhodnotil již napsaný kód.

Proč psát serverové ovládací prvky

Představte si, že pro jednoho zákazníka vyvinete řešení, ve kterém musíte generovat velké množství grafů z mnoha datových zdrojů (relační databáze, XML a další) a navíc musíte být schopni zobrazovat grafy různého typu. Špatný programátor vytvoří monolit, který sice splňuje požadavky zákazníka, ale jeho opakovaná použitelnost je nulová. Pokud přijde jiný zákazník s podobnými požadavky, celý proces tvorby aplikace se otrocky zopakuje. Dobrý programátor rozpozná, že problematika tvorby grafů je relativně nezávislá na konkrétním projektu a že tedy bude vhodné vyvinout komponentu specializovanou na tvorbu grafů, která bude použitelná v mnoha různých projektech. V ASP.NET je možné takovou komponentu realizovat jako serverový ovládací prvek.

Pro tvorbu serverových ovládacích prvků lze ale nalézt i další důvody než jen opětovné použití kódu. Představte si, že jste vyvinuli systém určený k prodeji letenek a že se dohodnete s partnery, že umístí na své WWW stránky uživatelské rozhraní, které návštěvníkům umožní vyhledávat odlety letadel a rezervovat vstupenky. Veškerá komunikace s mateřským systémem probíhá pomocí WWW služeb. Pokud si nechcete nechat otrávit část života řešením problémů s programátory partnerů, kteří sami provádějí integraci existujících WWW stránek s WWW službami a neustále potřebují konzultace a podporu z vaší strany, pak vytvoříte serverový ovládací prvek, který zapouzdří volání WWW služeb. Serverový ovládací prvek budete distribuovat partnerům, kteří jej pouze umístí na své stránky, což by měl zvládnout i úplný programátorský nýmand. Serverovým prvkem také zajistíte, že vzhled uživatelského rozhraní bude na všech stránkách stejný a návštěvník si nebude muset zvykat na případné nežádoucí „specialitky“. Implicitním předpokladem takového postupu je ale samozřejmě použití ASP.NET technologie u všech partnerů.

User controls versus Custom controls

Doufám, že jsem vás v předchozích teoretických odstavcích přesvědčil, že serverové ovládací prvky jsou velmi užitečné a že se vyplatí investovat čas do zvládnutí jejich tvorby. Ještě než začneme vytvářet vlastní jednoduchý serverový ovládací prvek, provedeme srovnání, které nám dá odpověď na otázku, kdy se vyplatí použít serverový ovládací prvek (Custom control) a kdy je lepší použít User control.

Použití User control je vhodné v následujících případech:

  • je-li ovládací prvek velmi jednoduchý, jedná se například o standardní záhlaví a zápatí stránky
  • chcete-li ovládací prvek zkonstruovat ve vizuálním návrháři (pro serverové ovládací prvky nelze vizuálního návrháře použít)
  • chcete-li používat fragmentované cachování pomocí direktivy OutputCache
  • pokud vám nevadí, že každá WWW aplikace musí mít v současné době svoji kopii ovládacího prvku (soubor ascx), a proto je nutné při každé změně manuálně upravit všechny exempláře
  • pokud vám nevadí, že se User control po vložení na stránku v design módu zobrazí jako „šedivý čtvereček“ a nemáte ani další obvyklou podporu ze strany RAD designérů

Serverový ovládací prvek (Custom control) využijete v těchto případech:

  • je-li ovládací prvek relativně složitý
  • bude-li více aplikací sdílet jednu verzi ovládacího prvku a může tedy využít všech výhod verzování .Net knihoven (assembly)
  • chcete-li poskytnout maximální podporu pro RAD vývoj, například přidání ovládacího prvku do panelu s prvky, stránky vlastností, určení standardní události, vykreslení prvku i v design módu
  • chcete-li vyvinout tzv. „template control“, to znamená ovládací prvek, jehož vzhled si může uživatel přizpůsobit pomocí šablon
  • chcete-li přidat funkce nebo vlastnosti k již existujícímu serverovému ovládacímu prvku

Příklad serverového ovládacího prvku

K napsání serverového ovládacího prvku stačí balík nástrojů .Net Framework SDK, který je zcela zdarma. Pro komerční vývoj ale doporučuji Visual studio .Net, které budu používat také při psaní příkladů. Následující příklad ukazuje tvorbu jednoduchého serverového ovládacího prvku. Složitější příklady naleznete v dalších článcích, kde také budou podrobně vysvětleny pojmy jako ViewState, životní cyklus ovládacích prvků a další.

Nyní již k příkladu. Ve Visual studiu .NET vytvořte nový projekt založený na šabloně Web Control Library. Visual studio vygeneruje skeleton ukázkového ovládacího prvku, ale protože my si vytváříme svůj vlastní prvek, celou třídu smažte a doplňte následující kód:

using System;
/// Jmenný prostor System.Web.UI obsahuje třídu Control.
using System.Web.UI;
namespace MyFirstLibrary
{
  /// <summary>
  /// Třída MyFirstControl představuje náš nový ovládací prvek.
  /// </summary>
  /// Atribut ToolboxData udává, jaký tag bude vytvořen, pokud ovládácí prvek přetáhneme z panelu nástrojů (toolboxu).
  [ToolboxData(„<{0}:MyFirstControl runat=server></{0}:MyFirstControl>“)]
  public class MyFirstControl : Control
  {
     /// <summary>
     /// Přepíšeme metodu Render, která se stará o samotné vykreslení prvku.
     /// </summary>
     /// <param name=“output“><see cref=“HtmlTextWriter“/>, který je použit k vykreslení ovládacího prvku</param>.
     protected override void Render(HtmlTextWriter output)
     {
         /// vykreslování obsahu
         output.WriteFullBeginTag(„H1“);
         output.Write(„První serverový ovládací prvek“);
         output.WriteEndTag(„H1“);
         output.Write(„Sice toho prozatím moc neumím, ale pamatujte, že i moře je z kapek!“);
      }
  }
}

Na začátku jsme importovali jmenný prostor Systém.Web.UI, který obsahuje typy potřebné pro vytváření uživatelského rozhraní. Atribut ToolboxData udává, jaký tag bude vytvořen v aspx stránce po přetažení ovládacího prvku z panelu nástrojů. Znaky ‘{0}’ budou na stránce nahrazeny prefixem, který si uživatel zvolí nebo který je vygenerován Visual studiem. Třída MyFirstControl, která představuje náš nový serverový ovládací prvek, dědí ze třídy Control. Všechny serverové prvky musí přímo nebo nepřímo dědit ze třídy Control, která zapouzdřuje základní funkcionalitu serverových prvků, aby se vývojář mohl soustředit na řešení samotného problému a nebyl zatěžován nepodstatnými implementačními detaily. Náš prvek přepisuje metodu Render bázové třídy. Metoda Render vykresluje značky, kterým „rozumí“ cílová platforma. V našem případě se jedná o značky HTML, ale nebyl by problém napsat prvek, který vykresluje XML či WML značky.

Testovací aplikace

Nyní napíšeme jednoduchou ASP.NET aplikaci, kterou náš nový prvek otestujeme. Vytvořte novou ASP.NET aplikaci a do panelu nástrojů (toolboxu) přidejte vytvořený serverový prvek (pravé tlačítko myši na toolboxu, vybrat možnost Customize toolbox, nalézt assembly se serverovým prvkem, zaškrtnout checkbox vedle prvku). Nově přidaný serverový ovládací prvek přetáhněte na formulář. Přepněte zobrazení na HTML. Měli byste vidět kód podobný následujícímu:

<%@ Page language=“c#“ Codebehind=“WebForm1.aspx.cs“ AutoEventWireup=“false“ Inherits=“WebApplication8.WebForm1″ %>
<%@ Register TagPrefix=“cc1″ Namespace=“MyFirstLibrary“ Assembly=“WebControlLibrary2″ %>
<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.0 Transitional//EN“>
<HTML>
  <HEAD>
    <title>WebForm1</title>
    <meta name=“GENERATOR“ Content=“Microsoft Visual Studio 7.0″>
    <meta name=“CODE_LANGUAGE“ Content=“C#“>
    <meta name=“vs_defaultClientScript“ content=“JavaScript“>
    <meta name=“vs_targetSchema“ content=“http://schemas.microsoft.com/intellisense/ie5″>
  </HEAD>
  <body MS_POSITIONING=“GridLayout“>
    <form id=“Form1″ method=“post“ runat=“server“>
      <cc1:MyFirstControl id=“MyFirstControl1″ runat=“server“></cc1:MyFirstControl>
    </form>
&nbsp </body>
</HTML>

Direktiva Registr určuje, z jaké assembly (atribut Assembly) a z jakého jmenného prostoru (atribut Namespace) uživatelské serverové ovládací prvky pocházejí a jaký budou mít na stránce prefix (atribut TagPrefix). Pamatujte, že jméno assembly neobsahuje příponu dll. Jako prefix lze použít libovolnou sekvenci znaků mimo zkratky asp, která je vyhrazena pro standardní ASP.NET ovládací prvky. Nastavte startovací stránku na nově vytvořený WWW formulář, aplikaci spusťte a uvidíte svůj první serverový ovládací prvek v akci.

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

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

Žádný příspěvek v diskuzi

Odpovědět