Az ASP .NET programozási nyelv

AJAX

AJAX Bevezetés

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.

ASP.NET és AJAX

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.

ASP.NET AJAX konfigurációja

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.

Web.config file

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ó

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>
Az enableCaching attribútum határozza meg, hogy a rendszer script-ek (és minden más csatolt script és forrás) minden alkalommal le legyenek-e töltve vagy helyileg legyenek tárolva. A rendszer script file-ok kulcs fontosságúak az AJAX keretrendszerben. Minél bővebb egy ilyen keretrendszer annál nagyobb lesz a mérete az ilyen script file-oknak.

Ahhoz, hogy ezeknek a script-eknek a mérete néhány kB-nál kevesebb maradjon szükség van a tömörítésre. Itt jön képbe a másik attribútum az enableCompression. Ha ez be van kapcsolva, akkor a script-ek assembly-be ágyazódnak, a string-ek pedig tömörítődnek.

A tömörítés és a cache-elés csak a ScriptResource.axd által kiszolgált script-ekre és forrásokra érvényes. A kezelő használatához a script-eket és forrásokat assembly-be kell tenni és a ScriptManager vezérlőhöz kell linkelni.

A <webServices> szekció

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.

Ez a szekció nem szükséges, ha az ASP.NET AJAX oldalakon nem használsz web szolgáltatásokat.

A futás idejű motor

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 ScriptResource HTTP kezelő

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>
Ha a validate attribútum hamisra van állítva, az ASP.NET nem kísérli meg betölteni a megadott kezelő osztályt addig, amíg egy kérés nem érkezik a ScriptResource.axd-ből. Alapvetően a forráskezelő script JavaScript file-okon és egyéb forrásokon dolgozik, hogy assembly-be ágyazza őket, optimalizálva a betöltésük módját a kliens oldalakra.

Ezenkívül szükség lehet egy második HTTP kezelőre is. A konfigurációs kód a következő:
<httpHandlers>
   <remove verb="*" path="*.asmx" />
   <add verb="*" path="*.asmx" validate="false"
        type="System.Web.Script.Services.ScriptHandlerFactory,
              System.Web.Extensions, ..."/>
</httpHandlers>
Amint látszik, az ASP.NET alapértelmezett web szolgáltatás kezelőjét (*.asmx file-ok) egy AJAX specifikusra cseréltük, ami néhány esetben visszamutat az előzőhöz. Végeredményben, az új kezelő átvizsgálja a HTTP kéréseket és békén hagyja azokat, ha semmi olyat nem talál benne, ami ASP.NET AJAX kérést minősít. Nincs szükség erre a kezelőre, ha a kliens oldali ASP.NET AJAX oldalak nem tartalmaznak webes szolgáltatásokat.

Az ASP.NET ScriptManager vezérlője

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" />
A fenti kód mutatja, hogy hogyan lehet beilleszteni a script kezelőt egy ASP.NET oldalba. A vezérlő nem ad felhasználói felületet, csak a szerveren dolgozik, és emelett extra byte-okat sem ad az oldal letöltésekhez.

A ScriptManager vezérlő tulajdonságai

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.

A ScriptManager vezérlő metódusai

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.

A ScriptManager vezérlő eseményei

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.

Mindkét esemény több annál, mint pusztán jelzések, ha történik valami a szerveren. Lehetőséget adnak rá, hogy hatékonyan közbe lehessen lépni az alkalmazás folyamatába. Például egy AsyncPostBackError kivételnél lehetőség van a hibaüzenet beállítására is. Továbbá a ResolveScriptReference esemény során lehetőség van a hely megadására, ahonnan a script-ek letöltődnek.

A ScriptManagerProxy vezérlő

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);
A ScriptManagerProxy osztály az ilyen típusú kódoktól menti meg a programozót. Olyan esetekben, amikor a ScriptManager egy jellemzőjét kell használni, de nem használható direkt referencia, akkor helyette a ScriptManagerProxy használható.

Egyszerre nem lehet két script kezelő ugyanazon az oldalon, viszont lehet egy kezelő és egy proxy, amivel le lehet kérdezni. A ScriptManagerProxy lehetővé teszi új script-ek és szolgáltatások hozzávételét beágyazott komponensekhez, és lehetővé teszi a részleges oldal frissítéseket a felhasználói vezérlőkben és beágyazott főoldalakon. A proxy használatakor, a Scripts és Services gyűjtemények futtásidőben fésülődnek össze a ScriptManager és a ScriptManagerProxy vezérlőkben.

A ScriptManagerProxy osztály egy egyszerű úgynevezett wrapper a ScriptManager osztály GetCurrent metódusa körül, és az interfész nem pontos másolata a ScriptManager-nek. A proxy-val csak korlátozott számú tulajdonság érhető el: Scripts, Services, AuthenticationService, ProfileService. Egyéb tulajdonságok módosításához a GetCurrent metódus során visszakapott hivatkozás használható.

Script-ek kezelése

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.

Script hozzáadása

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>
A ScriptReference osztály tulajdonságai:
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.

Script globalizálás

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>
A kódrészlet tartalmaz egy __cultureinfo globális változót, mely a lokális területi formázási beállításokat tartalmazza. A felhasználó mindaddig nem látja ezt a kódot az oldalán, míg explicit be nem állítja a kultúra információkat. A következő kódrészlet megmutatja, hogy hogyan lehet az információt felhasználni a kliens alkalmazásban:
<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>
A kívánt dátum formátumot a következőképp állítottuk be: nap neve, nap, hónap neve, év, idő. Vegyük észre, hogy a nap neve és a hónap neve kultúra specifikus információ. Alapértelmezettként, egy angol nyelvű operációs rendszeren a következő eredményt adná a kód:
Friday, 02 February 2007 15:52:43
Ezt az eredményt adja a kód részlet függetlenül attól, hogy milyen kultúra információ van beállítva az ASP.NET oldalon. Ez azért van így, mert a példa JavaScript kódnak nincs hozzáférése a kultúra információkhoz. A következő kipróbálva
<%@ Page Language="C#" Culture="it-IT" ... %>
...
<asp:ScriptManager ID="ScriptManager1" runat="server"
     EnableScriptGlobalization="true" />
és frissítve az oldalt, mivel már az EnableScriptGlobalization tulajdonság true-ra van állítva, a következő eredményt kell kapni:
Script globalizálás eredménye
Csak néhány JavaScript objektum néhány metódusa támogatja a globalizálást. Főleg a Date, String és Number típusok localeFormat metódusa támogatja.

Script lokalizálás

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" ... %>
Azonban ez az információ még nem elég ahhoz, hogy a ScriptManager megszerezhesse a lokalizált script-eket. Szükség van még annak megadására, hogy az egyes script referenciák milyen UI nyelvi területeket támogatnak. Ezt a ResourceUICultures tulajdonság megadásável lehet beállítani külön-külön minden egyes script referenciánál. A tulajdonság értéke egy vesszőkkel elválasztott szöveg, mely a nyelvi területek szimbólumainak felsorolását tartalmazza. A következő kódrészlet erre ad példát:
<asp:ScriptManager ID="ScriptManager1" runat="server"
     EnableScriptLocalization="true">
   <Scripts>
      <asp:ScriptReference Path="Person.js" ResourceUICultures="it-IT" />
   </Scripts>
</asp:ScriptManager>
Fontos megjegyezni, hogy a ResourceUICultures attribútum nem használható, ha a ScripitReference tag Path attribútuma nincs megadva.

Script hibakezelés

ASP.NET AJAX-ban a script-ek hibakezelését két részre lehet osztani. A következőkben ezeket ismertetjük.

Nyomkövető (Debug) és leválasztó (Release) script-ek kezelése

Á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.

Az algoritmus végén, ha a szükséges file hiányzik, akkor hiba váltódik ki.

A következő kis programrészlet garantálja, hogy bármit is állítunk be a ScriptManager objektumba, azt megismétlik a utód referenciák.
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Auto">
    <Scripts>
       <asp:ScriptReference path="person.js" ScriptMode="Inherit" />
    </Scripts>
</asp:ScriptManager>

Hibakezelés és átirányítás

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;
}
Futtatáskor a már említett módon felugrik egy ablak, amely a hibaüzenetét tartalmazza. Mi legyen, ha nem szeretnénk felugró ablakokat, hanem egyszerűen irányítsuk át a felhasználót egy hiba oldalra? Ebben az esetben be kell állítanunk az oldalon, hogy a hagyományos ASP.NET hibakezelési eljárást használja. A web.config file-ban be kell állítani a <customErrors> szekciót, hogy adott hiba típusoknál HTML hiba oldalakat mutasson. Például:
<customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
    <error statusCode="404" redirect="site404.htm" />
    ...
</customErrors>
Lehetőség van arra is, hogy felugró ablak helyett egy egyszerű hibaüzenet jelenjen meg az oldalon. A következő script segítségével egy endRequest kezelőt regisztrálunk a PageRequestManager kliens objektumba.
<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>
Az endRequest esemény egy részleges frissítés végén hívódik meg. Az eseménykezelő egy EndRequestEventArgs osztályt kap argumentumként. Ennek két kulcsfontosságú tulajdonsága van: az error és az errorHandled. Az error tulajdonság egy JavaScript objektumot ad vissza, ami a szerver-oldali kivételt reprezentálja. Ebből kinyerhető a hibaüzenet. Az errorHandled tulajdonság egy logikai érték, amely megmutatja, hogy a script végzett-e a hibával. Ha az értékét true-ra állítjuk, azzal kikapcsolhatjuk a felugró ablakot, és helyette csak egy üzenet jelenik meg az oldalon.