|
|
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:
- Riadenie stavu (State management) ako je view-state a control-state, alebo požadovanie šifrovania stránky (requesting encryption of the page-state);
- 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
- 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ť;
- Webové zdroje, umožňujúce vkladanie zdrojov ako súbory skriptov klienta;
- Používanie rozšírených funkcií riadenia klientských skriptov;
- Využitie funkcii témovania(theming) alebo filtrácie prostriedkov (device filtering) v ASP.NET, alebo;
- 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
|
|