Az AJAX egy új keletű akroníma, melynek jelentése: Asynchronous Javascript And Xml. Ez egy fajta teljeskörű leírása az interaktív
webes alkalmazásoknak. Egy fejlesztő orientált szemszögből az AJAX komponensek, fejlesztői eszközök és technikák
halmaza, melyek lehetővé teszik az interaktív webes alkalmazások elkészítését. Ezek az alkalmazások a felhasználóknak is
nagyobb élményt nyújtanak. Az AJAX paradigmájának megfelelően ezek az alkalmazások az oldalak cserélgetése helyett csak adatokat
cserélgetnek a web szerverrel. Ez a felhasználók szemszögéból gyorsabb kommunikációt jelent, és ami még fontosabb, az oldalak frissítéséhez
és betöltéséhez szükséges idő lényegesen redukálódik. Ennek eredménye képpen a webes alkalmazások egy megszokott Microsoft Windows-os
alkalmazásként látszanak, melynek rengeteg előnyei közé tartozik például a drag-and-drop tulajdonság, vagy akár egy vibrálás mentes
felhasználói felület. (Vigyázat! Ez nem azt jelenti, hogy az AJAX webes alkalmazások ugyanolyanok, mint az asztali alkalmazások, csak rendelkeznek
néhány ahhoz hasonló tulajdonsággal.)
A klasszikus webes alkalmazások általában egy felhasználó által kitöltött form-ot küldenek a web szervernek, majd az visszaküldi az eredményt, amit
a kliens megjelenít. Ezzel szemben az AJAX webes alkalmazások csak néhány adatot küldenek, és nem újra rajzolják az oldalt, csak frissítik
annak egyes elemeit. Így jelentősen csökken a várakozási idő, és nem kell az oldal újrarajzolása miatti időt sem végig várni.
Az AJAX technikát ma már minden keretrendszerbe beépítették. Ennek következménye, hogy az ASP.NET is alkalmas AJAX webes alkalmazások elkészítésére.
Ehhez azonban szükség van a Microsoft ASP.NET AJAX Extensions-re mely az ASP.NET 2.0 platform kiegészítése. A későbbi verziók
ezt már alapból tartalmazzák, nem kell külön telepíteni.
Architektúrálisan az AJAX két jól elkülöníthető elemből tevődik össze: egy kliens oldali script könyvtárból és egy szerver oldali vezérlő eszközök
halmazából, melyek lehetővé teszik az AJAX használatát az ASP.NET számára. Az AJAX kiegészítő könyvtár mind a szerver, mind a kliens oldalon nagy előnyökkel szolgál.
Alkalmazásával nem csak olyan alkalmazások készíthetők, melyek szinte bármely web-böngésző használata során ugyanúgy viselkednek, hanem maga az
alkalmazás megvalósítása is könnyebb és sokkal átláthatóbb.
Két fő megközelítése van az ASP.NET AJAX oldalak létrehozásának: a szerver központú és a kliens központú megközelítés. A szerver centrikus modellben egy AJAX-alapú
felhasználói felületet lehet hozzáadni az új vagy már meglévő alkalmazáshoz. A Microsoft Visual Basic .NET vagy C# nyelven írt központi rész megmarad. Ugyanakkor az alkalmazás
JavaScript kódon keresztül hasznot is húz a böngésző képességeiből. Ehhez szinte semmilyen JavaScript ismeretre nincs szükség. E modell választása esetén minimális tanulással
megvalósítható egy interaktív AJAX alkalmazás.
Az AJAX igazi ereje akkor mutatkozik meg, ha képes vagy teljesen befolyásolni a JavaScript-et és a böngésző DOM-ját, a kliens centrikus modellben. Az ezen a módon készített
alkalmazások már egészen hasonlóan reagálnak a felhasználó input-jaira, mint az asztali alkalmazások. A kliens centrikus modell alkalmazásához jó kliens-oldali programozói készségek
kellenek. Mindenre oda kell figyelni: szerver operációk kiváltására, az eredmények feldolgozására, és a felhasználó felület frissítésére. Nagyon fontos, hogy ügyelni kell az esetleges
hibákra és memória hézagokra.
Szerver oldalon ez mind sokkal egyszerűbb. Egy speciális komponens figyel oda ezek nagy részére, persze némi sávszélességért cserébe. Ez a komponens irányítja a post kéréseket és az oldal frissítéseket.
Ehhez egy sor kódot sem szükséges leírni, csupán egy vezérlő elemet kell hozzáadni az oldalhoz és a konfigurációs file-t kell átírni.
Első ránézésre egy ASP.NET AJAX projekt létrehozása során minden úgy tűnik, mintha egy sima ASP.NET weboldalt készítenénk. Kicsit jobban megvizsgálva a konfigurációs file-t észrevehetünk némi változást új szekciók és futási komponensek formájában.
ASP.NET-ben a web.config konfigurációs file tartalmazza az alkalmazás beállításait. Ezek a beállítások a web.config-ot tartalmazó könyvtárra és annak minden alkönyvtárára vonatkoznak.
Minden alkalmazás különböző web.config file-okkal rendelkezhet a különböző könyvtári szinteken, melyek az adott könyvtárra vonatkoznak.
A web.config file egy szöveges file, mely egy XML séma szerint van felépítve. A standard séma alapból tartalmaz néhány beépített szekciót és elemet, de ezek kiegészíthetők a különböző szolgátatások
és eszközök konfigurálásával. A konfigurációs file tartalmaz egy gyökér elemet, a <configuration> elemet. Ehhez opcionálisan hozzá lehet venni újabb szekciókat. Minden ilyen szekciót deklarálni kell
egy <configSections> elemmel. A következő kódrészlet mutatja be, hogy egy ASP.NET AJAX alkalmazás létrehozásakor milyen új szekciók jönnek létre:
<configuration> <configSections> <sectionGroup name="system.web.extensions" ...> <sectionGroup name="scripting" ... /> <section name="scriptResourceHandler" ... /> <sectionGroup name="webServices" ... > <section name="jsonSerialization" ... /> <section name="profileService" ... /> <section name="authenticationService" ... /> </sectionGroup> </sectionGroup> </sectionGroup> </configSections> ... </configuration>
A <scripting> szekció néha tartalmazhat egy <scriptResourceHandler> szekciót. Ez azt határozza meg, hogy az ASP.NET AJAX script-ek hogyan legyenek kiszolgálva és kezelve. A <scriptResourceHandler> szekciónak két attribútuma van: az enableCaching és az enableCompression. Mindkettő boolean típusú és true alapértelmezettként.
<scripting> <scriptResourceHandler enableCaching="true" enableCompression="true" /> </scripting>
A <webServices> szekciónak a következő gyermekei lehetnek:
Szekció | Leírás |
authenticationService | Az ASP.NET AJAX autentikációs szolgáltatását konfigurálja. Ha ez a szolgáltatás aktív, akkor anélkül lehet azonosítani a felhasználókat, hogy egy belépési felületre kellene őket átirányítani. Opcionálisan konfigurálni lehet arra is, hogy csak biztonságos csatornán keresztül lehessen bejelentkezni. |
jsonSerialization | Az alkalmazásban regisztrált JSON serializer-ek listáját határozza meg. Ezek a <converters> szekció alatt vannak csoportosítva. A maxJsonLength attribútum egy JSON string hosszát határozza meg byte-okban. Ez alapértelmezettként 500. |
profileService | Az ASP.NET AJAX profil szolgáltatását állítja be. Ha ez a szolgáltatás aktív, akkor JavaScript-ből lehet a felhasználók profiljának tulajdonságait módosítani. Ahhoz, hogy ezek elérhetők és módosíthatók legyenek meg kell adni a nevüket a readAccessProperty és a writeAccessProperty attríbútumoknál. |
Mint egy kiegészítő, az ASP.NET AJAX Extensions az ASP.NET kibővíthetőségi modelljére támaszkodik. Ennek néhány kulcs fontosságú funkcionalitása hozzáadott futási idejű komponensek segítségével van implementálva, mint például a HTTP modulok és kezelők. Ha ezekre szükség van, akkor a következő részekben látható módon regisztrálni kell őket a web.config file-ban.
A rendszer és felhasználói script-ek hatékony kezeléséhez az ASP.NET-nek szüksége van egy HTTP kezelő regisztrálására. Az ASP.NET AJAX script kezelő a Microsoft AJAX könyvtárakat és más script-eket egy ScriptResource.axd nevű kezelőn keresztül használja. Ez a következő képpen van definiálva:
<httpHandlers> <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, ..." /> </httpHandlers>
<httpHandlers> <remove verb="*" path="*.asmx" /> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, ..."/> </httpHandlers>
Az ASP.NET AJAX Extensions szerver oldali infrastruktúrában a fő vezérlés a ScriptManager vezérlő és az ikertestvére, a ScriptManagerProxy vezérlő kezében van.
Minden ASP.NET oldalon csak egy példány van belőlük. Egy ASP.NET oldal sem rendelkezik AJAX tulajdonságokkal, ha nincs benne hivatkozás a ScriptManager vezérlőre.
A ScriptManagerProxy vezérlőt csak az úgynevezett master oldalakon használják.
A ScriptManager vezérlő kezelő és szolgáltatja a script-eket, aképpen, hogy engedélyezi a kliens oldali JavaScript típusú kiegészítők használatát. Ez a vezérlő emellett
támogatja a részleges oldal betöltést és egyéb webes szolgáltatások hívását.
<asp:ScriptManager runat="server" ID="ScriptManager1" />
Tulajdonság | Leírás |
AllowCustomErrorsRedirect | Azt mutatja, hogy egy hiba át legyen irányítva egy aszikron vissza post-olás esetén. Az alapértelmezett érték a true. |
AsyncPostBackErrorMessage | Lekéri és beállítja a hibaüzenetet, amit a kliensnek küld egy esetleges kezeletlen kivétel esetén, egy aszikron vissza post-oláskor. Ha nincs beállítva, akkor a kivétel üzenetét fogja használni. |
AsyncPostBackSourceElementID | Lekéri a szerver oldali vezérlő elem azonosítóját, amely a post-olást kérte. Ha nincs post kérés, akkor az üres stringre van állítva. |
AsyncPostBackTimeout | Az időkorlátot állítja be és kérdezi le egy post esetén. A zero érték jelentése az, hogy nincs időkorlát. Az alapértelmezett érték 90. |
AuthenticationService | Lekér egy objektumot, amin keresztül be lehet állítani a kliens-oldali azonosítás szolgáltatás tulajdonságait. |
EnablePageMethods | Azt mutatja, hogy kliens oldalról meghívhatók-e statikus metódusok egy ASP.NET oldalon. Az alapértelmezett érték true. |
EnablePartialRendering | Azt mutatja, hogy engedélyezett-e a részleges oldal betöltés az oldalon. Alapértelmezzettként true. |
EnableScriptGlobalization | Megmutatja, hogy a ScriptManager kiadhat-e egy script-et a kliensnek, amely támogatja az információk elemzését és formázását. Alapértelemezettként false. |
EnableScriptLocalization | Megmutatja, hogy a ScriptManager vezérlő visszaszerezze-e a script file-okat, ha vannak ilyenek. Alapértelmezettként false. |
IsDebuggingEnabled | Azt mutatja, hogy a könyvtárak hibakereső (debug) verziói kiadhatók-e klienseknek. A @Page direktíva debug attribútumának nincs hatása erre a tulajdonságra. |
IsInAsyncPostBack | Megmutatja, hogy az aktuális oldal kérés egy post-hoz tartozik-e. |
LoadScriptsBeforeUI | Megmutatja, hogy a script-ek a felhasználói felület betöltése előtt vagy utána töltődjenek be. |
ProfileService | Lekér egy objektumot, amelyen keresztül be lehet állítani a kliens oldali profil tulajdonságait. |
ScriptMode | Lekéri és beállítja a script-ek típusait, amelyek betöltődnek, ha több, mint egy típus elérhető. A lehetséges értékek a ScriptMode felsorolási típusból jönnek: Auto, Inherit, Debug vagy Release. Az alapértelmezett érték az Auto, ami azt jelenti, hogy a típust futási időben fogja kikövetkeztetni. |
ScriptPath | Ha be van állítva, akkor a Web források könyvtár helyett, ebből a könyvtárból töltődnek be a script-ek. |
Scripts | Script hivatkozások egy gyűjteményét kéri, melyeket a ScriptManager-nek be kell tölteni az oldalra. |
Services | Szolgáltatások egy gyűjteményét kéri, melyeket a ScriptManager-nek be kell tölteni az oldalra. |
SupportsPartialRendering | Megmutatja, hogy a böngésző támogatja-e a részleges oldal betöltést. Ha ez a tulajdonság false-ra van állítva, akkor függetlenül az EnablePartialRendering tulajdonság értékétől, az oldal nem fogja támogatni a részleges oldal betöltést. Az alapértelmezett érték true. |
Metódus | Leírás |
GetCurrent | Statikus metódus, az oldalon aktív ScriptManager példányt adja vissza. |
RegisterArrayDeclaration | Statikus metódus, gondoskodik arról, hogy az ECMAScript tömb ki legyen adva egy részlegesen betöltődő oldalnak. |
RegisterAsyncPostBackControl | Megjegyzi, hogy az adott vezérlő aszinkron post-ot kérhet egy frissíthető panelről. |
RegisterClientScriptBlock | Statikus metódus, biztosítja, hogy az adott script biztosan ki legyen adva egy részlegesen betöltődő oldalnak. |
RegisterClientScriptInclude | Statikus metódus, gondoskodik arról, hogy a <script> tag src attribútumán keresztüli külső script file importálása jelezve legyen. |
RegisterClientScriptResource | Statikus metódus, gondoskodik arról, hogy az oldal forrásai közé tartozó script importálása jelezve legyen. |
RegisterDataItem | Regisztrál egy szöveges adatot, amely a kliensnek lesz elküldve egy részlegesen betöltődő oldal kimenetével együtt. |
RegisterDispose | Vezérlőket regisztrál, melyek egy kliens oldali script-et igényelnek, hogy egy aszinkron post után felszámolják a kliens forrásait. |
RegisterExpandoAttribute | Statikus metódus, mely gondoskodik arról, hogy egy nem standard attribútum importálása jelezve legyen a részlegesen betöltődő oldalnak. |
RegisterExtenderControl | Regisztrál egy kiegészítő vezérlőt az aktuális ASP.NET oldalhoz. |
RegisterHiddenField | Statikus metódus, amely gondoskodik arról, hogy a megadott láthatatlan mező el legye küldve a részlegesen betöltődő oldalnak. |
RegisterOnSubmitStatement | Statikus metódus, amely biztosítja, hogy a kliens-oldali script, amely az űrlap OnSubmit eseményéhez van rendelve, biztosan végrehajtódjon. |
RegisterPostBackControl | Megjegyzi, hogy az adott vezérlő teljes post-ot kérhet egy frissíthető panel-ről. |
RegisterScriptControl | Regisztrál egy script vezérlőt az aktuális ASP.NET oldalhoz. |
RegisterScriptDescriptors | Regisztrál egy script leírót az aktuális ASP.NET oldalhoz. |
RegisterStartupScript | Statikus metódus, amely gondoskodik arról, hogy a kliens oldali script meghívodjon a <form> végén. Ezen a módon a script akkor fog végrehajtódni, mikor az oldal újratöltése befejeződik. |
SetFocus | Lehetővé teszi, hogy egy aszinkron post után a fókusz a megadott kliens oldali elemre kerüljön. |
Esemény | Leírás |
AsyncPostBackError | Akkor következik be, ha egy kivétel kezeletlenné válik egy aszinkron post közben. |
ResolveScriptReference | Akkor következik be, ha a ScriptManager megpróbál feloldani egy script hivatkozást. |
Minden ASP.NET AJAX oldalhoz csak egy ScriptManager vezérlő adható. Azonban erre két féle módszer is van. Közvetlenül is hozzáadható az oldalhoz a <asp:ScriptManager> tag használatával, vagy közvetetten egy olyan komponens importálásával, amely már tartalmaz egy ScriptManager objektumot. Tipikus példák az közvetett esetre például egy felhasználói objektum hozzáadása, vagy egy tartalom oldal hozzáadása a fő oldalhoz (master page).
Mi történik, ha egy tartalom oldal egy új script referenciát akar hozzáadni a manager objektumhoz? Ebben az esetben szükség van egy hivatkozásra a ScriptManager objektumra. Habár ez a főoldalon vagy a felhasználói vezérlőben már definiálva van, a tartalom oldalon nem biztos, hogy elérhető azaz a számára nem biztos, hogy publikus. A megfelelő példány eléréséhez a ScriptManager osztály GetCurrent statikus metódusa használható:
// Az oldalon lévő aktív ScriptManager lekérdezése sm = ScriptManager.GetCurrent(this.Page);
Teljesen megbízva a kliens képességeiben, az ASP.NET AJAX sok script-et használ. A ScriptManager vezérlő kezeli az erőforrásokat, melyeket azok a vezérlők használnak, amelyek résztvesznek a részleges frissítésben.
A Scripts gyűjtemény felhasználásával lehet új script-et hozzáadni.
A ScriptManager vezérlő automatikusan kiad minden a kliens számára szükséges ASP.NET AJAX script-et. Ezáltal az oldal fejlesztőjének nem kell olyan kódok miatt aggódnia, amelyek például a JavaScript kiegészítés támogatásához szükségesek. Ezenfelül ott van a Scripts gyűjtemény az egyéb script-ek regisztrálására. A gyűjteményhez a <asp:ScriptReference> tag segítségével lehet script-eket hozzáadni. A következő kis kód részlet erre ad példát:
<asp:ScriptManager runat="server" ID="ScriptManager1"> <Scripts> <asp:ScriptReference Name="Microsoft.Web.Resources.ScriptLibrary.PreviewGlitz.js" Assembly="Microsoft.Web.Preview" /> <asp:ScriptReference Path="~/Scripts/MyLib.js" /> </Scripts> </asp:ScriptManager>
Tulajdonság | Leírás |
Assembly | Az assembly-t mutatja, amely a kliensre letöltendő script-et tartalmazza. |
IgnoreScriptPath | Logikai érték, amely azt mutatja, hogy az opcionálisan beállított ScriptPath értéket figyelmen kívül hagyja-e. Alapértelmezettként false az értéke. |
Name | A letöltendő script neve. |
NotifyScriptLoaded | Logikai érték, amely azt mutatja, hogy a script betöltő automatikusan jelentse-e a Sys.Application objektumnak a sikeres script betöltést. Alapértelmezettként true az értéke. |
Path | A letöltendő script elérési útját adja meg a szerveren. |
ResourceUICultures | Vesszővel tagolt szöveg, mely az elérési út által támogatott érvényes UI-kat tartalmazza. |
ScriptMode | Egy algoritmust határoz meg egy script file debug vagy release verziójának kiválasztására. Ha nincs debug verzió, akkor a ScriptReference automatikusan visszaállítódik a release-re. A tulajdonság lehetséges értékei a ScriptMode felsorolási típusból jönnek. |
A globalizálás egy programozási mód, mely támogatja több kultúra használatát egy kódban. Egy kérés, amely a szerveren hajtódik végre, többféle módon is lekérdezheti és beállíthatja az aktuális kultúrát Például használható a @Page direktíva Culture attribútuma, a Page osztály Culture tulajdonsága, vagy a <globalization> szekció a web.config file-ban.
A ScriptManager vezérlőben definiált EnableScriptGlobalization logikai tulajdonság teszi lehetővé, hogy kliens elérje ezeket az információkat. Ha az EnableScriptGlobalization tulajdonság true, akkor a ScriptManager beállítja a kliens Sys.CultureInfo objektumát, amelyet JavaScript osztályok felhasználhatnak, hogy kultúra specifikusan jelenítsék meg a tartalmat. A következő kódrészlet ad példát erre:
<script type="text/javascript"> <!- var __cultureInfo = '{"name":"it-IT", ... }'; // --> </script>
<script type="text/javascript" language="Javascript"> function ShowDate() { var d = new Date(); var strDate = d.localeFormat("dddd, dd MMMM yyyy HH:mm:ss"); $get('Label1').innerHTML = strDate; } </script>
Friday, 02 February 2007 15:52:43
<%@ Page Language="C#" Culture="it-IT" ... %> ... <asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptGlobalization="true" />
Script file-oknak lehetnek olyan elemei, mint például az üzenetek szövege vagy a UI elemei, melyek lokalizálhatók, azaz a területi beállításaik megváltoztathatók. Ha az EnableScriptLocalization tulajdonság true-ra van állítva és az oldalon meg van adva a UI elemeknek egy kultúra, akkor a ScriptManager automatikusan az aktuális nyelvterülethez igazítja a script-eket, bármilyen legyen is az.
A globalizálással szemben a lokalizálást a @Page direktíva UICulture attribútuma és a Page osztály UICulture tulajdonsága vezérli. Így egy ASP.NET AJAX oldalon, mely támogatja a globalizálást és lokalizálást egyaránt, a következő direktívát kell tartalmazza:
<%@ Page Language="C#" UICulture="it-IT" Culture="it-IT" ... %>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptLocalization="true"> <Scripts> <asp:ScriptReference Path="Person.js" ResourceUICultures="it-IT" /> </Scripts> </asp:ScriptManager>
ASP.NET AJAX-ban a script-ek hibakezelését két részre lehet osztani. A következőkben ezeket ismertetjük.
Általánosságban a legnagyobb különbség a nyomkövető és leválasztó script-ek között, hogy a leválasztó script-ek törlik a felesleges karaktereket, megjegyzéseket, nyomkövető utasításokat. Manapság egyre elterjedtebb, hogy a világháló bármely részéről le lehet tölteni különböző script-eket, melyek tele vannak különféle kommentekkel, üres sorokkal, azonban AJAX-nál, ahol a script-ek a leglényegesebbek, minden egyes bit számít, amit meg lehet spórolni. Ezért az AJAX script-ek általában debug és release verzióban is megjelennek, és bárkinek aki JavaScript osztályt ír tisztában kell lennie, hogy hogyan kell ezeket elkészíteni. A kérdés az, hogy melyik verzió kerül a klienshez? És mi alapján? A legegyszerűbb megközelítés, hogy hagyjuk rá a programozóra, és kérjük, hogy a kontextustól függő változatot linkelje be. ASP.NET AJAX Extensions-ben, hogy milyen logika szerint választja a debug vagy a release script-et teljesen a ScriptManager-be van építve. Meg kell mondani a ScriptManager-nek, hogy melyik módot szeretnénk használi (debub vagy release) és az majd gondoskodik arról, hogy azok kerüljenek letöltésre. Ha egy file neve MyScript.debug.js, akkor az valószínűleg a MyScript.js script debug változata. Ez a konvenció érvényes minden rendszer és egyedi script-re is. A ScriptManager objektum ScriptMode tulajdonsága adja meg a globális algoritmust a script-ek használatára. Ez a tulajdonság mind a ScriptManager, mind a ScriptReference objektumnál a ScriptMode felsorolási típusból vehet fel értéket. Ezek a következők:
Érték | Leírás |
Auto | A ScriptManager vagy a ScriptReference objektum dönti el, hogy melyik típusú script-eket használja. Az algoritmus különböző eredményeket adhat, függően a script-ek elhelyezkedésétől, és a futtatási feltételektől. |
Debug | A ScriptManager betölti a script-ek debug verzióit, hacsak egy másik felül nem írta a tulajdonságot. A ScriptReference betölti a debug verziókat. |
Inherit | ScriptManager-ben ez megegyezik az Auto értékkel. Egy ScriptReference vezérlőben a ScriptManager vezérlőtől öröklődik az érték. |
Release | A ScriptManager betölti a script-ek release verzióit, hacsak egy másik felül nem írta a tulajdonságot. A ScriptReference betölti a release verziókat. |
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Auto"> <Scripts> <asp:ScriptReference path="person.js" ScriptMode="Inherit" /> </Scripts> </asp:ScriptManager>
Mit legyen, ha egy hiba keletkezik a részleges frissítés közben? A kliens feldob egy ablakot, melyben megismétli az eredeti kivétel üzenet tartalmát. Mit kezdjünk vele?
A ScriptManager AsyncPostBackErrorMessage tulajdonság segítségével változtatható az eredeti hibaüzenet. Ha az érték üres, akkor az eredeti hibaüzenetet használja. Például:
void AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e) { string msg = "An error occurred and its description is: {0}"; msg = String.Format(msg, e.Exception.Message); ScriptManager1.AsyncPostBackErrorMessage = msg; }
<customErrors mode="On" defaultRedirect="GenericErrorPage.htm"> <error statusCode="404" redirect="site404.htm" /> ... </customErrors>
<script type="text/JavaScript" language="JavaScript"> function pageLoad() { // Register handlers for UpdatePanel client events var manager = Sys.WebForms.PageRequestManager.getInstance(); manager.add_endRequest(endRequest); } function endRequest(sender, args) { $get("ErrMessage").innerHTML = args.get_error().message; args.set_errorHandled(true); } </script>