Model stránky ASP.NET 2.0
od Microsoftu
V ASP.NET 1.x měli vývojáři na výběr mezi modelem vloženého kódu a modelem kódu na pozadí. Kód na pozadí je možné implementovat buď pomocí atributu Src, nebo atributu CodeBehind direktivy @Page . V ASP.NET 2.0 mají vývojáři stále možnost volby mezi vloženým kódem a kódem na pozadí, ale došlo k významným vylepšením modelu kódu na pozadí.
V ASP.NET 1.x měli vývojáři na výběr mezi modelem vloženého kódu a modelem kódu na pozadí. Kód na pozadí je možné implementovat buď pomocí atributu Src, nebo atributu CodeBehind direktivy @Page . V ASP.NET 2.0 mají vývojáři stále možnost volby mezi vloženým kódem a kódem na pozadí, ale došlo k významným vylepšením modelu kódu na pozadí.
Vylepšení modelu Code-Behind
Abyste plně porozuměli změnám modelu kódu na pozadí v ASP.NET 2.0, je nejlepší rychle zkontrolovat model tak, jak existoval v ASP.NET 1.x.
Model Code-Behind v ASP.NET 1.x
V ASP.NET 1.x se model kódu na pozadí skládal ze souboru ASPX (webový formulář) a souboru kódu na pozadí obsahujícího programovací kód. Tyto dva soubory byly propojeny pomocí direktivy @Page v souboru ASPX. Každý ovládací prvek na stránce ASPX měl odpovídající deklaraci v souboru kódu na pozadí jako proměnnou instance. Soubor kódu na pozadí obsahoval také kód pro vazbu událostí a vygenerovaný kód nezbytný pro návrháře sady Visual Studio. Tento model fungoval poměrně dobře, ale protože každý ASP.NET prvek na stránce ASPX vyžadoval odpovídající kód v souboru kódu na pozadí, nedošlo k žádnému skutečnému oddělení kódu a obsahu. Pokud například návrhář přidal nový ovládací prvek serveru do souboru ASPX mimo integrované vývojové prostředí sady Visual Studio, aplikace by se přerušila kvůli absenci deklarace pro tento ovládací prvek v souboru kódu na pozadí.
Model Code-Behind v ASP.NET 2.0
ASP.NET 2.0 tento model výrazně vylepšuje. V ASP.NET 2.0 se kód na pozadí implementuje pomocí nových částečných tříd poskytovaných v ASP.NET 2.0. Třída kódu na pozadí v ASP.NET 2.0 je definována jako částečná třída, což znamená, že obsahuje pouze část definice třídy. Zbývající část definice třídy je dynamicky generována ASP.NET 2.0 pomocí stránky ASPX za běhu nebo při předkompilování webu. Propojení mezi souborem s kódem na pozadí a stránkou ASPX je stále vytvořeno pomocí direktivy @ Page. Místo atributu CodeBehind nebo Src teď ASP.NET 2.0 používá atribut CodeFile. Atribut Inherits slouží také k určení názvu třídy pro stránku.
Typická direktiva @ Page může vypadat takto:
<%@Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
Typická definice třídy v souboru s kódem na pozadí ASP.NET 2.0 může vypadat takto:
public partial class _Default : System.Web.UI.Page
Poznámka
Jedinými spravovanými jazyky, které v současné době podporují částečné třídy, jsou C# a Visual Basic. Vývojáři používající jazyk J# proto nebudou moct v ASP.NET 2.0 používat model kódu na pozadí.
Nový model vylepšuje model kódu na pozadí, protože vývojáři teď budou mít soubory kódu, které obsahují pouze kód, který vytvořili. Poskytuje také skutečné oddělení kódu a obsahu, protože v souboru kódu na pozadí nejsou žádné deklarace proměnných instance.
Poznámka
Vzhledem k tomu, že částečná třída pro stránku ASPX je místo, kde probíhá vazba událostí, mohou vývojáři jazyka Visual Basic provést mírné zvýšení výkonu pomocí klíčového slova Handles v kódu na pozadí k vytvoření vazby událostí. Jazyk C# nemá ekvivalentní klíčové slovo.
Nové atributy direktivy @ Page
ASP.NET 2.0 přidává mnoho nových atributů do direktivy @ Page. Následující atributy jsou ve verzi ASP.NET 2.0 nové.
Async
Atribut Async umožňuje nakonfigurovat stránku tak, aby se spustila asynchronně. Dále v tomto modulu se budeme zabývat asynchronními stránkami.
Vypršení časového limitu synchronizace
Byl zadán časový limit pro asynchronní stránky. Výchozí hodnota je 45 sekund.
Codefile
Atribut CodeFile nahrazuje atribut CodeBehind v sadě Visual Studio 2002/2003.
Třída CodeFileBaseClass
Atribut CodeFileBaseClass se používá v případech, kdy chcete, aby bylo více stránek odvozeno z jedné základní třídy. Vzhledem k implementaci částečných tříd v ASP.NET bez tohoto atributu by základní třída, která používá sdílená společná pole k odkazování na ovládací prvky deklarované na stránce ASPX, nefungovala správně, protože ASP. Kompilační modul NET automaticky vytvoří nové členy na základě ovládacích prvků na stránce. Proto pokud chcete společnou základní třídu pro dvě nebo více stránek v ASP.NET, budete muset definovat základní třídu v atributu CodeFileBaseClass a potom odvodit každou třídu stránky z této základní třídy. Při použití tohoto atributu se vyžaduje také atribut CodeFile.
Compilationmode
Tento atribut umožňuje nastavit vlastnost CompilationMode stránky ASPX. CompilationMode Vlastnost je výčet obsahující hodnoty Always, Auto a Never. Výchozí hodnota je Vždy. Pokud je to možné, nastavení Automaticky zabrání ASP.NET dynamické kompilaci stránky. Vyloučení stránek z dynamické kompilace zvyšuje výkon. Pokud však vyloučená stránka obsahuje kód, který musí být zkompilován, vyvolá se při procházení stránky chyba.
Povolit ověřování událostí
Tento atribut určuje, zda jsou události zpětného volání a zpětného volání ověřeny. Pokud je tato možnost povolená, argumenty událostí zpětného volání nebo událostí zpětného volání jsou kontrolovány, aby se zajistilo, že pocházejí ze serverového ovládacího prvku, který je původně vykresloval.
Povolit motivy
Tento atribut určuje, jestli se na stránce používají ASP.NET motivy. Výchozí hodnota je false. ASP.NET motivy jsou popsané v modulu 10.
Řádkovépragmas
Tento atribut určuje, zda mají být během kompilace přidány pragma řádku. Řádkové direktivy jsou možnosti používané ladicím programem k označení konkrétních částí kódu.
MaintainScrollPositionOnPostback
Tento atribut určuje, zda je javascript vložen do stránky, aby se zachovala pozice posouvání mezi postbacky. Tento atribut je ve výchozím nastavení false .
Pokud má tento atribut hodnotu true, ASP.NET přidá <blok skriptu> pro postback, který vypadá takto:
<script src="/website/WebResource.axd?d=jBAvpwrdOM_V_Xzeox989A2 &t=632653133849531250" type="text/javascript"> </script>
Všimněte si, že src pro tento blok skriptu je WebResource.axd. Tento prostředek není fyzická cesta. Když se tento skript vyžádá, ASP.NET ho dynamicky sestaví.
Masterpagefile
Tento atribut určuje soubor stránky předlohy pro aktuální stránku. Cesta může být relativní nebo absolutní. Stránky předlohy jsou popsané v modulu 4.
Motiv šablony stylů
Tento atribut umožňuje přepsat vlastnosti vzhledu uživatelského rozhraní definované motivem ASP.NET 2.0. Motivy jsou popsané v modulu 10.
Hodnota motivu
Určuje motiv stránky. Pokud hodnota není zadána pro atribut StyleSheetTheme, theme atribut přepíše všechny styly použité u ovládacích prvků na stránce.
Hodnota názvu
Nastaví název stránky. Zde zadaná hodnota se zobrazí v elementu <title> vykreslené stránky.
ViewStateEncryptionMode
Nastaví hodnotu pro ViewStateEncryptionMode výčtu. Dostupné hodnoty jsou Always( Vždy), Auto (Automaticky) a Never (Nikdy). Výchozí hodnota je Auto. Když je tento atribut nastaven na hodnotu Auto, viewstate je šifrovaný je ovládací prvek vyžaduje to voláním RegisterRequiresViewStateEncryption metoda.
Nastavení hodnot veřejných vlastností pomocí direktivy @ Page
Další novou funkcí direktivy @ Page v ASP.NET 2.0 je možnost nastavit počáteční hodnotu veřejných vlastností základní třídy. Předpokládejme například, že máte veřejnou vlastnost s názvem SomeText v základní třídě a chcete, aby byla inicializována na Hello při načtení stránky. Můžete toho dosáhnout jednoduchým nastavením hodnoty v direktivě @ Page takto:
<%@Page Language="C#" SomeText="Hello!" Inherits="PageBase" %>
Atribut SomeText direktivy @ Page nastaví počáteční hodnotu SomeText vlastnosti v základní třídě na Hello!. Následující video obsahuje návod k nastavení počáteční hodnoty veřejné vlastnosti v základní třídě pomocí direktivy @ Page.
Nové veřejné vlastnosti třídy stránky
Následující veřejné vlastnosti jsou v ASP.NET 2.0 nové.
Apprelativetemplatesourcedirectory
Vrátí cestu relativní k aplikaci na stránku nebo ovládací prvek. Například pro stránku umístěnou v http://app/folder/page.aspx, vrátí vlastnost ~/folder/.
AppRelativeVirtualPath
Vrátí relativní cestu virtuálního adresáře ke stránce nebo ovládacímu prvku. Například pro stránku umístěnou na http://app/folder/page.aspxadrese vrátí vlastnost ~/folder/page.aspx.
AsyncTimeout
Získá nebo nastaví časový limit použitý pro asynchronní zpracování stránky. (Asynchronní stránky budou popsány dále v tomto modulu.)
ClientQueryString
Vlastnost jen pro čtení, která vrací část řetězce dotazu požadované adresy URL. Tato hodnota je zakódovaná adresa URL. Můžete použít Metodu UrlDecode třídy HttpServerUtility k dekódování.
ClientScript
Tato vlastnost vrátí objekt ClientScriptManager, který lze použít ke správě asp. Emise NET skriptu na straně klienta. (Třída ClientScriptManager je popsána dále v tomto modulu.)
EnableEventValidation
Tato vlastnost určuje, jestli je pro události zpětného volání a zpětného volání povolené ověřování událostí. Pokud je tato možnost povolená, ověřují se argumenty pro události zpětného volání nebo události zpětného volání, aby se zajistilo, že pocházejí ze serverového ovládacího prvku, který je původně vykresloval.
Enabletheming
Tato vlastnost získá nebo nastaví logickou hodnotu, která určuje, zda se na stránku vztahuje motiv ASP.NET 2.0.
Formulář
Tato vlastnost vrátí formulář HTML na stránce ASPX jako objekt HtmlForm.
Hlavička
Tato vlastnost vrátí odkaz na HtmlHead objekt, který obsahuje záhlaví stránky. Vrácený objekt HtmlHead můžete použít k získání/nastavení šablon stylů, značek meta atd.
IdSeparator
Tato vlastnost jen pro čtení získá znak, který se používá k oddělení identifikátorů ovládacích prvků, když ASP.NET vytváří jedinečné ID ovládacích prvků na stránce. Není určen k použití přímo z vašeho kódu.
IsAsync
Tato vlastnost umožňuje asynchronní stránky. Asynchronní stránky jsou popsány dále v tomto modulu.
IsCallback
Tato vlastnost jen pro čtení vrátí hodnotu true , pokud je stránka výsledkem zpětného volání. Zpětné volání jsou popsány dále v tomto modulu.
IsCrossPagePostBack
Tato vlastnost jen pro čtení vrátí hodnotu true , pokud je stránka součástí zpětného zpětného volání mezi stránkami. Zpětné odkazy na více stránek jsou popsané dále v tomto modulu.
Položky
Vrátí odkaz na instanci IDictionary, která obsahuje všechny objekty uložené v kontextu stránky. Do tohoto objektu IDictionary můžete přidat položky, které budou k dispozici po celou dobu životnosti kontextu.
MaintainScrollPositionOnPostBack
Tato vlastnost určuje, zda ASP.NET vygeneruje JavaScript, který udržuje pozici posouvání stránek v prohlížeči po výskytu postbacku. (Podrobnosti o této vlastnosti byly popsány dříve v tomto modulu.)
Hlavní
Tato vlastnost jen pro čtení vrátí odkaz na instanci MasterPage pro stránku, na kterou byla použita stránka předlohy.
Masterpagefile
Získá nebo nastaví název stránky předlohy pro stránku. Tuto vlastnost lze nastavit pouze v metodě PreInit.
MaxPageStateFieldLength
Tato vlastnost získá nebo nastaví maximální délku stavu stránky v bajtech. Pokud je vlastnost nastavená na kladné číslo, stav zobrazení stránek se rozdělí do několika skrytých polí, aby nepřekročil zadaný počet bajtů. Pokud je vlastnost záporné číslo, stav zobrazení nebude rozdělen na bloky dat.
Pageadapter
Vrátí odkaz na objekt PageAdapter, který upraví stránku pro žádající prohlížeč.
Previouspage
Vrátí odkaz na předchozí stránku v případech server.Transfer nebo zpětného odeslání mezi stránkami.
Skinid
Určuje vzhled ASP.NET 2.0, který se má použít na stránku.
Stylesheettheme
Tato vlastnost získá nebo nastaví šablonu stylů, která je použita na stránku.
Templatecontrol
Vrátí odkaz na ovládací prvek obsahující stránku.
Motiv
Získá nebo nastaví název motivu ASP.NET 2.0 použitého na stránce. Tato hodnota musí být nastavena před metodou PreInit.
Nadpis
Tato vlastnost získá nebo nastaví název stránky tak, jak je získán ze záhlaví stránek.
ViewStateEncryptionMode
Získá nebo nastaví ViewStateEncryptionMode stránky. Podívejte se na podrobnou diskuzi o této vlastnosti dříve v tomto modulu.
Nové chráněné vlastnosti třídy stránky
Níže jsou uvedené nové chráněné vlastnosti třídy Page v ASP.NET 2.0.
Adaptér
Vrátí odkaz na controladapter, který vykreslí stránku na zařízení, které o to požádalo.
AsyncMode
Tato vlastnost označuje, zda je stránka zpracována asynchronně. Je určen pro použití modulem runtime, nikoli přímo v kódu.
ClientIDSeparator
Tato vlastnost vrátí znak použitý jako oddělovač při vytváření jedinečných ID klientů pro ovládací prvky. Je určen pro použití modulem runtime, nikoli přímo v kódu.
Pagestatepersister
Tato vlastnost vrátí PageStatePersister objekt pro stránku. Tuto vlastnost primárně používají vývojáři ASP.NET ovládacích prvků.
UniqueFilePathSuffix
Tato vlastnost vrátí jedinečnou příponu, která je připojena k cestě k souboru pro ukládání prohlížečů do mezipaměti. Výchozí hodnota je __ufps= a 6místné číslo.
Nové veřejné metody pro třídu stránky
Následující veřejné metody jsou pro třídu Page v ASP.NET 2.0 nové.
AddOnPreRenderCompleteAsync
Tato metoda registruje delegáty obslužné rutiny událostí pro asynchronní provádění stránky. Asynchronní stránky jsou popsány dále v tomto modulu.
ApplyStyleSheetSkin
Použije na stránku vlastnosti v šabloně stylů stránek.
ExecuteRegisteredAsyncTasks
Tato metoda představuje asynchronní úkol.
GetValidators
Vrátí kolekci validátorů pro zadanou ověřovací skupinu nebo výchozí ověřovací skupinu, pokud není zadán žádný.
RegisterAsyncTask
Tato metoda zaregistruje novou asynchronní úlohu. Asynchronní stránky jsou popsané dále v tomto modulu.
Registerrequirescontrolstate
Tato metoda ASP.NET říká, že stav ovládacího prvku stránky musí být trvalý.
RegisterRequiresViewStateEncryption
Tato metoda ASP.NET říká, že viewstate stránky vyžaduje šifrování.
Adresa ResolveClientUrl
Vrátí relativní adresu URL, kterou je možné použít pro požadavky klientů na obrázky atd.
SetFocus
Tato metoda nastaví fokus na ovládací prvek, který je zadán při počátečním načtení stránky.
UnregisterRequiresControlState
Tato metoda zruší registraci ovládacího prvku, který je mu předán, protože již nevyžaduje trvalost stavu ovládacího prvku.
Změny životního cyklu stránky
Životní cyklus stránky v ASP.NET 2.0 se dramaticky nezměnil, ale je tu několik nových metod, o nichž byste měli vědět. Životní cyklus stránky ASP.NET 2.0 je uveden níže.
PreInit (nové ve verzi ASP.NET 2.0)
Událost PreInit je nejstarší fází životního cyklu, ke které má vývojář přístup. Přidání této události umožňuje programově měnit motivy ASP.NET 2.0, stránky předlohy, vlastnosti přístupu k profilu ASP.NET 2.0 atd. Pokud jste ve stavu zpětného odeslání, je důležité si uvědomit, že viewstate dosud nebyl použit u ovládacích prvků v tomto okamžiku životního cyklu. Proto pokud vývojář změní vlastnost ovládacího prvku v této fázi, bude pravděpodobně přepsána později v životním cyklu stránky.
Init
Událost Init se nezměnila od ASP.NET 1.x. Tady byste chtěli číst nebo inicializovat vlastnosti ovládacích prvků na stránce. V této fázi stránky předlohy, motivy atd. už jsou na stránce použité.
InitComplete (nové ve verzi 2.0)
InitComplete událost je volána na konci fáze inicializace stránky. V tomto okamžiku životního cyklu můžete získat přístup k ovládacím prvkům na stránce, ale jejich stav ještě nebyl vyplněn.
Předběžné načtení (nové ve verzi 2.0)
Tato událost se volá po použití všech dat zpětného odeslání a těsně před Page_Load.
Načítání
Událost Load se nezměnila od ASP.NET 1.x.
LoadComplete (nové ve verzi 2.0)
Událost LoadComplete je poslední událostí ve fázi načítání stránek. V této fázi se na stránku použila všechna data postback a viewstate.
Prerender
Pokud chcete, aby byl viewstate správně udržován pro ovládací prvky, které jsou přidány na stránku dynamicky, PreRender událost je poslední příležitostí k jejich přidání.
PreRenderComplete (nové ve verzi 2.0)
Ve fázi PreRenderComplete byly na stránku přidány všechny ovládací prvky a stránka je připravená k vykreslení. PreRenderComplete událost je poslední událost vyvolaná před uložením stránky viewstate.
SaveStateComplete (nové ve verzi 2.0)
SaveStateComplete událost je volána okamžitě po uložení všech stavů zobrazení stránky a ovládacího prvku. Toto je poslední událost před tím, než se stránka skutečně vykreslí do prohlížeče.
Vykreslování
Metoda Render se nezměnila od ASP.NET 1.x. Zde se inicializuje HtmlTextWriter a stránka se vykreslí do prohlížeče.
Zpětná vazba mezi stránkami v ASP.NET 2.0
V ASP.NET 1.x bylo pro odeslání na stejnou stránku vyžadováno zpětné odeslání. Zpětná vazba mezi stránkami nebyla povolena. ASP.NET 2.0 přidává možnost publikovat zpět na jinou stránku prostřednictvím rozhraní IButtonControl. Jakýkoli ovládací prvek, který implementuje nové rozhraní IButtonControl (Button, LinkButton a ImageButton kromě vlastních ovládacích prvků třetích stran), mohou využívat výhod této nové funkce prostřednictvím použití PostBackUrl atributu. Následující kód ukazuje ovládací prvek Tlačítko, který odešle příspěvek zpět na druhou stránku.
<asp:Button ID="SubmitReport" PostBackUrl="~/Default.aspx" runat="server" Text="Submit Report" />
Když je stránka publikována zpět, stránka, která inicializuje zpětné odeslání, je přístupná prostřednictvím PreviousPage vlastnost na druhé stránce. Tato funkce je implementována prostřednictvím nové WebForm_DoPostBackWithOptions funkce na straně klienta, která ASP.NET 2.0 vykreslí na stránku, když se ovládací prvek vrátí na jinou stránku. Tuto funkci JavaScriptu poskytuje nová obslužná rutina WebResource.axd, která vysílá skript do klienta.
Následující video ukazuje názorný postup zpětného odeslání mezi stránkami.
Další podrobnosti o zpětném odeslání mezi stránkami
Viewstate
Možná jste se už ptali sami sebe na to, co se stane se stavem zobrazení z první stránky ve scénáři zpětného odeslání mezi stránkami. Koneckonců, každý ovládací prvek, který neimplementuje IPostBackDataHandler zachová svůj stav prostřednictvím viewstate, takže pokud chcete mít přístup k vlastnostem tohoto ovládacího prvku na druhé stránce křížového postbacku, musíte mít přístup k viewstate pro stránku. ASP.NET 2.0 se o tento scénář postará pomocí nového skrytého pole na druhé stránce s názvem __PREVIOUSPAGE. Pole formuláře __PREVIOUSPAGE obsahuje stav zobrazení pro první stránku, abyste měli přístup k vlastnostem všech ovládacích prvků na druhé stránce.
Obcházení funkce FindControl
Ve videu návodu na křížové stránky postback, jsem použil FindControl metoda získat odkaz na TextBox ovládací prvek na první stránce. Tato metoda pro tento účel funguje dobře, ale FindControl je nákladná a vyžaduje psaní dalšího kódu. Naštěstí ASP.NET 2.0 poskytuje alternativu k FindControl pro tento účel, který bude fungovat v mnoha scénářích. PreviousPageType Direktiva umožňuje mít odkaz silného typu na předchozí stránku pomocí TypeName nebo VirtualPath atribut. Atribut TypeName umožňuje zadat typ předchozí stránky, zatímco atribut VirtualPath umožňuje odkazovat na předchozí stránku pomocí virtuální cesty. Po nastavení direktivy PreviousPageType musíte zveřejnit ovládací prvky atd. k nimž chcete povolit přístup pomocí veřejných vlastností.
Zpětné odeslání mezi stránkami ve cvičení 1
V tomto cvičení vytvoříte aplikaci, která používá novou funkci zpětného odeslání mezi stránkami ASP.NET 2.0.
Otevřete Visual Studio 2005 a vytvořte nový web ASP.NET.
Přidejte nový webový formulář s názvem page2.aspx.
Otevřete Soubor Default.aspx v návrhovém zobrazení a přidejte ovládací prvek Tlačítko a TextBox.
- Dejte ovládacímu prvku Button ID SubmitButton a Ovládacímu prvku TextBox ID UserName.
- Nastavte vlastnost PostBackUrl tlačítka na page2.aspx.
Otevřete stránku page2.aspx ve zdrojovém zobrazení.
Přidejte direktivu @ PreviousPageType, jak je znázorněno níže:
Do Page_Load kódu na pozadí stránky page2.aspx přidejte následující kód:
Response.Write(PreviousPage.UserName.Text);
Sestavte projekt kliknutím na Sestavit v nabídce Sestavení.
Do kódu na pozadí pro Default.aspx přidejte následující kód:
public TextBox txtUserName { get { return this.UserName; } }
Změňte Page_Load v souboru page2.aspx na následující:
Response.Write(PreviousPage.txtUserName.Text);
Sestavte projekt.
Spustit projekt.
Zadejte své jméno do textového pole a klikněte na tlačítko.
Jaký je výsledek?
Asynchronní stránky v ASP.NET 2.0
Mnoho problémů s kolizemi v ASP.NET je způsobeno latencí externích volání (například volání webové služby nebo databáze), latencí vstupně-výstupních operací souborů atd. Když se vytvoří požadavek na aplikaci ASP.NET, ASP.NET použije k vyřízení tohoto požadavku jedno ze svých pracovních vláken. Tento požadavek vlastní toto vlákno, dokud nebude požadavek dokončen a odpověď odeslána. ASP.NET 2.0 se snaží vyřešit problémy s latencí těchto typů problémů přidáním možnosti asynchronně spouštět stránky. To znamená, že pracovní vlákno může spustit požadavek a pak předat další spuštění jinému vláknu, čímž se rychle vrátí do dostupného fondu vláken. Při vstupně-výstupních operacích souboru, volání databáze atd. Aplikace byla dokončena, z fondu vláken se získá nové vlákno pro dokončení požadavku.
Prvním krokem při asynchronním spouštění stránky je nastavení atributu Async direktivy page takto:
<%@ Page Async="true" %>
Tento atribut ASP.NET říká, aby pro stránku implementovali obslužnou rutinu IHttpAsyncHandler.
Dalším krokem je volání metody AddOnPreRenderCompleteAsync v bodě životního cyklu stránky před PreRender. (Tato metoda se obvykle nazývá v Page_Load.) Metoda AddOnPreRenderCompleteAsync má dva parametry; a BeginEventHandler a EndEventHandler. BeginEventHandler vrátí IAsyncResult, který se pak předá jako parametr EndEventHandler.
Následující video je návodem k asynchronní žádosti o stránku.
Poznámka
Asynchronní stránka se nevykreslí do prohlížeče, dokud se nedokončí obslužná rutina EndEvent. Není pochyb o tom, že někteří vývojáři budou asynchronní požadavky považovat za podobné asynchronním zpětným voláním. Je důležité si uvědomit, že nejsou. Výhodou asynchronních požadavků je, že první pracovní vlákno může být vráceno do fondu vláken, aby bylo možné obsluhovat nové požadavky, čímž se sníží kolize kvůli vázaným vstupně-výstupním operacím atd.
Zpětná volání skriptu v ASP.NET 2.0
Weboví vývojáři vždy hledali způsoby, jak zabránit blikání spojenému se zpětným voláním. V ASP.NET 1.x byla nejčastější metodou, jak se vyhnout blikání, smartNavigation ale některým vývojářům způsobovala problémy kvůli složitosti implementace v klientovi. ASP.NET 2.0 řeší tento problém se zpětnými voláními skriptu. Zpětná volání skriptů využívají XMLHttp k vytváření požadavků na webový server prostřednictvím JavaScriptu. Požadavek XMLHttp vrátí data XML, se kterými je pak možné manipulovat prostřednictvím modulu DOM prohlížeče. Kód XMLHttp je před uživatelem skrytý novou obslužnou rutinou WebResource.axd.
Ke konfiguraci zpětného volání skriptu v ASP.NET 2.0 je potřeba provést několik kroků.
Krok 1: Implementace rozhraní ICallbackEventHandler
Chcete-li ASP.NET rozpoznat vaši stránku jako účast na zpětném volání skriptu, musíte implementovat ICallbackEventHandler rozhraní. V souboru s kódem na pozadí to můžete udělat takto:
public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
Můžete to také provést pomocí direktivy @ Implements, například takto:
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
Při použití vloženého ASP.NET kódu byste obvykle použili direktivu @ Implements.
Krok 2: Volání GetCallbackEventReference
Jak bylo zmíněno dříve, volání XMLHttp je zapouzdřeno v obslužné rutině WebResource.axd. Při vykreslení stránky přidá ASP.NET volání WebForm_DoCallback klientského skriptu, který poskytuje WebResource.axd. Funkce WebForm_DoCallback nahradí funkci __doPostBack pro zpětné volání. Nezapomeňte, že __doPostBack odešle formulář na stránce prostřednictvím kódu programu. Ve scénáři zpětného volání chcete zabránit zpětnému volání, takže __doPostBack nebude stačit.
Poznámka
__doPostBack se stále vykresluje na stránku ve scénáři zpětného volání klientského skriptu. Nepoužívá se ale pro zpětné volání.
Argumenty pro WebForm_DoCallback funkce na straně klienta jsou poskytovány prostřednictvím funkce na straně serveru GetCallbackEventReference, která by se normálně volala v Page_Load. Typické volání GetCallbackEventReference může vypadat takto:
// Set up the JavaScript callback string cbRef = cm.GetCallbackEventReference(this, "document.getElementById('ddlCompany').value", "ShowCompanyName", "null", true);
Poznámka
V tomto případě je cm instancí ClientScriptManager. Třída ClientScriptManager bude popsána později v tomto modulu.
Existuje několik přetížených verzí GetCallbackEventReference. V tomto případě jsou argumenty následující:
this
Odkaz na ovládací prvek, kde GetCallbackEventReference je volána. V tomto případě je to samotná stránka.
document.getElementById('ddlCompany').value
Řetězcový argument, který se předá z kódu na straně klienta události na straně serveru. V tomto případě předávám hodnotu rozevíracího seznamu s názvem ddlCompany.
ShowCompanyName
Název funkce na straně klienta, která přijme návratovou hodnotu (jako řetězec) z události zpětného volání na straně serveru. Tato funkce bude volána pouze v případě, že je zpětné volání na straně serveru úspěšné. Z důvodu robustnosti se proto obecně doporučuje použít přetíženou verzi GetCallbackEventReference, která přebírá další řetězcový argument určující název funkce na straně klienta, která se má spustit v případě chyby.
null
Řetězec představující funkci na straně klienta, kterou iniciovala před zpětným voláním na server. V tomto případě žádný takový skript neexistuje, takže argument je null.
true
Logická hodnota určující, zda se má zpětné volání provádět asynchronně.
Volání WebForm_DoCallback na klientovi předá tyto argumenty. Proto když se tato stránka vykreslí na klientovi, bude tento kód vypadat takto:
WebForm_DoCallback('__Page',document.getElementById('ddlCompany').value, ShowCompanyName,null,null,true)
Všimněte si, že podpis funkce na klientovi se trochu liší. Funkce na straně klienta předává 5 řetězců a logickou hodnotu. Další řetězec (který má ve výše uvedeném příkladu hodnotu null) obsahuje funkci na straně klienta, která bude zpracovávat chyby ze zpětného volání na straně serveru.
Krok 3: Připojení události ovládacího prvku Client-Side
Všimněte si, že návratová hodnota GetCallbackEventReference výše byla přiřazena řetězcové proměnné. Tento řetězec se používá k připojení události na straně klienta pro ovládací prvek, který inicializuje zpětné volání. V tomto příkladu je zpětné volání inicializováno rozevíracím seznamem na stránce, takže chci připojit událost OnChange .
Pokud chcete připojit událost na straně klienta, jednoduše přidejte obslužnou rutinu do kódu na straně klienta následujícím způsobem:
// Hook the JavaScript function to the onchange event of the dropdown ddlCompany.Attributes["onchange"] = String.Format("javascript:{0}", cbRef);
Vzpomeňte si, že cbRef je návratová hodnota z volání GetCallbackEventReference. Obsahuje volání WebForm_DoCallback, které bylo znázorněno výše.
Krok 4: Registrace skriptu Client-Side
Vzpomeňte si, že volání GetCallbackEventReference určilo, že skript na straně klienta s názvem ShowCompanyName bude spuštěn při úspěšném volání na straně serveru. Tento skript je potřeba přidat na stránku pomocí instance ClientScriptManager. (Třída ClientScriptManager bude popsána dále v tomto modulu.) Uděláte to takto:
System.Text.StringBuilder clientScript = new System.Text.StringBuilder(""); ClientScriptManager cm = Page.ClientScript; // Create the client script clientScript.Append("function ShowCompanyName(companyName)"); clientScript.Append("{"); clientScript.Append("document.getElementById('CoClicked').innerHTML = \"You chose \" + companyName + \".\";"); clientScript.Append("}"); cm.RegisterClientScriptBlock(this.GetType(), "showCo", clientScript.ToString(), true);
Krok 5: Volání metod rozhraní ICallbackEventHandler
ICallbackEventHandler obsahuje dvě metody, které musíte implementovat v kódu. Jsou to RaiseCallbackEvent a GetCallbackEvent.
RaiseCallbackEvent přebírá řetězec jako argument a nevrací nic. Řetězcový argument se předává z volání na straně klienta do WebForm_DoCallback. V tomto případě je tato hodnota atributem value rozevíracího seznamu s názvem ddlCompany. Kód na straně serveru by měl být umístěn v metodě RaiseCallbackEvent. Pokud například vaše zpětné volání vytváří WebRequest pro externí prostředek, měl by být tento kód umístěn v RaiseCallbackEvent.
GetCallbackEvent zodpovídá za zpracování vrácení zpětného volání klientovi. Nebere žádné argumenty a vrátí řetězec. Řetězec, který vrátí, bude předán jako argument funkci na straně klienta, v tomto případě ShowCompanyName.
Po dokončení výše uvedených kroků jste připraveni provést zpětné volání skriptu v ASP.NET 2.0.
Zpětná volání skriptu v ASP.NET jsou podporovaná v libovolném prohlížeči, který podporuje volání XMLHttp. To zahrnuje všechny moderní prohlížeče, které se dnes používají. Internet Explorer používá objekt ACTIVEX XMLHttp, zatímco jiné moderní prohlížeče (včetně nadcházejícího IE 7) používají vnitřní objekt XMLHttp. Chcete-li programově určit, zda prohlížeč podporuje zpětná volání, můžete použít Request.Browser.SupportCallback vlastnost. Tato vlastnost vrátí hodnotu true , pokud žádající klient podporuje zpětné volání skriptu.
Práce s klientským skriptem v ASP.NET 2.0
Klientské skripty v ASP.NET 2.0 se spravují pomocí třídy ClientScriptManager. Třída ClientScriptManager sleduje klientské skripty pomocí typu a názvu. Zabráníte tak programovému vložení stejného skriptu na stránku více než jednou.
Poznámka
Po úspěšné registraci skriptu na stránce bude mít jakýkoli následný pokus o registraci stejného skriptu jednoduše za následek, že skript nebude zaregistrován podruhé. Nejsou přidány žádné duplicitní skripty a nedochází k žádné výjimce. Abyste se vyhnuli zbytečným výpočtům, existují metody, které můžete použít k určení, jestli je skript již zaregistrovaný, abyste se ho nepokusili zaregistrovat více než jednou.
Metody ClientScriptManager by měli znát všichni aktuální vývojáři ASP.NET:
Registerclientscriptblock
Tato metoda přidá skript na začátek vykreslené stránky. To je užitečné pro přidání funkcí, které budou explicitně volána v klientovi.
Existují dvě přetížené verze této metody. Tři ze čtyř argumentů jsou mezi nimi společné. Jsou to tyto:
type (string)
Argument type identifikuje typ skriptu. Obecně je vhodné použít typ stránky (toto). GetType()) pro typ.
key (string)
Argument key je uživatelem definovaný klíč pro skript. To by mělo být pro každý skript jedinečné. Pokud se pokusíte přidat skript se stejným klíčem a typem již přidaného skriptu, nebude přidán.
script (string)
Argument skriptu je řetězec obsahující skutečný skript, který se má přidat. K vytvoření skriptu se doporučuje použít StringBuilder a pak použít metodu ToString() v StringBuilderu k přiřazení argumentu skriptu .
Pokud použijete přetížený RegisterClientScriptBlock, který přijímá pouze tři argumenty, musíte do skriptu zahrnout elementy skriptu (<script> a </script>).
Můžete se rozhodnout použít přetížení RegisterClientScriptBlock, které přebírá čtvrtý argument. Čtvrtý argument je logická hodnota, která určuje, zda ASP.NET přidat prvky skriptu za vás. Pokud je tento argument pravdivý, neměl by skript explicitně obsahovat elementy skriptu.
Pomocí metody IsClientScriptBlockRegistered zjistěte, jestli je skript již zaregistrovaný. Díky tomu se můžete vyhnout pokusu o opětovnou registraci již zaregistrovaného skriptu.
RegisterClientScriptInclude (nové ve verzi 2.0)
Značka RegisterClientScriptInclude vytvoří blok skriptu, který odkazuje na soubor externího skriptu. Má dvě přetížení. Jeden vezme klíč a adresu URL. Druhý přidá třetí argument určující typ.
Následující kód například vygeneruje blok skriptu, který odkazuje na jsfunctions.js v kořenové složce scripts aplikace:
ClientScriptManager cm = Page.ClientScript; if(!cm.IsClientScriptIncludeRegistered("jsfunc")) { cm.RegisterClientScriptInclude(this.GetType(), "jsfunc", "/scripts/jsfunctions.js"); }
Tento kód vytvoří na vykreslené stránce následující kód:
<script src="/scripts/jsfunctions.js" type="text/javascript"></script>
Poznámka
Blok skriptu se vykreslí v dolní části stránky.
Pomocí metody IsClientScriptIncludeRegistered zjistěte, jestli už byl skript zaregistrovaný. Díky tomu se můžete vyhnout pokusu o opětovnou registraci skriptu.
Registerstartupscript
Metoda RegisterStartupScript přijímá stejné argumenty jako metoda RegisterClientScriptBlock. Skript zaregistrovaný v RegisterStartupScriptu se spustí po načtení stránky, ale před událostí onLoad na straně klienta. Ve 1.X byly skripty zaregistrované v RegisterStartupScriptu umístěny těsně před uzavírací <značku /form> , zatímco skripty zaregistrované pomocí RegisterClientScriptBlock byly umístěny hned za počáteční <značku formuláře> . V ASP.NET 2.0 jsou obě umístěny bezprostředně před uzavírací <značku /form> .
Poznámka
Pokud zaregistrujete funkci pomocí RegisterStartupScriptu, tato funkce se nespustí, dokud ji explicitně nezavoláte v kódu na straně klienta.
Pomocí metody IsStartupScriptRegistered určete, zda již byl skript zaregistrován, a vyhněte se pokusu o opětovnou registraci skriptu.
Jiné metody ClientScriptManager
Zde jsou některé z dalších užitečných metod Třídy ClientScriptManager.
GetCallbackEventReference | Viz zpětná volání skriptů dříve v tomto modulu. |
---|---|
GetPostBackClientHyperlink | Získá odkaz javascriptu (javascript:<call>), který lze použít k odeslání zpět z události na straně klienta. |
Getpostbackeventreference | Získá řetězec, který lze použít k zahájení příspěvku zpět z klienta. |
GetWebResourceUrl | Vrátí adresu URL prostředku, který je vložen v sestavení. Musí být použit ve spojení s RegisterClientScriptResource. |
Registerclientscriptresource | Zaregistruje webový prostředek na stránce. Jedná se o prostředky vložené do sestavení, které zpracovává nová obslužná rutina WebResource.axd. |
RegisterHiddenField | Zaregistruje na stránce skryté pole formuláře. |
RegisterOnSubmitStatement | Zaregistruje kód na straně klienta, který se spustí při odeslání formuláře HTML. |