AspNet.sk     Diskusné fóra     Vitajte v QuickStarts     ASP.NET     Silverlight     Ako môžem...? (en)     Class prehliadač Príklady chcem v ...   
Menu
Skip Navigation Links.

ASP.NET Quickstart Tutorial

Rozširovanie(extending) ASP.NET

Novinky v 2.0

ASP.NET 2.0 bolo navrhnuté s ohľadom na rozšíriteľnosť a podporu zásuvných modulov. Zároveň umožňuje nahradiť vstavané správanie (behavior) v ASP.NET z Vašou vlastnou implementáciou. Viacej k rozšíriteľnosti nájdete v nasledujúcej sekcii:
  • Životný cyklus štruktúry stránky (Page framework lifecycle) - má dodatočné kroky a procesy;
  • Beh serverových ovládacích prvkov(Server controls runtime) - Môžete napísať vlastné ovládacie prvky pre podporu nových funkcii ako:
    1. Riadenie stavu (State management) ako je view-state a control-state, alebo požadovanie šifrovania stránky (requesting encryption of the page-state);
    2. Môžete napísať adaptéry stránky a ovládacích prvkov (control and page adapters), ak od Vašich ovládacích prvkov alebo stránok požadujete správanie, ktoré je závislé od prehliadača, prostriedku alebo triedy prostriedku (device class) alebo značiek (markup). Adaptéry sa zapájajú do životného cyklu behu programu
    3. Nové ovládacie prvky dátového zdroja a dátovo-viazané ovládacie prvky umožňujú pridať deklaratívnu podporu dátového viazania pre nových poskytovateľov, tak že napíšete vlastné dátovo-viazané ovládacie prvky, ktoré budú týchto poskytovateľov reprezentovať;
    4. Webové zdroje, umožňujúce vkladanie zdrojov ako súbory skriptov klienta;
    5. Používanie rozšírených funkcií riadenia klientských skriptov;
    6. Využitie funkcii témovania(theming) alebo filtrácie prostriedkov (device filtering) v ASP.NET, alebo;
    7. Callbacks - Ak vývojár stránky alebo ovládacieho prvku potrebuje uskutočniť akcie, ktoré vyžadujú komunikáciu zo serverom, bez kompletného postback-u, môžu využiť spätné volania (callbacks);
  • Page-state - Okrem spracovania view-state a control-state v ovládacom prvku môžete tiež rozšíriť tzv. "page-state persister" používaný na spracovanie kolektívneho stavu stránky;
  • Dizajnový čas serverových ovládacích prvkov - Dizajnérske triedy priradené k serverovým ovládacím prvkom poskytujú spôsoby ako editovať ovládací prvok vo vizuálnom dizajnéri. Môžete napísať dizajnéry ovládacích prvkov ak potrebujete editačné funkcie ako editovanie regiónov (region-editing), editovanie na základe úloh (task-based editing), maľovanie (painting) a editovanie šablón (template-editing);
  • Poskytovatelia aplikačných služieb (Application service providers) - Všetky vstavané služby v ASP.NET 2.0 sú plne rozšíriteľné pomocou registračného modelu, založenom na poskytovateľoch (provider-based registration model). Model zahŕňa Členstvo (Membership), Roly (Roles), Personalizáciu (Personalization), Počítadlá (Site Counters), Profil (Profile), Stav Session (Session State), Stránkovú navigáciu (Site Navigation) a Webové udalosti (Web Events).
  • Stavitele výrazov (Expression builders) - Môžete pridať vlastný staviteľ výrazov (expression builder) pre podporu implementácie deklaratívneho nahradzovania hodnôt vo fázach analýzy a kompilácie. Stavitele výrazov môžu poskytovať podporu počas behu programu aj počas dizajnovania;
  • Lokalizácia - Namiesto používania ResX súborov, môžete implementovať Vašich vlastných poskytovateľov zdrojov pre podporu behového a dizajnového lokalizačného modelu, ktoré získavajú údaje z rôznych zdrojov (napríklad dátové úložiská);
  • Kompilácia a pred-kompilácia - Do kompilačného systému ASP.NET môžete pridať príponu nového súborového formátu použitím poskytovateľov zostavovania(build providers). ASP.NET 2.0 používa poskytovateľov zostavovania(build providers) pre súbory WSDL slúžiacich na kompiláciu zástupcov webových služieb a pre súbory XSD na kompiláciu silno typových dátových množín(data sets), ktoré sú umiestnené v adresári App_Code. Ak chcete poskytovať Váš webový obsah z iného zdroja akým sú tradičné súbory, potom môžete implementovať poskytovateľ virtuálnej cesty (virtual path provider).
Táto časť hovorí o uvedených, ako aj ďalších funkciách rozšíriteľnosti v ASP.NET 2.0.

ASP.NET 2.0 bolo navrhnuté v zmysle rozšíriteľnosti. Hoci je ASP.NET 2.0 schopné splniť požiadavky väčšiny aplikácii použitím pripravených funkcií(out-of-the-box), môžete jeho možnosti rozšíriť použitím Vašej vlastnej implementácie, keď si Vaša aplikácia vyžaduje správanie, ktoré sa vstavaným funkciam vymyká. Našťastie, je takmer každá časť systému ASP.NET 2.0 nahraditeľná alebo rozšíriteľná.

Životný cyklus štruktúry stránky (Page framework lifecycle)

Životný cyklus štruktúry stránky (Page framework lifecycle) je proces, ktorý začína na objekte stránky a rekurzívne sa vnára do jeho ovládacích prvkov a ich dcérskych ovládacích prvkov (child controls). Počas každého bodu v životnom cykle prebiehajú operácie, ktoré tvoria správanie stránky a ovládacieho prvku. Využitie uvedenej skutočnosti badať pri rozširovaní funkčnosti ovládacích prvkov, stránky aj pri rozširovaní funkcií samotného vývoja stránky. Napríklad:
  • Page.InitializeCulture kde môžete explicitne spracovať UICulture a Culture pre lokalizáciu, napr. z profilu (Profile);
  • Page.OnPreInit, Page_PreInit, kde môžete dynamicky nastaviť Page.Theme alebo Page.MasterPageFile;
  • Control.LoadControlState, Control.SaveControlState pre explicitné spracovanie novej funkčnosti riadenia stavov;
  • Ostatné nové udalosti stránky, ako OnInitComplete, OnPreLoad, OnLoadComplete, OnPreRenderComplete, OnSaveStateComplete atď.

Beh serverových ovládacích prvkov(Server controls runtime)

Používateľské ovládacie prvky, (.ASCX) sú 'kompozitnými ovládacími prvkami (compositional controls)', ktoré boli napísané deklaratívne použitím rovnakých postupov, ako pri deklaratívnom budovaní stránky. Visual Studio teraz poskytuje 'prehľad' používateľských ovládacích prvkov v dizajnovom pohľade(design-view), kde sú ovládacie prvky zobrazené v ľahko stráviteľnej podobe. Vlastné ovládacie prvky, (súbory s kódmi (code files), assemblies) sú vytvorené programovo a poskytujú rozšíriteľnosť vo viacerých podobách, (kompozícia, dedičnosť atď.). Pri písaní vlastných ovládacích prvkov je dôležité pochopiť časti životného cyklu ovládacieho prvku (control's lifecycle stages), vrátane spracovávania informácii o stave a spracovanie postback-ov.

Pri vytváraní vlastných ovládacích prvkov môžete Vaše ovládacie prvky skompilovať do assemblies, ktoré sú pridané do adresára Bin alebo v prípade ASP.NET 2.0, môžete pridať priamo súbor(y) kódu do aplikačného adresára App_Code. ASP.NET 2.0 ovládací prvok dynamicky skompiluje. V ASP.NET 2.0 môžete taktiež použiť prefixy značiek, pri registrovaní ovládacích prvkov z viacerých menných priestorov. Takže je možné vytvoriť niekoľko ovládacích prvkov vo viacerých priestoroch mien, ak všetky spĺňajú podmienku spoločného prefixu.

<%-- Register the controls defined in an assembly that resides in the Bin directory --%>
<%@ Register TagPrefix="Demos" NameSpace="DemoControls" Assembly="MyDemoControls" %>

<%-- Register the controls defined in code that resides in the App_Code directory --%>
<%@ Register TagPrefix="Demos" NameSpace="DemoControls" %>

<Demos:ControlFromBinAssembly runat="server" ID="CustomControl1" />
<Demos:ControlFromCodeFile runat="server" ID="CustomControl2" />

Triedy ovládacích prvkov (Control Classes)

ASP.NET uviedlo základné triedy (base classes) Control a WebControl, do ktorých ASP.NET 2.0 pridáva viac funkcii spolu a ktoré rozširuje o nové triedy, ako napríklad CompositeControl. Táto jednoduchá základná trieda nahrádza kolekciu Controls a poskytuje mechanizmus pre pridružený CompositeControlDesigner, na tvorbu dcérskych ovládacích prvkov (child controls).


Public Class MyCompositionControl 
  Inherits CompositeControl
    Protected Overrides Sub CreateChildControls()
      Controls.Clear()
      ' Create control collection ..
    End Sub
    ' Additional implementation
End Class
VB

CompositeControl je WebControl a implementuje INamingContainer. Kolekcia Controls zavolá EnsureChildControls. Všetky dcérske ovládacie prvky by ste mali vytvoriť v reakcii na udalosť CreateChildControls. Základná trieda zároveň poskytuje podporu dizajnového času, a zabezpečuje tvorbu kolekcie Controls.

Vývojárovi stránky môžete umožniť štylizáciu Vášho ovládacieho prvku odkrytím vlastností najvyššej úrovne (top-level properties), ktoré sa ďalej delegujú štylizačným vlastnostiam dcérskych prvkov. Ak máte veľa vlastností a ovládacích prvkov, potom uvažujte o použití vlastností typu Style a ich spracovaní počas zobrazovacích metód , tak že ich dcérske ovládacie prvky preberú ako stav zobrazenia(view-state),a na rodičovských prvkoch zostáva ich správa.

Trieda ovládacieho prvku a vlastnosť Meta-data

Existuje niekoľko zaujímavých atribútov na úrovni tried a vlastností použitých pre funkcie v ASP.NET 2.0 a niektoré z nich sú:
  • LocalizableAttribute: Lokalizácia je vo webovej aplikácii povolená pre všetky ovládacie prvky a objekty, vrátane statických značiek pomocou využitia výrazov, (implicitných aj explicitných). V dobe prekladu sú lokalizačné informácie odovzdávané zhora nadol, a preto nepotrebujete pridávať osobitné spracovanie pre Váš ovládací prvok. V čase dizajnovania stránky Visual Studio vloží hodnoty podľa atribútu LocalizableAttribute.
  • ThemeableAttribute: Vývojári stránok a vývojári vykonávajúci úpravy môžu využiť témy na ovplyvnenie vzhľadu a do istej miery aj obsahu stránky alebo webového sídla. Všetky vlastnosti sú štandardne témovateľné (theme-able), takže ak existujú vlastnosti, o ktorých ste rozhodli že nemajú byť témovateľné, ako sú vlastností citlivých dát alebo vlastnosti, ktoré nie sú založené na štýloch , označte ich ako Themeable(false).
  • UrlPropertyAttribute: Používa sa napríklad pre master-page model, alebo v prípade , že vlastnosti typu Url budú potenciálne potrebovať tzv re-basing (zmenú základu url- väčšinou sa robí pre obrázky a kaskádové štýly). Aby framework vykonal re-basing pre URL vlastnosť stránky, resp. stránky obsahu v master-page musíme nastaviť uvedený atribút. Vývojár používateľských ovládacích prvkov používa metódu System.Web.UI.Control.ResolveClientUrl() na zobrazenie správneho Url klienta pre prehliadač;
  • WebResourceAttribute: Používa sa na označenie assembly, ktorá obsahuje vložený zdroj, ktorý môže byť neskôr obslúžený v požiadavke;
  • FilterableAttribute: Používa sa na označenie vlastností ovládacieho prvku, alebo prvkov, ktoré vyžadujú podporu filtrovania prostriedkov a deklaratívnej syntaxe na stránke.
Pozor: Pri tvorbe vlastných ovládacích prvkov IntelliSense a Validácia interpretujú typy a atribúty meta-dát tried a typov, aby vytvorili schému.

Riadenie stavu

V ASP.NET 1.x bolo bežné, že ovládacie prvky ukladali údaje v slovníku view-state, aby mohli odovzdávať údaje pri spätných volaniach. Vývojári stránok mohli vyradiť view-state čím ale stratili časť zo základných funkcií ovládacích prvkov, keďže sa vo view-state prenášali aj údaje. V ASP.NET 2.0 môžete využívať výhody control-state ak máte požiadavky na zachovanie časti stavu bez ohľadu na nastavenia, ktoré vývojár robí. Položky uložené v control-state by mali byť limitované: Napr. na aktuálny index stránky, alebo na hodnotu dátového kľúča. Pri používaní tejto formy stavu buďte šetrní, nie je určená byť repozitárom veľkého množstva údajov. Vlastné ovládacie prvky sa potrebujú registrovať ku control-state (ideálne pri OnInit ale pred OnLoad) a musia poskytnúť explicitné ukladanie a načítavanie. Registrovať sa musíte pri každom volaní.


Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
  MyBase.OnInit(e)
  Page.RegisterRequiresControlState(Me)
End Sub
Protected Overrides Function SaveControlState() As Object
  Dim o As Object = MyBase.SaveControlState()

  ' Additional implementation

  Return New Pair(o, ViewIndex)
End Function
Protected Overrides Sub LoadControlState(ByVal savedState As Object)
  Dim p As Pair = savedState
  If Not (p Is Nothing) Then
    MyBase.LoadControlState(p.First)
    ViewIndex = CInt(p.Second)
  End If
End Sub
VB

V ASP.NET 2.0, sú control-state a view-state kombinované do skrytého poľa vo fáze zobrazovania stránky. Stránke môžete poslať žiadosť, aby toto pole šifrovala, ak potrebujete prenášať potenciálne citlivé údaje.(Page.RegisterRequiresViewStateEncryption)

Adaptéry ovládacích prvkov a stránky: Riadenie správania zariadení, prehliadačov a značiek

Správanie ovládacieho prvku je obvykle určené v triede daného prvku (použitím zodpovedajúceho textového zapisovača a HttpBrowserCapabilities). Okrem základného správania môžete vytvoriť nastaviteľné adaptéry, ktoré preberajú časť správania a obsluhujú požiadavky v mene ovládacieho prvku. Konfigurácia sa vykonáva v súboroch schopností prehliadača, (.browser).

Proces tvorby HttpBrowserCapabilities používa deklaratívne súbory prehladača, ktoré sa nachádzajú v inštalačnom adresári Config\Browsers a/alebo v lokálnom adresári App_Browser aplikácie. Nasledujúci príklad ukazuje vlastný súbor prehliadača, ktorý mapuje adaptér na vlastný ovládací prvok; V tomto príklade je assembly obsahujúca adaptér automaticky renderovaná z adresára App_Code aplikácie a definície typov sú ukázané bez úplnej kvalifikácie.

<!-- New browser node links into parent -->
<browser id="My_PIE_PPC" parentID="PIEnoDeviceID">
  <identification>
    <capability name="browser" match="Pocket IE" />
    <capability name="majorversion" match="4" />
  </identification>

  <!-- Define new text-writer for this browser and define control-adapter mapping -->
  <controlAdapters markupTextWriterType="MyNamespace.MyCustomTextWriter" >
    <adapter controlType="MyNamespace.MyControl" adapterType="MyNamespace.MyControlAdapter" />
  </controlAdapters>
</browser> 

Počas životného cyklu štruktúry stránky sa ASP.NET 2.0 pokúša vyhľadať adaptér na ovládacom prvku použitím metódy Control.ResolveAdapter. Ak je adaptér vrátený, kód stránky zavolá metódy adaptéra namiesto metód životného cyklu ovládacieho prvku. Ako vývojár programujúci rozšírenia môžete využiť a rozšíriť základné triedy ako ControlAdapter, WebControlAdapter a PageAdapter a definovať tak prekrytia pre časti životného cyklu ovládacích prvkov, ako aj pre ostatné metódy (tvorba dcérskych ovládacích prvkov, riešenie spätného volania)

  • Základné adaptérové triedy vykonávajú spätné volania spôsobom ekvivalentným so spätnými volaniami ovládacích prvkov. Je preto typické volať základnú metódu priamo na adaptéri. Nie vždy sa to dá uplatniť pre zobrazovacie metódy (Render), pretože môžete skončiť v nedefinovanom stave (problém so zobrazením značiek adaptérom);
  • Adaptéry môžu implementovať rozhrania IPostBackEventHandler a IPostBackDataHandler Slúžiace na spracovanie informácií zo spätných volaní a na vyvolávanie udalostí;
  • Adaptéry môžu implementovať metódy view-state a control-state , LoadAdapterViewState, SaveAdapterViewState a LoadAdapterControlState, SaveAdapterControlState. Metódy dopĺňajú správanie ovládacieho prvku;
  • Adaptéry môžu implementovať CreateChildControls a spracovať tak volania dátového viazania;
  • Alternatívne môžete zabrániť 'adaptácii' vášho vlastného ovládacieho prvku vrátením null metódou Control.ResolveAdapter.


' Control
Public Class MyControl 
  Inherits Control
  ' Example showing override of Render to control entire rendering
  Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
    Dim s As New Style()
    s.ForeColor = System.Drawing.Color.Green
    writer.EnterStyle(s)
    writer.Write("Welcome custom control.")
    writer.ExitStyle(s)
  End Sub
  ' Additional implementation
End Class
' Adapter	
Public Class MyControlAdapter 
  Inherits ControlAdapter
  ' Example showing override of Render to control entire rendering      
  Protected Overrides Sub Render(ByVal writer As HtmlTextWriter) 
    Dim s As New Style()
    s.ForeColor = System.Drawing.Color.Red
    writer.EnterStyle(s)
    writer.Write("Welcome custom control adapter.")
    writer.ExitStyle(s)
  End Sub
  ' Additional implementation
End Class
VB

Ovládacie prvky dátového zdroja, a dátovo-viazané ovládacie prvky

Prvok dátového zdroja reprezentuje poskytovateľ dátového úložiska, ktoré môže vystavovať údaje dátovo-viazaným ovládacím prvkom. ASP.NET je dodaný spolu s niekoľkými prvkami dátového zdroja, existujú napríklad dátové zdroje reprezentujúce SQL databázy, objekty aplikačnej vrstvy, alebo XML súbory. Všetky ovládacie prvky dátového zdroja majú spoločné, že:
  • Reprezentujú jeden, alebo viac pohľadov na údaje
  • Každý pohľad poskytuje enumeráciu objektov
    • Nutne podpora SELECT (v SQL terminológii)
  • Pohľad môže byť zároveň schopný editácie nad svojou kolekciou objektov
    • Nutná podpora UPDATE, INSERT, DELETE (v SQL terminológii)
    • Model schopnosti vystavený ako boolovské vlastnosti
  • Schopnosť vyvolať metódy spôsobujúce zmeny
  • Schopnosť načítať údaje podľa potreby (on-demand)
Môžete zároveň pridať podporu pre dodatočné dátové zdroje vytvorením vlastného ovládacieho prvku dátového zdroja, ktorý je serverovým ovládacím prvkom implementujúcim rozhranie IDataSource, alebo IHierarchicalDataSource. ASP.NET 2.0 zároveň zahŕňa abstraktné základné triedy DataSourceControl a HierarchicalDataSourceControl, ktoré obaľujú správanie spoločné väčšine dátových zdrojov.
public interface IDataSource {
  event EventHandler DataSourceChanged { add; remove; }
  DataSourceView GetView(string viewName);
  ICollection GetViewNames();
}

public abstract class DataSourceControl : 
  Control, IDataSource, IListSource {
  // Additional implementation
}
DataSourceView reprezentuje viaceré operácie, ktoré môžu byť vykonané nad pohľadom na údaj, ktoré vystavuje dátový zdroj. Nasledujúci príklad je zjednodušený pohľad na základnú triedy DataSourceView (v skutočnosti sa používajú asynchrónne metódy).
public abstract class DataSourceView {
  public virtual bool CanDelete { get; }
  // CanInsert, CanPage, CanSort, CanUpdate, ...

  public event EventHandler DataSourceViewChanged;
  public virtual int Delete (IDictionary keys, IDictionary oldValues, ...);
  public virtual bool Insert (IDictionary values, ...);
  public virtual int Update (IDictionary keys, IDictionary values, IDictionary oldValues, ...);
  public abstract IEnumerable Select(DataSourceSelectArguments arguments);
}
Referenčná dokumentácia knižnice .NET Framework pre uvedené triedy zahŕňa príklady, ktoré ukazujú ako písať vlastný tabuľkový, alebo hierarchický prvok dátového zdroja.

Webové zdroje (Resources)

V ASP.NET 1.x vývojári, ktorí písali vlastné ovládacie prvky využívajúce vlastné zdroje (obrázky, alebo klientský skript), museli inštalovať zdroje do virtuálneho adresára aspnet_client. V ASP.NET 2.0 môžete využiť výhody webových zdrojov, aby ste si prácu zjednodušili. Webové zdroje umožňujú vkladať zdroje priamo do assembly a sú z nej získavané pomocou ‘web resources handler‘. Nasledujúci príklad ukazuje použitie vloženého súboru JavaScript a použitie metódy Page.ClientScript.RegisterClientScriptResource. Ak vkladáte namiesto skriptu štýl, registrujte ho a použite metódu Page.ClientScript.GetWebResourceUrl na získanie vloženého zdroja.


' Mark the assembly with the resource
<assembly: WebResource("CustomControlScript.js", "text/javascript")>

Public Class CustomControl
  Inherits WebControl

  ' Additional implementation

  Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
    Me.Page.ClientScript.RegisterClientScriptResource(GetType(CustomControl), "CustomControlScript.js");
    Me.Attributes.Add("onmouseover", "MouseOverScript()"
    MyBase.OnPreRender(e)
  End Sub
End Class
VB

Riadenie klientského skriptu

Vlastnosť Control.Page vystavuje ClientScript, ktorý obaľuje funkcionalitu spracovávania, registrácie a referencovania klientského skriptu. Keď ju skombinujeme s webovými zdrojmi, je možné do assembly ovládacieho prvku zahrnúť aj súvisiace skripty. Pozrite príklad .


Public Class MyButton
  Inherits Button
  Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
    Dim sScript As String = "function DoAlert(){alert('Hello World');}"
    Me.Page.ClientScript.RegisterClientScriptBlock(GetType(MyButton), _ 
      "ScriptFunction", sScript, True)

    OnClientClick = "javascript:DoAlert();"
    MyBase.OnPreRender(e)
  End Sub

  ' Additional implementation

End Class
VB

Prostriedky, Filtrovanie

Vývojár stránky môže použiť novú deklaratívnu syntax na označenie vlastností ovládacieho prvku, aby boli nastavené len vtedy, keď sa definície filtra prostriedkov vyhodnotí na true. Na príklad: ID filtra prostriedku môže určiť triedu prehliadačov typu Internet Explorer, definovanú v súboroch browser v aplikácii. Filter prostriedkov môže byť použitý na deklaratívnu kvalifikáciu vlastností ovládacieho prvku. Do vlastného ovládacieho prvku nemusíte pridať vôbec nič, aby ste aktivovali podporu uvedeného správania. Ak však nechcete, aby sa uplatnili filtre prostriedkov na Váš ovládací prvok, alebo niektorú z jeho vlastností, dekorujte ho/ju atribútom Filtrable(false). Pozor, lokalizácia je prispôsobená filtrovaniu prostriedkov.
<!-- Text property is defaulted to a value, reset given IE and also if the custom filter applies. --> 
<!-- The more specific the device-filter wins.. -->
<asp:Label runat="server" Id="WelcomeLabel" Text="Welcome to ASP.NET's Quickstarts" 
	IE:Text="Quickstarts" MyFilter:Text="Welcome" />

Spätné volania

Spätné volania umožňujú ovládaciemu prvku alebo stránke vykonať vyčlenené spätné volanie na server spôsobom, ktorý si nevyžaduje úplné spätné odoslanie stránky. Váš vlastný ovládací prvok nespôsobí že prehliadač bude čakať na spätné odoslanie celej stránky. Môžete vyvinúť vlastný ovládací prvok, ktorý jednoducho kombinuje na príklad webové zdroje s riadením klientského skriptu. Aby ste aktivovali spätné volania:
  • Vytvorte udalosť spätného volania na strane servera so zvolenou signatúrou vo vašom vlastnom ovládacom prvku,(ICallbackEventHandler.PrepareCallbackEvent) ktorá sa uplatňuje na argument odovzdaný metóde. Môžete zavolať metódu, ktorú môžu vývojári prekryť ak rozširujú Váš ovládací prvok;
  • Vytvorte metódu na strane servera, ktorá generuje výsledok spätného volania, ICallbackEventHandler.RenderCallbackResult. Mali by ste volať metódu, ktorú vývojári môžu prekryť ak rozširujú váš ovládací prvok. Návratová hodnota sa odovzdá klientském skriptu definovanému vaším vlastným ovládacím prvkom;
  • Vytvorte skript na strane klienta, ktorý spracuje spätné volanie, alebo chybu. Volanie bude generované Vašim vlastným ovládacím prvkom;
  • Na Vašom ovládacom prvku používajte referenciu na udalosť spätného volania naviazanú na klientskú udalosť


Public Class CustomControl
  Inherits CompositeControl
  Implements ICallbackEventHandler

  Private Sub PrepareCallbackEvent(ByVal eventArgument As String)
    Implements System.Web.UI.ICallbackEventHandler.PrepareCallbackEvent
    PrepareCallbackEvent(eventArgument)
  End Sub

  Private Function RenderCallbackResult() As String _
    Implements System.Web.UI.ICallbackEventHandler.RenderCallbackResult
    Return RenderCallbackResult()
  End Function

  Private _callbackEventArg As String;

  Protected Overridable Sub PrepareCallback(ByVal eventArgument As String)
    _callbackEventArg = eventArgument
  End Sub

  Protected Overridable Function RenderCallbackResult() As String   
    Dim result As String

    If (_callbackEventArg = "theArg") Then
      result = "Some data"
    Else
      result = "Only theArg allowed!" 
    End If

    Return result 
  End Function

  Private sButtonCallBack As String = _
    "function ButtonCallBack(result, context){ alert(result);}"
  Private sButtonCallBackError As String = _
    "function ButtonErrorCallBack(result, context){ alert(result);}"

  Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
    MyBase.OnInit(e)
    Page.ClientScript.RegisterClientScriptBlock(GetType(MyControl), _
      "ButtonCallBack", sButtonCallBack, True);
    Page.ClientScript.RegisterClientScriptBlock(GetType(MyControl), _
      "ButtonCallBackError", sButtonCallBackError, True);
  End Sub

  ' Additional implementation

  Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
    Me.Attributes("OnClick") = _
    Page.ClientScript.GetCallbackEventReference(Me, _
      "'theArg'", "ButtonCallback", "null", "ButtonErrorCallback", True)
    MyBase.OnPreRender(e)
  End Sub
End Class
VB

Page-state

Page-state predstavuje zlúčenie všetkých view-state a control-state ovládacích prvkov umiestnených na stránke. Zvyčajne sa odovzdáva prostredníctvom HiddenFieldStatePersister, čo je skryté pole umiestnené vo VIEWSTATE. PageStatePersister môžete prekryť v objekte Page, aby ste zabezpečili vlastnú perzistenciu. Keďže sú ovládacie prvky prirodzene adaptívne, niektoré prostriedky nedokážu spracovať značné množstvá údajov, ktoré sa odovzdávajú dookola. Prostredníctvom PageAdapter, ktorý je nastavený pre vybraný prostriedok je možné ukladať jeho stav do alternatívnych zdrojov. ASP.NET 2.0 definuje dva 'ukladače-perzistery'.HiddenFieldPageStatePersister a SessionPageStatePersister.

ASP.NET 2.0 zároveň umožňuje rozdelenie jedného skrytého poľa prostredníctvom konfiguračného atribútu maxPageStateFieldLength.

Dizajnový čas serverových ovládacích prvkov

Existuje veľa vylepšení, zjednodušení a posunov v dizajnéroch ovládacích prvkov. ControlDesigner píšete, ak potrebujete poskytnúť podporu vlastnosti 'dizajnový čas' vášmu vlastnému ovládaciemu prvku vo vývojovom prostredí akým je Visual Studio. ASP.NET 2.0 poskytuje nasledovnú množinu vlastností:
  • Editácia založená na regiónoch (Region-based editing). V ASP.NET 1.x by ste použili ReadWriteControlDesigner aby ste ovládaciemu prvku poskytli jednoduchú vstupno-výstupnú oblasť na dizajnovej ploche. V ASP.NET 2.0 môžete vytvoriť editovateľné, šablónovateľné regióny a regióny určené len na čítanie (typy DesignerRegion pre podporu bohatšej editácie. Regióny môžu zároveň poskytovať pomôcky a zvýrazňovanie. Zároveň môžete spracovávať udalosti kliknutia myši na ovládacích prvkoch a interagovať tak s regiónmi;
  • Maľovanie na dizajnérskom povrchu, ktoré môžete aktivovať tak, že možnosť aktivujete a prekryjete metódu OnPaint.
  • Typy dizajnéra ovládacích prvkov môžu interagovať s ovládacím prvkom oveľa bližšie použitím prístupových metód (accessors), zároveň môžete využiť podporu vložených prostriedkov (obrázky);
  • Editácia založená na úlohách. Použitím DesignerActionList môžete vývojárom stránky poskytnúť vizuálny a kontextový zoznam úloh s ktorým môžu pracovať. Uvedená forma editácie rozširuje predchádzajúci koncept Dizajnových slov (DesignerVerbs);
  • Vylepšená a značne zjednodušená editácia šablón. Váš dizajnér ovládacieho prvku sa môže úplne spoliehať na bežné UI pre editáciu, alebo môže vytvoriť vlastné rozhranie s použitím regiónov. Pridanie šablónovej editácie momentálne spočíva len v jednoduchom definovaní kolekcie TemplateGroups na ControlDesigner;
  • Niekoľko nových základných tried dizajnéra, CompositeControlDesigner a ContainerControlDesigner pre podporu bežných scenárov.
Nasledujúca ukážka ilustruje veľmi jednoduchý prvok WebControl s ktorým je asociovaný ContainerControlDesigner. V ukážke dizajnér vytvorí jednoduchý editovateľný región pre ovládací prvok, ktorý umožňuje funkcionalitu drag-and-drop. Ovládací prvok definuje svoje deti ako dcérske ovládacie prvky, pozrite ParseChildren(false) a PersistChildren(true). ControlDesigner vytvorí titulkovú lištu a nastaví štýly. Pseudokód zároveň ukazuje kroky na implementáciu jednoduchého zoznamu DesignerActionList.


<Designer(GetType(MyDesigner)), ParseChildren(false), PersistChildren(true)>
Namespace CustomControls

  <Designer(GetType(MyDesigner)), ParseChildren(False), PersistChildren(True)> _
  Public Class MyControl
      Inherits WebControl
  End Class

  Public Class MyDesigner
    Inherits ContainerControlDesigner

    Private _style As Style = Nothing
    Public Overrides ReadOnly Property FrameCaption() As String
      Get
        ' Return a caption
      End Get
    End Property

    Public Overrides ReadOnly Property FrameStyle() As Style
      Get
        ' Return a style for the frame
      End Get
    End Property

    Public Overrides ReadOnly Property ActionLists() _
      As System.ComponentModel.Design.DesignerActionListCollection
      Get
        ' Get the base collection and add my own list
      End Get
    End Property

    Private Class MyList
      Inherits System.ComponentModel.Design.DesignerActionList
      ' Members to handle the smart-tag
		    ..
      Public Overrides Function GetSortedActionItems() _
        As System.ComponentModel.Design.DesignerActionItemCollection
	' Create a collection and add DesignerActionTextItem, 
	' DesignerActionPropertyItem and DesignerActionMethodItem types
      End Function
    End Class
  End Class
End Namespace
VB

Poskytovatelia služieb aplikácie

Mnohé aplikačné služby ASP.NET boli dizajnované s použitím modelu založeného na poskytovateľoch. Poskytovatelia abstrahujú od fyzického dátového zdroja a vystavujú vlastnosti vrstve biznis-logiky. Vlastnosti, ktoré sú vybudované nad poskytovateľmi Vám umožňujú vytvoriť vlastných poskytovateľov a nastaviť ich správanie podľa Vašich potrieb. Vlastní poskytovatelia umožňujú vývojárom implementovať špecializovanú biznis logiku a operovať nad alternatívnymi dátovými zdrojmi. Stránky, ktoré používajú funkcie založené na poskytovateľoch neprestanú pracovať ak vstavaných poskytovateľov nahradíte vlastnými bez potreby úpravy zdrojového kódu. Nasledujúce aplikačné služby podporujú model založený na poskytovateľoch a umožňujú Vám vytvárať a konfigurovať vlastných poskytovateľov:
  • Členstvo (Membership)
  • Manažér úloh (Role Manager)
  • Stav Session (Session State)
  • Profil (Profile)
  • Stránková navigácia (Site Navigation)
  • Počítadlá (Site Counters)
  • Personalizácia webových súčiastok (Web Parts Personalization)
  • Webové udalosti (Web Events)

Staviteľe výrazov (Expression Builders)

ExpressionBuilders v ASP.NET 2.0 je funkcionalita poskytujúca vývojárovi stránky pridať deklaratívnu syntax, ktorú možno priradiť vlastnostiam ovládacích prvkov. ASP.NET 2.0 sa dodáva spolu so staviteľmi výrazov pre:
  • Pripojovacie reťazce (Connection strings). Používané na prístup ku pripojovacím reťazcom v konfigurácii. <%$ connectionstrings: MyConnStr %>;
  • Aplikačné nastavenia (Application settings). Používané na prístup k aplikačným nastaveniam v konfigurácii. <%$ appsettings: MyAppValue %>;
  • Zdroje (Resources). Použité ako základňa pre budovanieviac-jazyčnej stránky. <%$ resources: mykey %>.
Stavitele výrazov môžu poskytnúť spracovanie počas dizajnového času prostredníctvom tzv. Expressions dialog vo Visual Studiu, ku ktorému môžete pristúpiť cez property grid. Môžete pridávať vlastné stavitele výrazov a výrazové prefixy. Spracovanie výrazov nie je obmedzené behom aplikácie, môžete pridať podporu aj pre dizajnový čas.

Stavitele výrazov môžu byť konštruované pre podporu vlastnosti no compile ASP.NET 2.0. Namiesto generovania kódu prostredníctvom staviteľa počas generovania triedy stránky, behové prostredie inštancuje staviteľ a vyhodnotí výraz. Nasledujúci príklad demonštruje pseudo ExpressionBuilder a ExpressionBuilderEditor.

<!-- In configuration, add your expression builder. Here the type is defined in App_code -->
<expressionBuilders>
	<add expressionPrefix="Expr" type="CustomExpressions.CustomExpressionBuilder" />
</expressionBuilders>

Namespace CustomExpressionBuilders
  ' Create the expression builder and define the prefix, the editor etc.
   _
  Public NotInheritable Class CustomExpressionBuilder
    Inherits ExpressionBuilder

    Public Overrides ReadOnly Property SupportsEvaluate() As Boolean
      Get
        Return True
        ' Supports the evaluation for no compile scenarios
      End Get
    End Property

    Public Overrides Function GetCodeExpression(ByVal entry As System.Web.UI.BoundPropertyEntry, _
      ByVal parsedData As Object, ByVal context As System.Web.Compilation.ExpressionBuilderContext) _
      As System.CodeDom.CodeExpression
      ' Return a code expression, given the declarative expression
    End Function

    Public Overrides Function EvaluateExpression(ByVal target As Object, _
      ByVal entry As System.Web.UI.BoundPropertyEntry, ByVal parsedData As Object, _
      ByVal context As System.Web.Compilation.ExpressionBuilderContext) As Object
      ' Return an evaluation of the expression for no compile scenarios
    End Function

    ' Additional implementation

  End Class

  ' The editor is used at design-time
  Public NotInheritable Class CustomExpressionEditor
    Inherits ExpressionEditor

    Public Overrides Function GetExpressionEditorSheet(ByVal expression As String, _
      ByVal serviceProvider As System.IServiceProvider) As System.Web.UI.Design.ExpressionEditorSheet
      ' Create a sheet
    End Function

    Public Overrides Function EvaluateExpression(ByVal expression As String, _
      ByVal parseTimeData As Object, ByVal propertyType As System.Type, _
      ByVal serviceProvider As System.IServiceProvider) As Object
      ' Return an evaluation during design-time
    End Function

    Private NotInheritable Class CustomExpressionEditorSheet
        Inherits ExpressionEditorSheet
      ' Expose any properties that represent the expression's value, you can define
      ' default values, type converters and descriptions
    End Class
  End Class
End Namespace
VB

Lokalizácia

Prehľad lokalizácie môžete nájsť tu.

Lokalizačný model v ASP.NET 2.0 umožňuje vývojárovi stránky nastaviť explicitné alebo implicitné deklaratívne výrazy. Výrazy zdrojov (resource expression) môžete rozšíriť tak, ako bolo popísané vyššie aj pri stálom využívaní poskytovateľov zdrojov (resource providers). Omnoho lepšie je rozšíriť lokalizáciu, aby poskytovala dodatočné možnosti prístupu ku zdrojom (nie len použitie ResX a satelitných assemblies). Jednoducho môžete vymeniť existujúcu ResourceProviderFactory, ktorá je definovaná v konfigurácii a dodať novú. Továreň jednoducho vytvorí rozhrania IResourceProvider pre globálne aj lokálne zdroje. Nasledujúci pseudo-kód ukazuje jednoduchý prípad výmeny továrne. (vlastná továreň musí byť definovaná v konfigurácii).

<!-- Defines the type in configuration. This sample shows defining the type in the 
App_Code directory -->
<globalization resourceProviderFactoryType="CustomLocalizationProviders.CustomResourceProviderFactory" ../>

' Note that to support design-time too, add the following attribute and
' define the provider
Namespace CustomLocalizationProviders
  <DesignTimeResourceProviderFactoryAttribute(GetType(CustomDesignTimeResourceProviderFactory))> _
  Public NotInheritable Class CustomResourceProviderFactory
    Inherits ResourceProviderFactory

    Public Overrides Function CreateGlobalResourceProvider(ByVal classKey As String) _
      As System.Web.Compilation.IResourceProvider
      Return New CustomGlobalResourceProvider(classKey)
    End Function

    Public Overrides Function CreateLocalResourceProvider(ByVal virtualPath As String) _
      As System.Web.Compilation.IResourceProvider
      Return New CustomLocalResourceProvider(virtualPath)
    End Function

    Private NotInheritable Class CustomGlobalResourceProvider
      Implements IResourceProvider

      Public Sub New(ByVal classKey As String)
        ' ..
      End Sub

      Public Function GetObject(ByVal resourceKey As String, _
        ByVal culture As System.Globalization.CultureInfo) _
        As Object Implements System.Web.Compilation.IResourceProvider.GetObject
        ' Get a resource object for the resource key and culture
      End Function

      Public ReadOnly Property ResourceReader() As System.Resources.IResourceReader _
        Implements System.Web.Compilation.IResourceProvider.ResourceReader
        Get
          ' Return a reader that enumerates the neutral resource */
        End Get
      End Property
    End Class

    ' Implement CustomLocalResourceProvider

  End Class
End Namespace
VB

Kompilácia a pred-kompilácia

ASP.NET 2.0 definuje niekoľko spôsobov kompilácie webovej aplikácie a niekoľko bodov rozšírenia kompilácie.

Dynamická kompilácia zahŕňa na príklad, súbory separácie kódu (code separation files) asociované s webovými stránkami a používateľskými ovládacími prvkami, kódom v adresári App_Code a abstraktnými súbormi ako ASPX, ASCX, RESX, a tiež, WSDL, XSD.

Existujú dve formy pred-kompilácie stránok pre nasadenie ako aj pred-kompilácia, ktorá stránku 'štartuje'. Pred-kompilácia pre nasadenie môže byť vykonaná dvomi spôsobmi, ktoré buď umožňujú špecifické aktualizácie na kompilovanú stránku, alebo nie. V oboch prípadoch je kód odstránený z kompilovanej stránky (cieľovej). V prípade v ktorom nie sú povolené aktualizácie po nasadení sa odstraňujú aj súbory ako ASPX. Pred-kompilácia na 'naštartovanie' stránky znamená, že ASP.NET vykoná bežnú kompiláciu celej stránky, aby sa zamedzilo spomaleniu pri prvej požiadavke.

Na pred-kompiláciu stránky môžete použiť pomôcku aspnet_compiler.exe. Pomôcka sa nachádza v inštalačnom adresári .NET Framework, na príklad %WINDIR%\Microsoft.NET\Framework\<version>. Môžete spustiť jej verziu s parametrom /? na zobrazenie zoznamu dostupných možností. Na príklad na pred-kompiláciu stránky určením virtuálnej cesty k aplikácii použite nasledujúci príkaz.

  > aspnet_compiler.exe -v /MyApp 

Kompilačné procesy môžete rozšíriť viacerými spôsobmi; dodaním nových súborových typov alebo prípon do kompilácie použitím Poskytovateľov výstavby (BuildProviders), alebo urobením špecifického obsahu virtuálnym, takže jeho zdroj nemusí byť na disku. VirtualPathProvider poskytuje práve uvedený spôsob bod rozšírenia.

Poskytovatele výstavby (Build Providers)

Poskytovatele výstavby sú asociované ku prípone súboru prostredníctvom konfigurácie. Poskytovateľ sa používa na tvorbu kódu pre virtuálnu cestu, ktorá bude kompilovaná ASP.NET. S poskytovateľom výstavby môžete pridať zdroj do kompilačných procesov ASP.NET, ktoré vznikajú prekladom predošlého generovania kódu z ľubovoľného obsahu. Na príklad, ak máte XML formát definujúci údaje, alebo triedu, resp. vlastné reportovacie údaje, môžete jednoducho použiť vlastný poskytovateľ výstavby na generovanie kódu, ktorý definuje vlastný objekt. Vytvorený objekt môže byť následne jednoducho konzumovaný napríklad ovládacím prvkom objektového dátového zdroja (ObjectDataSource).

Nasledujúca ukážka ilustruje mapovanie vlastného poskytovateľa výstavby na nový typ súboru (prípona: myext). Keď sú súbory s uvedenou príponou pridané len do adresára App_Code, vlastný poskytovateľ výstavby sa používa na preklad súboru a na následné odovzdanie kódu naspäť ASP.NET. Vlastný poskytovateľ je zároveň definovaný v adresári App_Code, v jeho špeciálne nakonfigurovanom pod-adresári. Toto zaistí, že typ objektu vlastného poskytovateľa bude prístupný pre systém výstavby (build), keď dôjde ku styku s asociovaným súborom v adresári App_Code.

// In configuration, this build provider is defined in the App_code\CustomBuildProviders directory

<system.web>
  <compilation>
    <codeSubDirectories>
      <add directoryName="CustomBuildProviders"/>
    </codeSubDirectories>
    <buildProviders>
      <add extension=".myext" type="CustomBuildProviders.CustomBuildProvider"/>
    </buildProviders>
  </compilation>
<system.web>	

Namespace CustomBuildProviders 
  <BuildProviderAppliesToAttribute(BuildProviderAppliesTo.Code)> _
  Public NotInheritable Class CustomBuildProvider 
    Inherits BuildProvider
    
    ' Additional implementation
		
    Public Overrides Sub GenerateCode(ByVal assemblyBuilder As System.Web.Compilation.AssemblyBuilder)
      ' Return code, e.g. a CodeCompileUnit that is added to the 
      ' assembly builder.

      ParseVirtualPath()

      ' Generate codeDOM for the type
      Dim ccu As CodeCompileUnit
      ccu = GenerateCodeCompileUnit()
      If Not (ccu Is Nothing) Then
        assemblyBuilder.AddCodeCompileUnit(Me, ccu)
      End If
    End Sub
		
    Private Sub ParseVirtualPath()
      ' Additional implementation
    End Sub

    Provate Function GenerateCodeCompileUnit() As CodeCompileUnit
      ' Return a new CodeCompileUnit 				
    End Function
  End Class
End Namespace
VB

Ak potrebujete získať zostavený typ v aplikačnom kóde, môžete použiť metódu BuildManager.GetType, pretože meno assembly nie je signifikantné.

Poskytovateľ virtuálnej cesty (Virtual Path Provider)

ASP.NET Vám umožňuje poskytnúť obsah pre web, ako ASPX, alebo jeho 'code behind' prostredníctvom mechanizmu nazývaného VirtualPathProvider. Systém výstavby ASP.NET volá registrované objekty VirtualPathProvider aby poskytli obsah, ktorý sa ďalej prekladá a zostavuje. Uvedené znamená, že pre špecifický typ obsahu budete môcť používať jeho abstrakciu, pretože konkrétny obsah sa nachádza na inom umiestnení (súborovom systéme...).

Aby ste mohli využívať poskytovateľ virtuálnej cesty, musíte ho zaregistrovať s ASP.NET v úvodnej časti životného cyklu aplikácie, na príklad použitím špeciálnej statickej metódy definovanej kódom, ktorý je umiestnený v adresári App_Code (a teda automaticky kompilovaný), nazvanej AppInitialize. Len špecifické typy webového obsahu môžu byť virtualizované týmto spôsobom. Na príklad kód v adresári App_Code nemôže byť mapovaný na VirtualPathProvider.

Poskytovatelia virtuálnej cesty sa používajú na obsluhu žiadostí o obsah založený na virtuálnej ceste. Poskytovateľom môže byť zaregistrovaných hneď niekoľko. Je možné, že webový obsah vo Vašej aplikácii môže byť obslúžený celou množinou poskytovateľov virtuálnej cesty. Na príklad Váš vlastný poskytovateľ a zabudovaný poskytovateľ ASP.NET, ktorý obhospodaruje štandardný súborový systém. V tomto prípade budete musieť vytvoriť Vášho vlastného poskytovateľa spôsobom, ktorý odovzdáva riadenie zabudovanému v prípade, že nedokáže spracovať špecifickú virtuálnu cestu.

Nasledujúca ukážka ukazuje pseudo-kód vlastného poskytovateľa VirtualPathProvider.


' For example, using code in the App_Code directory
Namespace CustomVirtualPathProviders

  Public NotInheritable Class CustomVirtualPathProvider
    Inherits VirtualPathProvider

    Public Sub AppInitialize()
      Dim myVpp As New CustomVirtualPathProvider()
      HostingEnvironment.RegisterVirtualPathProvider(myVpp)
    End Sub

    Public Overrides Function GetFileHash(ByVal virtualPath As String, _ 
      ByVal virtualPathDependencies As System.Collections.IEnumerable) As String
      ' Return a hash value based on the virtualPathDependencies
      ' For unhandled dependencies, create a list of these, then defer to the Previous to
      ' get it's hash and combine with this hash value
    End Function

    Public Overrides Function GetCacheDependency(ByVal virtualPath As String, _
      ByVal virtualPathDependencies As System.Collections.IEnumerable, _ 
      ByVal utcStart As Date) As System.Web.Caching.CacheDependency
      ' If the custom virtual path provider handles the path or dependency and it can
      ' create a CahceDependency create on and combine with that from the Previous
      ' If the provider cannot create a cacheDependency and it handles one of the
      ' dependencies, return null
    End Function

    Public Overrides Function FileExists(ByVal virtualPath As String) As Boolean
      ' If the custom virtual path provider handles the virtualPath and 
      ' it exists return true, otherwise defer to Previous
    End Function

    Public Overrides Function DirectoryExists(ByVal virtualDir As String) As Boolean
      ' If the custom virtual path provider handles the virtualDir and 
      ' it exists return true, otherwise defer to Previous
    End Function

    Public Overrides Function GetDirectory(ByVal virtualDir As String) _ 
      As System.Web.Hosting.VirtualDirectory
      ' If the custom virtual path provider handles the virtualDir and 
      ' it exists return true, otherwise defer to Previous
    End Function

    Public Overrides Function GetFile(ByVal virtualPath As String) _ 
      As System.Web.Hosting.VirtualFile
      ' If the custom virtual path provider handles the virtualPath and 
      ' it exists then create a custom VirtualFile and return, otherwise defer to Previous
      ' VirtualFile implements an Open method to return a Stream
    End Function

    Private NotInheritable Class MyVirtualFile
      Inherits VirtualFile
      Sub New(ByVal virtualPath As String)
          MyBase.New(VirtualPath)
      End Sub
      Public Overrides Function Open() As System.IO.Stream
	' Return a Stream
      End Function
    End Class

  End Class
End Namespace
VB
Microsoft .NET Framework SDK QuickStart Tutorials Version 2.0
Copyright © 2005 Microsoft Corporation. All rights reserved.
Preklad do slovenského jazyka - Copyright © 2005 - 2007 www.aspnet.sk, www.qsh.sk
Pošlite komentár k tejto stránke
Copyright © 2002 - 2008 Chastia, spol. s r. o., Igor Stanek, Designed by Lacino
Portál je hostovaný na serveroch firmy Quantasoft - www.qsh.sk.