kako do bogatejše spletne izkušnje z asp.net ajax
DESCRIPTION
Kako do bogatejše spletne izkušnje z ASP.NET AJAX. Dušan Zupančič, MVP [ASP.NET]. O predavatelju …. Dušan Zupančič Zaposlitev: Cetis d.d. – CeNT (Cetis Nove Tehnologije) vodja svetovanja E-pošta: [email protected] Blog: http://dusanz.gnarus.org/. AGENDA. Web 2.0 in AJAX - PowerPoint PPT PresentationTRANSCRIPT
Kako do bogatejše spletne izkušnje z ASP.NET AJAX
Dušan Zupančič, MVP [ASP.NET]
O predavatelju … Dušan Zupančič
Zaposlitev: Cetis d.d. – CeNT (Cetis Nove Tehnologije)vodja svetovanja
E-pošta: [email protected] Blog: http://dusanz.gnarus.org/
2
AGENDA Web 2.0 in AJAX AJAX tehnologije komponente ASP.NET AJAX
ASP.NET AJAX Extensions 1.0 ASP.NET AJAX Control Toolkit ASP.NET AJAX Library ASP.NET AJAX Futures
Razhroščevanje ASP.NET AJAX rešitev Varnost AJAX rešitev
3
Web 2.0 in AJAX
Kako deluje klasična spletna rešitev
Zahtevek
5
Dobri, slabi in grdi (pri spletnih rešitvah) Dobro
Centraliziran nadzor nad delovanjem rešitve
Ni težav z nameščanjem Slabo
Rešitev se izvaja v okviru brskalnikovega “peskovnika” (varnost)
Manjkajo določene bogate uporabniške izkušnje, ki smo jih navajeni s “težkih” odjemalcev
Samo en način, da pridemo do svežih podatkov: osvežitev strani (postback)
Grdo Kompatibilnost med brskalniki
6
Vendar uporabniki želijo več ...
7
Več interakcije Več možnosti Večjo odzivnost
Skratka, želijo si da bi bile spletne aplikacije bolj podobne namiznim
Web 2.0 Nova generacija storitev na spletu zajema:
Tehnologijo za bogate spletne aplikacije (npr. AJAX)
CSS (Cascading Style Sheets) XHTML RSS / ATOM Čiste in pomenske URL naslove Spletne dnevnike (Weblog) Hibridne spletne aplikacije (mashup) Spletne protokole REST in SOAP
Poskus standardizacije uporabljanih tehnologij
8
Kako lahko pomaga AJAX? Obdržimo vse dobre lastnosti lahkega
odjemalca
Pridobimo nekatere zmožnosti, ki smo jih navajeni s težkih odjemalcev
Do svežih podatkov lahko pridemo brez osveževanja celotne strani
9
DEMO – Primer AJAX spletne strani
10
AJAX tehnologije
Kaj je AJAX? Asynchronous Javascript and XML Skovanka, ki jo je prvič javno uporabil Jesse James Garrett v
svojem eseju objavljenem Februarja 2005 na: http://www.adaptivepath.com/publications/essays/archives/000385.php
Razvijalski vzorec, ki vključuje širok nabor obstoječih tehnologij: Standardiziran prikaz s pomočjo XHTML in CSS Dinamičen prikaz preko DOM Izmenjava in manipulacija podatkov s pomočjo XML (ali z JSON)
in XSL-T Asinhrono pridobivanje podatkov s pomočjo XmlHttp ... in JavaScript, ki vse skupaj povezuje v celoto
AJAXJavaScript
XMLXHTML
CSS
DOM
XMLHTTP
Objekt XmlHttpRequest Prvič se pojavi leta1999 z brskalnikom Internet
Explorer 5 ActiveX objekt, ki podpira asinhrone klice na spletni
strežnik V prvi fazi narejen predvsem za Outlook Web Access
(OWA) Pozneje so ga posvojili Firefox, Safari in ostali
brskalniki Implementiran kot domoroden objekt
(XMLHttpRequest) in ne kot ActiveX V postopku standardizacije s strani W3C
http://www.w3.org/TR/XMLHttpRequest/
Je glavna tehnologija, ki omogoča AJAX13
Delo z XmlHttpRequest
14
1. Instanciranje objekta XmlHttpRequest
2. Odpiranje HTTP povezave
3. Nastavljanje glav
4. Pošiljanje zahtevka
5. Asinhrona obdelava rezultata poizvedbe
XmlHttp: instanciranje V odvisnosti od uporabljenega brskalnika se
objekt XmlHttpRequest instancira različno:
var xmlHttp = null;function loadXmlHttp() { if (window.XMLHttpRequest) { // IE7, Mozilla, Safari, Opera, itd. xmlHttp = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE 5.x in 6 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }}
15
XmlHttp: pošiljanje zahtevka
function sendRequest(url) { if (xmlHttp) { // povratna funkcija za asinhroni povratni klic// povratna funkcija za asinhroni povratni klic xmlHttp.onreadystatechange = onCallback; // Odpiranje HTTP povezave do url.// Odpiranje HTTP povezave do url. xmlHttp.open("GET", url, true); // true = asinhroni klic // nastavljanje glave klica// nastavljanje glave klica xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); // pošiljanje zahtevka brez dodatnih parametrov// pošiljanje zahtevka brez dodatnih parametrov xmlHttp.send(null); // nastavljanje napisa// nastavljanje napisa document.getElementById('rezultat').innerHTML="Nalaganje"; }}
16
XmlHttp: obdelava rezultatafunction onCallback() { // Preverjanje ali je klic končan// Preverjanje ali je klic končan if (xmlHttp.readyState == 4) { // Je odgovor uspešen// Je odgovor uspešen if (xmlHttp.status == 200){ document.getElementById('rezultat').innerHTML
= xmlHttp.responseText; } else { // napaka HTTP// napaka HTTP alert('Napaka: ' + xmlHttp.status); } }}
17
DEMO 01: Uporaba XMLHttp “Končna točka”: PodatkiTekst.ashx Instanciranje in uporaba XMLHttp v DemoTekst.aspx
18
Click
InitInitLoad StateLoad State
Process Postback Process Postback DataData
LoadLoadCallback EventCallback Event
ICallbackEventHandlerICallbackEventHandler
Script Event Script Event HandlerHandler
Script CallbackScript Callback
TriggerAsync Request
Return result ofCallback
UnloadUnload
ASP.NET 2.0 in XML-HTTPClient Script Callback
ASP.NET 2.0 in XML-HTTPClient Script Callback ClientScriptManager.GetCallbackEventReference
Vrne ime JavaScript funkcije, ki izvede XML-HTTP zahtevek (sinhrono ali asinhrono)
Funkcije uporabljajo POST in pošljejo vsa polja v formi (vključno z __VIEWSTATE)
ICallbackEventHandler Vmesnik, ki ga implementirajo strani, ki so cilj povratnih
klicev ICallbackEventHandler.RaiseCallbackEvent je klican
najprej ICallbackEventHandler.GetCallbackResult je klican za
njim Skrije kompleksnost dela z XMLHTTP vendar še
vedno ostane precej dela20
Callback – odjemalski del (.aspx)<script type="text/ecmascript"> function LookUpStock(){ var lb = document.getElementById("ListBox1"); var product = lb.options[lb.selectedIndex].text; CallServer(product, ""); } function ReceiveServerData(rValue){ document.getElementById("ResultsSpan").innerHTML = rValue; }</script>
21
Callback – strežniški del (1/2) (.cs)public partial class ClientCallback : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler{ protected String returnValue; protected void Page_Load(object sender, EventArgs e) { String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context"); String callbackScript; callbackScript = "function CallServer(arg, context)" + "{ " + cbReference + ";}"; Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true); }
22
Callback – strežniški del (2/2) (.cs)
public void RaiseCallbackEvent(String eventArgument){ if (catalog[eventArgument] == null) { returnValue = "-1"; } else { returnValue = catalog[eventArgument].ToString(); }}
public String GetCallbackResult(){ return returnValue;}
23
Demo: Client Callback
24
“Koristni tovor” v AJAXu
“Koristni tovor” v AJAXu so podatki, ki jih dobimo s pomočjo HTTP zahtevka
Ker gre pri AJAX-u za standarden HTTP zahtevek in odgovor je lahko vsebina poljubna (tekst, XML, HTML, JSON, …)
Najpogostejša tipa za prenosa podatkov sta: XML
Uveljavljen standard za prenos podatkov JSON
Enostavnejša deserializacija na odjemalcu (v JavaScriptu)
Primer XML paketa
<oseba><ime>Janezek Novak</ime><starost>11</starost><zivali>Reks</zivali><zivali>Pika</zivali>
</oseba><oseba><ime>Minka Novak</ime><starost>11</starost>
<oseba>
Uporaba spletne storitve z XMLHTTP
Dokaj pogost pristop k asinhronemu pridobivanju podatkov v AJAXu je uporaba spletnih storitev
Kako uporabiti spletno storitev v AJAX: Ustvariti je potrebno SOAP ovojnico in predati
parametre S pomočjo XMLHTTP poslati SOAP V rezultirajočem XML s parserjem poiskati rezultat
Kako do parametrov za klic spletne storitve
Glave sporočila SOAP Zahtevek
28
Ustvarjanje SOAP ovojnice// ustvarjanje SOAP ovojnicevar soapEnvelop = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";soapEnvelop+= "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";soapEnvelop+= "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ";soapEnvelop+= "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" >";soapEnvelop+= " <soap:Body>";soapEnvelop+= " <getTemperature xmlns=\"http://Cetis.si/TemperatureService\">";soapEnvelop+= " <city>" + city + "</city>";soapEnvelop+= " </GetTemperature>";soapEnvelop+= " </soap:Body>";soapEnvelop+= "</soap:Envelope>";
29
Pošiljanje zahtevka in obdelava rezultata
//lociranje rezultata v XML odgovoru in prikaz na stranivar xmldoc = xmlHttp.responseXML;var responseNode = xmldoc.getElementsByTagName("GetTemperatureResult").item(0);document.getElementById('rezultat').innerHTML = responseNode.text;
// nastavljanje glav sporočilaxmlHttp.open("POST",url,true); xmlHttp.setRequestHeader("Content-Type","text/xml"); xmlHttp.setRequestHeader("SOAPAction", http://Cetis.si/TemperatureService/getTemperature");
// pošiljanje zahtevka s SOAP ovojnicoxmlHttp.send(soapEnvelop);
30
JSON: JavaScript Object Notation JSON = JavaScript Object Notation) Alternativa XML serializaciji vendar
“brez odvečnega ‘špeha’”
Na strani JavaScripta ni potrebe po parserju
[ { “ime”: “Janezek Novak”, “starost” : 11, “zivali”: [“Reks”, “Pika”] }, { “ime”: “Minka Novak”, “starost” : 11, }]
var name = eval("(" + paketJSON + ")");31
JSON : XML JSON uporablja JavaScript shemo za opis
podatkov
JavaScript ima samo en podatkovni tip – variant, tako da JSON ne hrani podatkovnega tipa
AJAX uporablja JSON za poenostavitev in pohitritev klicev na strežnik, vendar v določenih implementacijah še vedno najdemo XML (ali pa klice do XML spletnih storitev)
32
AJAX knjižnice
Knjižnice za delo za AJAX-om Delo neposredno z XMLHTTP je relativno
kompleksno, zato je nastalo precej AJAX knjižnic:
Prototype (http://www.prototypejs.org/ ) Ogrodje v JavaScriptu, ki olajša programiranje
AJAX rešitev Ajax.NET Pro (http://www.ajaxpro.info/ )
Ogrodje za ASP.NET 1.1 in 2.0
Microsoft ASP.NET AJAX (tema te delavnice)
In še mnogo drugih …34
Kje je smisleno razmisliti o ASP.NET AJAX? Strežniško okolje, ki uporablja Microsoft IIS.
> .NET 2.0.
Omejen prenos podatkov.
Majhne spremembe.
Omejena pasovna širina.
35
Slabosti Pri razvoju Javascripta v VS2005 ni Intellisense. Gumbek “Nazaj” (Back) Podpora za slabovidne Iskalniki Hramba stanja Manj zmogljivi brskalniki Razhroščevanje Javascripta Preveč nalog na odjemalcu.
Brskalniki so krhke “živalce”.
36
Komponente ASP.NET AJAX
Kaj je ASP.NET AJAX? Ogrodje za izgradnjo AJAX spletnih rešitev
Več platform, brskalniško agnostičen Zelo razširljiv
V grobem je razdeljen na dva dela Microsoft AJAX Library (ogrodje za odjemalce -
JavaScript) ASP.NET 2.0 AJAX Extensions (ogrodje za strežnik)
Strežniški del rešitve je tesno povezan z ASP.NET 2.0
Odjemalski del pa je mogoče uporabiti tudi v PHP, ColdFusion, itd.
38
Razvijalski scenariji Strežniško orientiran razvoj
Omogoča postopno uvajanje AJAX pristopa v obstoječe spletne rešitve
Bogatenje spletnih rešitev brez pisanja velike količina JavaScript kode
Omogoča, da večino logike obdržimo na strežniku (in ju napišemo v C#, VB.NET, …)
Odjemalsko orientiran razvoj Uporaba polne moči DHTML Omogoča bogatejšo uporabniško izkušnjo
39
Arhitektura ASP.NET AJAX
40
Sestavni deli ASP.NET AJAX
ASP.NET 2.0 AJAX Extensions Microsoft AJAX Library ASP.NET AJAX Control Toolkit ASP.NET 2.0 AJAX Extensions CTP
ASP.NET 2.0 AJAX Extensions
Microsoft AJAX Library(Podprti: IE, Mozilla, Safari, Opera 9)
ASP.NET 2.0ASP.NET 2.0
ASP.NET AJAX Control Toolkit
ASP.NET 2.0 AJAX Extensions CTP
Namestitev ASP.NET AJAX(http://ajax.asp.net/downloads)
42
Komponente ASP.NET AJAX
ASP.NET AJAX Extensions 1.0
Asinhrono osveževanje dela strani
44
ASP.NET AJAX Extensions Strežniški kontrolniki
Script Manager Script Manager Proxy Update Panel Update Progress Timer
Strežniške razširitve Web Services Bridge
JSON serializacija Generiranje posrednika (proxy) v JavaScriptu
45
Arhitektura ASP.NET AJAX Extensions
46
Script Manager Ključna komponenta v ASP.NET AJAX Registrira AJAX Client Library Omogoča delno osveževanje strani (Update
Panel) Lahko ga uporabimo za registracijo lastnih
skript Script Reference
Za spletne storitve generira JS Proxy razrede Service Reference
47
ScriptManager Na vsakem AJAX
spletnem obrazcu potrebujemo le en ScriptManager
Skrbi za asinhrono komunikacijo med odjemalcem in strežnikom
48
Kontrolnik UpdatePanel Omogoča delno osveževanje strani in
kontrolnikov Samodejno prevede postbacke v asinhrone povratne
klice Samodejno osveži vsebino po povratnem klicu Ne zahteva poznavanja JavaScripta ali XmlHttp
Omogoča enostavno definiranje regij spletne strani za osveževanje Asinhroni dostop do osveženih podatkov na
strežniku ASP.NET AJAX poskrbi za vso potrebno infrastrukturo Na eni spletni strani lahko imate poljubno število
UpdatePanel kontrolnikov49
Življenjski cikel ASP.NET strani
PageRequestManager (v ScriptManagerju) se vključi v fazi PreRender() in zamenja metodo za izris strani Render() z metodo, ki izrisuje vsebino Update Panela.
50
Povratna informacija o osveževanju Kontrola <asp:UpdateProgress>
Omogoča nastavitev sporočila, ki naj se prikaže ob asinhronem osveževanju dela strani
V ProgressTemplate lahko vpišemo poljubno HTML besedilo
Večinoma dodamo sličico (animirani GIF). Nekaj zanimivih tovrstnih sličic najdete na: http://www.napyfab.com/ajax-indicators/ http://www.ajaxload.info/
51
UpdatePanel
UpdateMode:UpdateMode:• Always – samodejna posodobitev ob vsaki spremembi na straniAlways – samodejna posodobitev ob vsaki spremembi na strani• Conditional – posodobitev samo ob nastavljenih prožilcihConditional – posodobitev samo ob nastavljenih prožilcih
52
Kdaj se osveži vsebina UpdatePanel-a
UpdateMode nastavljen na “Always”: vsebina se osveži ob vsakem “postbacku”
UpdateMode nastavljen na “Conditional”: Če je postback zahteval prožilec (trigger) za ta
UpdatePanel Ob klicu metode “Update” na UpdatePanelu Če je UpdatePanel vgnezden znotraj drugega
UpdatePanela Če je lastnost ChildrenAsTriggers nastavljena na
True in katerakoli od kontrol povzroči “postback”
UpdatePanel pod pokrovom Client script prepreči normalno pošiljanje forme
Simulira post-back preko objekta XMLHttpRequest Pošlje vse vrednosti polj vključno z viewstate
En dodaten header za zahtevek delnega osveževanja Server normalno obdela post-back
Enak življenjski cikel strani kot pri navadnem post-back UpdatePanel-i ugotovijo če jih je potrebno osvežiti
Načina: Always in Conditional ScriptManager prevzame izrisovanje (rendering)
Samo vsebina UpdatePanela, ki jo je potrebno osvežiti Response vključuje posodobljen viewstate
Client script obdela “delta” odgovor Posodobi vsebino Posodobi skrite kontrolnike
UpdatePanel: Prožilci (Triggers) Vsi kontrolniki znotraj enega UpdatePanela
povzročijo osveževanje vsebine le tega (če so razlog za postback in je lastnost ChildrenAsTriggers = True)
Eksplicitno pa lahko določimo, da dogodek na poljubnem kontrolniku na spletni strani povzroči osvežitev določenega UpdatePanela s pomočjo prožilca : <asp:AsyncPostBackTrigger>
V kodi lahko poljubno kontrolo registriramo za asinhroni postback s pomočjo klicem metode RegisterAsyncPostBackControl na ScriptManagerju
55
UpdatePanel: Lastnost ChildrenAsTriggers Določa ali bo postback, ki ga sproži kontrola
na UpdatePanelu povzročil osvežitev UpdatePanela
56
Demo: Uporaba prožilcev za osveževanje
57
Vgnezdeni UpdatePaneli UpdatePanele lahko gnezdimo
in na ta način optimiziramo osveževanje
Če je UpdateMode=“Conditional”: Če kliknemo gumbek “Notranji”
se osveži samo UpdatePanel2 Če kliknemo gumbek “Zunanji”
se osvežita oba UpdatePanela
58
Osveževanje vsebine UpdatePanela iz kode Dinamično ustvarjenih kontrol ne moremo
podati deklarativno v času načrtovanja Takšne kontrole navedemo kot prožilce v kodi:
protected void Page_Load(){ ScriptManager1.RegisterAsyncPostBackControl(DinamicnaKontrola);
}
59
Demo: Dinamično določanje prožilca
60
Kontrolniki, ki niso kompatibilni z UpdatePanel Zaradi narave delovanja, določeni kontrolniki niso
primerni kot vsebina UpdatePanela (ali pa so primerni le pod določenimi pogoji): Treeview Menu WebPart kontrolniki FileUpload GridView in DetailsView, če imata nastavljeno lastnost
EnableSortingAndPagingCallbacks na true (privzeto je false)
Login, PasswordRecovery, ChangePassword in CreateUserWizard, če nismo njihove vsebine prej pretvorili v predloge (Editable template)
Substitution BaseCompareValidator, BaseValidator, CompareValidator,
CustomValidator, RangeValidator, RegularExpressionValidator, RequiredFieldValidator, in ValidationSummary
61
Kontrolnik Login v UpdatePanelu Kontrolnik Login dodamo na formo Kontrolniku nastavimo želene lastnosti Kontrolnik spremenimo v predlogo (Convert to
Template) Vsem validacijskim kontrolnikom določimo
lastnost EnableClientScript na False
62
Napotki za uporabo UpdatePanela Zahtevki post-back so še vedno popolnoma enaki
(prenesejo se vrednosti vseh kontrolnikov) Inkrementalni pristop – ni potrebno spreminjati logike
programa En zahtevek naeknkrat Odgovori (response) so sicer manjši a zahtevki so še
vedno enake dolžine Razmislite katere uporabniške akcije naj sprožijo
osveževanje Optimizacija kaj naj se osveži in kdaj
UpdatePanele vedno postavite v način Conditional Za nadzor osveževanja uporabite prožilce (trigger) ali
pa metodo Update
Kratek kviz
Kratek kviz Steve Marx je v svojem blogu zbral nekaj
zanimivih primerov, ki dmeonstrirajo vedenje UpdateProgress-a pri različnih postavitvah UpdatePanela
http://smarx.com/posts/why-the-updateprogress-wont-display.aspx
65
Vprašanje 1: Kaj se zgodi ob kliku na gumbek <%@ Page Language="C#" %><script runat="server"> protected void sleep(object sender, EventArgs e) { System.Threading.Thread.Sleep(5000); } </script> <html> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"
UpdateMode="Conditional"> <ContentTemplate> <%= DateTime.Now %> <asp:Button ID="Button1" runat="server" Text="Click Me!" OnClick="sleep" /> </ContentTemplate> </asp:UpdatePanel> <asp:UpdateProgress ID="UpdateProgress1" runat="server"
AssociatedUpdatePanelID="UpdatePanel1"> <ProgressTemplate> Working... </ProgressTemplate> </asp:UpdateProgress> </form> </body> </html>
66
Odgovor 1Ta primer ilustrira normalno delovanje kontrolnika UpdateProgress.
Ko kliknemo na gumbek se sproži asinhroni klic, ki (zaradi pavze) traja 5 sekund in ta čas gori napis “working... “. Ob povratnem klicu se osveži vsebina UpdatePanela, napis pa ugasne.
67
Vprašanje 2: Kaj se zgodi ob kliku na gumbek <%@ Page Language="C#" %> <script runat="server"> protected void sleep(object sender, EventArgs e) { System.Threading.Thread.Sleep(5000); UpdatePanel1.Update(); }
protected void Page_Load(object sender, EventArgs e) { ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(Button1); } </script> <html><body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate><%= DateTime.Now %> </ContentTemplate> </asp:UpdatePanel>
<asp:Button ID="Button1" runat="server" Text="Click Me!" OnClick="sleep" />
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1"> <ProgressTemplate> Working... </ProgressTemplate> </asp:UpdateProgress>
</form> </body> 68
Odgovor 2V tem primeru se gumbek nahaja izven UpdatePanela. Da klik na gumbek sproži asinhroni klic, dosežemo s klicem metode RegisterAsyncPostBackControl(). In nazadnje, osveževanje UpdatePanela je doseženo s klicem metode Update.
Besedilo v UpdateProgress se v tem primeru ne prikaže.
Kaj se dogaja:1.Kliknem na gumbek2.Na brskalniku se UpdateProgress odloči ali naj se prikaže ali ne (obešen je na dogodek BeginRequest na PageRequestManager-ju)3.Izvede se asinhroni postback na strežnik4.Strežnik pošlje nazaj spremenjeno vsebino5.UpdateProgress se skrije, če je potrebno. (dogodek EndRequest)
V našem primeru UpdateProgress ne ve ali bo UpdatePanel s katerim je povezan osvežen ali ne. V našem primeru se osveži vsakokrat, a UpdateProgress tega ne more “vedeti”.
69
Vprašanje 3: Kaj se zgodi ob kliku na gumbek <%@ Page Language="C#" %> <script runat="server"> protected void sleep(object sender, EventArgs e) { System.Threading.Thread.Sleep(5000); } </script><html><body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <%= DateTime.Now %> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="Button1" /> </Triggers> </asp:UpdatePanel>
<asp:Button ID="Button1" runat="server" Text="Click Me!" OnClick="sleep" />
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1"> <ProgressTemplate> Working... </ProgressTemplate> </asp:UpdateProgress> </form> </body> </html>
70
Odgovor 3
V tem primeru je zopet gumbek zunaj UpdatePanel. Za asinhrono osveževanje UpdatePanela pa gumbek registriramo s pomočjo prožilca (trigger).
UpdateProgress se tudi v tem primeru ne prikaže.
Gre za primer podoben prejšnjemu. Zadeva pa dela v skladu z dokumentacijo, ki pravi:
You can associate the UpdateProgress control with a single UpdatePanel control by setting the progress control's AssociatedUpdatePanelID property. In that case, the UpdateProgress control displays a message only when a postback originates inside the associated UpdatePanel control.
71
Vprašanje 4:<%@ Page Language="C#" %> <script runat="server"> protected void sleep(object sender, EventArgs e) { System.Threading.Thread.Sleep(5000); } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false"> <ContentTemplate> <%= DateTime.Now %> <asp:Button ID="Button1" runat="server" Text="Click Me!" OnClick="sleep" /> </ContentTemplate> </asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">
<ProgressTemplate> Working... </ProgressTemplate> </asp:UpdateProgress> </form> </body> 72
Odgovor 4
Primer je skoraj identičen prvemu, le da je lastnost ChildrenAsTriggers="false". To pomeni, da se vsebina UpdatePanela ob kliku na gumbek ne bo osvežila.
Kljub temu pa se vsebina UpdateProgress-a izpiše za čas trajanja klica. Zakaj?
Logika za prikaz UpdateProgressa je enostavna. V bistvu se vpraša “Ali je kontrola znotraj UpdatePanela?”. In če je odgovor pritrdilen se UpdateProgress izpiše.
73
Konec kviza
Timer
V nastavljenih presledkih izvede asinhroni klic na strežnik
V primeru pogojnega osveževanja UpdatePanela je potrebno nastaviti prožilec na
75
DEMO: Uporaba timerja
76
Predloge strani in ScriptManager Na eni spletni strani je potreben le en
ScriptManager. Če se nahaja na predlogi (master page), na
izvedenih straneh ni potrebno dodati ScriptManagerja. Izvedene strani podedujejo nastavitve ScriptManagerja
77
ScriptManagerProxy
Če na predlogi strani (MasterPage) že obstaja ScriptManager, na podrejeni strani pa potrebujemo drugačne ali pa dodatne nastavitve ScriptManagerja, potem na spletnem obrazcu uporabimo ScriptManagerProxy
78
DEMO: UpdatePanel na predlogah
79
Klic spletne storitve iz JavaScriptaImports System.WebImports System.Web.ServicesImports System.Web.Services.Protocols
<WebService(Namespace:="http://MSDN2006.net/Demo1webService")> _<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _<Microsoft.Web.Script.Services.ScriptService()> <Microsoft.Web.Script.Services.ScriptService()> _Public Class DemoWebService Inherits System.Web.Services.WebService
<WebMethod()> _ Public Function VrniImeInUro(ByVal ime As String) As String Return ime & Date.Now.ToLongTimeString() End FunctionEnd Class
80
Preizkus ustvarjanja JSON JavaScript proxy kode
82
Kontrole na spletni strani
83
JavaScript koda<script language="javascript" type="text/javascript">// Dogodek ob kliku na gumb.function btnPoslji_Click(){ var objTxtIme = document.getElementById("txtIme"); DemoWebService.VrniImeInUro(objTxtIme.value, OnRequestCompleteOnRequestComplete);}
// Obdela dogodek, ob sprejemu rezultatov s spletne storitvefunction OnRequestCompleteOnRequestComplete(result){ // Prikaz rezultata. var RsltElem = document.getElementById("Rezultat"); RsltElem.innerHTML = result;}</script>
84
Demo: Asinhroni klic spletne storitve
85
Komponente ASP.NET AJAX
ASP.NET AJAX Control Toolkit
86
ASP.NET AJAX Control Toolkit
87
AJAX kontrolniki in razširitve, na voljo preko CodePlexa
Zelo enostavno za obogatitev obstoječih spletnih strani (kot tudi za ustvarjanje novih)
Poznavanje JavaScripta pri uporabi ni potrebno
V spletno aplikacijo ga dodamo kot .dll, ki ga namestimo v podimenik bin
Preko Codeplexa je na voljo celotna izvorna koda, kar omogoča lastne izboljšave in odpravljanje morebitnih napak
ASP.NET AJAX Control Toolkit
88
Demo:AJAX Control Toolkit
89
Anatomija tipične komponente v toolkituExtenderExtender
[ClientScript(“…”)][TargetControlType(typeof(Control))]public class MyExtender :
ExtenderControlBase{
[ExtenderProperty]public string MyStringProp{}
[ExtenderProperty]public int MyIntProp{}
}
Anatomija tipične komponente v toolkitu
ExtenderExtender
[ClientScript(“…”)]public class MyExtender :
ExtenderBase<TextBox> {
// …}
BehaviorBehaviorMyProject.MyBehavior = function(e) { MyProject.MyBehavior.initializeBase(this, [e]); this._myStringPropValue = null; this._myStringIntValue = 0;}
MyProject.MyBehavior.prototype = { initialize function() { … }, get_MyStringProp : function(){}, set_MyStringProp : function(value){},
get_MyIntProp : function(){}, set_MyIntProp : function(value){}}
Anatomija tipične komponente v toolkitu
[ClientScript(“…”)]public class MyExtender :
ExtenderBase<TextBox> {
// …}
TThe ExtenderTThe Extenderhe Propertieshe Properties
public class MyExtenderProperties : PropertiesBase<TextBox>
{
public string MyStringProp{ … }public int MyIntProp{ … }
}
The BehaviorThe Behavior
AtlasControlToolkit.MyBehavior = function() { AtlasControlToolkit.MyBehavior.initializeBase(this); var _myStringPropValue;
this.initialize = function() { … }
this.get_MyStringProp = function(){} this.set_MyStringProp = function(value){}}
MarkupMarkup
<cc1:MyExtender runat=“server”
TargetControlID=“TextBox1”MyStringProp=“Hello” MyIntProp=“23”
</cc1:MyExtender>
Anatomija tipične komponente v toolkitu
The ExtenderThe Extender
[ClientScript(“…”)]public class MyExtender :
ExtenderBase<TextBox> {
// …}
The PropertiesThe Properties
public class MyExtenderProperties : PropertiesBase<TextBox>
{
public string MyStringProp{ … }public int MyIntProp{ … }
}
The BehaviorThe Behavior
AtlasControlToolkit.MyBehavior = function() { AtlasControlToolkit.MyBehavior.initializeBase(this); var _myStringPropValue;
this.initialize = function() { … }
this.get_MyStringProp = function(){} this.set_MyStringProp = function(value){}}
The MarkupThe Markup
<cc1:MyExtender runat=“server”>
<cc1:MyExtenderProperties
TargetControlID=“TextBox1”MyStringProp=“Hello” MyIntProp=“23”/>
</cc1:MyExtender>
KodaKoda
MyExtender ex1 = new MyExtender();ex1.MyStringProp = “Hello”;ex1.MyIntProp = 23;ex1.TargetControlID = “TextBox1”;Page.Add(ex1);
Ustvarjanje lastnega AJAX kontrolnika
94
CTP
95
96
Predogled zmožnosti, ki bodo na voljo skupaj z ORCAS
Možno jih je uporabljati, vendar ni uradne podpore s strani Microsofta
Komponente ASP.NET AJAX
ASP.NET AJAX Library
Microsoft AJAX Library Odejmalska polovica ASP.NET AJAX Brskalniško agnostična in platformsko-agnostična
Internet Explorer, Firefox, Mozilla, Safari, itd. Možnost uporabe tudi v PHP in drugih platformah
Izboljšave JavaScripta s tipskim sistemom podobnim tistemu v .NET Imenski prostori, razredi, vmesniki (interface),
dedovanje, itd. Implementacija 100% v JavaScript
Vključuje ključne razrede (core) in base class library (BCL)
Nahaja se v datotekah *.js, ki se naložijo na odjemalca
Kako se naložijo skripte
<asp:ScriptManager ID="MyScriptManager" Runat="server" />
Napišemo tole:
<script src="/.../WebResource.axd?d=iQ15p6LHcT2T5QE..." type="text/javascript"></script>
ScriptManager pa generira naslednjo kodo:
Referenca na skriptno datoteko
Nadzor nad tem kaj naj se naloži
<asp:ScriptManager ID="..." Runat="server"> <Scripts> <asp:ScriptReference Name="Microsoft.Web.Resources.ScriptLibrary.PreviewScript.js" Assembly="Microsoft.Web.Preview" /> <asp:ScriptReference Name="Microsoft.Web.Resources.ScriptLibrary.PreviewDragDrop.js" Assembly="Microsoft.Web.Preview" /> <asp:ScriptReference Path="~/Scripts/UIMap.js" /> </Scripts></asp:ScriptManager>
"Path" referencira skriptne datoteke
"Name" se sklicuje na vir, ki ga želimo naložiti
Microsoft AJAX Library
Microsoft AJAX LibraryMicrosoft AJAX Library
Browsers (IE, Firefox, Safari, others)Browsers (IE, Firefox, Safari, others)Browsers (IE, Firefox, Safari, others)Browsers (IE, Firefox, Safari, others)
Core ServicesCore ServicesCore ServicesCore Services
NetworkingNetworkingNetworkingNetworking
Browser CompatibilityBrowser CompatibilityBrowser CompatibilityBrowser Compatibility
ComponentsComponentsComponentsComponents
XHTML/CSSXHTML/CSSXHTML/CSSXHTML/CSS Server-generated Server-generated Proxy ScriptsProxy Scripts
ClientClient
101
Arhitektura Microsoft AJAX Library
102
Kompatibilnost z brskalniki
103
Browser Compatibility Layer podpira: IE Mozilla Safari Opera
Script Core V (JavaScript) kodi na strani odjemalca
omogoča: Dedovanje Vmesniki (interface) in abstraktni razredi Imenski prostori Enumeracije Delegati
104
Razširitve JavaScripta: Array
105
V Javascript prinaša objekt array z metodami kot so npr.: Add Clear forEach
var a = ['a', 'b', 'c', 'd']; a[5] = 'e'; var result = ''; function appendToString(arrayElement, index, array) { // "this" is the context parameter, i.e. '|'. result += arrayElement + this + index + ','; } Array.forEach(a, appendToString, '|'); // View the results: a|0,b|1,c|2,d|3,e|5, document.write(result,"</p>");
Razširitve JavaScripta: Array
106
// dvodimenzionalno polje
// deklaracija enodimenzionalnega polja var costsArray = [];
// deklaracija vsebovanih enodimenzionalnih polj var headerRow = new Array("ID", "Name", "Costs"); var firstRow = new Array("1", "ruler", "1.30"); var secondRow = new Array("2", "binder", "4.75");
Array.add(costsArray, headerRow); Array.add(costsArray, firstRow); Array.add(costsArray, secondRow);
...// uporaba polja v kodidocument.write("<td>", costsArray[x][y], "</td>");
Demo: Array
107
Script Core:Imenski prostori in razredi - deklaracija
108
Type.registerNamespace("Demo");Demo.Oseba = function(ime, priimek, elektronskaPosta) { this._ime = ime; this._priimek = priimek; this._elektronskaPosta = elektronskaPosta;}Demo.Oseba.prototype = { getIme: function() { return this._ime; }, getPriimek: function() { return this._priimek; }, getPolnoIme: function() { return this._ime + ' ' + this._priimek; }, dispose: function() { alert('na svidenje ' + this.getName()); }}Demo.Oseba.registerClass('Demo.Oseba', null, Sys.IDisposable);
O modifikatorjih dostopnosti
109
JavaScript ne pozna modifikatorjev dostopnosti (public, private, ...)
ASP.NET AJAX Library pa se drži konvencije, da so vsi člani razreda, katerih ime se prične s podčrtajem (“_”) dostopni samo v tistem razredu (private): this._ime = ime;
Script Core:Imenski prostori in razredi - uporaba
110
<script type="text/javascript" src="NameSpace.js"> </script>
<script type="text/javascript" language="JavaScript"> function OnButton1Click() { var testnaOseba = new Demo.Oseba( 'Janez', 'Novak', '[email protected]'); alert(testPerson.getIme() + " " + testPerson.getPriimek() );
return false; }</script>
Demo: Imenski prostori v JavaScriptu
111
Dedovanje
112
Demo.Employee = function(firstName, lastName, emailAddress, team, title) {
Demo.Employee.initializeBase(this, [firstName, lastName, emailAddress]); this._team = team; this._title = title;}Demo.Employee.prototype = { getTeam: function() { return this._team; }, setTeam: function(team) { this._team = team; }, getTitle: function() { return this._title; }, setTitle: function(title) { this._title = title; }, toString: function() { return Demo.Employee.callBaseMethod(this, 'toString') + '\r\n' + this.getTitle() + '\r\n' + this.getTeam(); }}Demo.Employee.registerClass('Demo.Employee', Demo.Person);
Demo: Dedovanje v JavaScriptu
113
Networking stack
Abstrakcija XMLHttpRequest Omogočeni klici samo na strežnik od koder izvira
spletna stran surovi HTTP zahtevki
Višjenivojski konstrukti Objektno orientirani proxy razredi JSON serializacija / deserializacija
114
Dostop do spletnih storitev Aplikacije lahko svoje podatke in operacije
objavijo preko spletnih storitev Modeli: SOAP (.asmx, .svc), REST (.ashx)
Podpora za JSON sporočila in ustrezno serializacijo objektov
Popolna abstrakcija XMLHttpna odjemalcu Skriptni proksi razredi za storitve .asmx in .svc
Omogočeno klicanje metod, ki v nadaljevanju izvedejo webRequest in prenesejo parametre ter vrnejo vrednosti
Demo: Klic spletne storitve, ki vrača objekt
116
Client Page Life Cycle Events
Page Request Manager Events intializeRequest beginRequest pageLoading pageLoaded endRequest
117
Client Page Life Cycle Events
// Example of page request event hooking in JSvar prm = Sys.WebForms.PageRequestManager.getInstance();prm.add_initializeRequest(InitializeRequest/*handler*/);…
function InitializeRequest(sender, args) { var prm = Sys.WebForms.PageRequestManager.getInstance(); if(ShouldCancelThisRequest(args)) { prm.abortPostBack(); }}
118
Authentication service
119
Authentication service
120
Omogoča asinhrono preverjanje uporabnikovih podatkov
Dve osnovni metodi: Login Logout
Na strežniku je potrebno “vključiti” storitev
... In nastaviti način avtentikacije
<!-- Vključitev storitve za avtentikacijo --> <system.web.extensions> <scripting> <webServices> <authenticationService enabled="true" /> </webServices> </scripting> </system.web.extensions>
<authentication mode="Forms"> <forms cookieless="UseCookies” loginUrl="~/login.aspx" /> </authentication>
Demo: Authentication service
121
Razhroščevanje ASP.NET AJAX rešitev
Trace na strežniku
123
Tudi ob uporabi AJAX je na voljo Trace na strežniku.
Nastavitev pageOutput="false“
Do izpiskov preko Trace.axd
Demo: Trace
124
Internet Explorer Developer Toolbar
125
Omogoča ogled in manipulacijo DOM, CSS, ...
Razhroščevanje skriptov preko Internet Explorerja
Omogočimo “script debugging” Display script error notifications Dodajanje ukazov “debugger” v
skripto Na Mozilla-i je razhroščevanje
podprto preko vključka Venkman debugger add-in
Firebug – (breakpoint, watch, ...)
126
Razhroščevanje v Visual Studio 2005
127
Izvod Internet explorerja, ki ga želim orazhroščevati mora biti priklopljen na Visual Studio Če rešitev poženemo z Debug se to zgodi
samodejno Drugače pa: Debug Attach to Process ...
V primeru napake se požene razhroščevalnik v VS 2005
System.Debug
128
Assert – če je pogoj false, prikaže sporočilo in sproži debugger
Sys.Debug.assert( (v !== ""), "You must give your name.");
Fail – prikaže sporočilo in sproži debuggerSys.Debug.fail("You must give your name.");
Trace – izpiše sporočilo v konzoli razhroščevalnika in na spletni strani v elementu TextArea z imenom “TraceConsole”, če je prisoten na strani
traceDump – izpiše vsebino podanega objekta na konzolo debuggerja in v element “TraceConsole”
clearTrace – izbriše vsebino trace
Demo: Sys.Debug
129
Web development Helper
130
http://projects.nikhilk.net/Projects/WebDevHelper.aspx
Fiddler http://www.fiddlertool.com
Proksi za razhroščevanje HTTP prometa. Omogoča raziskovanje prometa in “igranje” z zahtevki
131
132
APTANA – intellisense JavaScript
Varnost AJAX rešitev
Poskusi napadov v Web 1.0
134
Pridobivanje “prstnih odtisov” strežniške platforme in aplikacije (IIS, Appache, ...; ASP.NET, PHP, ...)
Raziskovanje in zloraba funkcionalnosti (vrivanje SQL stavkov v iskalna polja, ...)
Spreminjanje vrednosti elementov na formi Spreminjanje vrednosti skritih polj in GET
parameterov
Kako pa je s tem v Web 2.0?
135
Metode: Iskanje “prstnih odtisov” uporabljenega AJAX ogrodja
glede na vključene skriptne datoteke (*.js) Odkrivanje podprtih metod z brskanjem po skriptni
kodi ogrodja Klic metod ogrodja (za pridobivanje dodatnih
informacij) Manipulacija klicev na lokalnih JS proksi razredih Manipulacija klicev na strežnik
Poanta: Raziskovanje je zaradi velikega števila metod v AJAX
knjižnicah kompleksnejše, vendar je na voljo večja površina za napad
Manipulacija s poslanimi parametri je zanimivejša zaradi povečane površine napada
AJAX in Varnost HTTPS je vaš prijatelj
Občutljivo kodo in podatke imejte na strežniku, kjer jo lahko nadzirate
Privzeto je celotna komunikacija v obliki čistega teksta (vključno s knjižnicami skriptne kode, ki se pošiljajo na odejmalca), kar omogoča zajemanje in spreminjanje
JavaScript nima vgrajenega mehanizma za podporo šifriranju in razšifriranju
Zanimivo: Ajax Secure Service Layerhttp://assl.sullof.com/assl/
136
Prihodnost ASP.NET AJAX
137
ASP.NET AJAX v naslednjih različicah
Nekatere nove možnosti so že na ogled v ASP.NET AJAX Futures CTP
Visual Studio in .NET Framework “Orcas” ASP.NET AJAX bo postal del .NET ogrodja Izboljšana orodja za pisanje in razhroščevanje
skript na brskalniku Boljša podpora za ASP.NET AJAX strežniške
kontrolnike v načrtovalskem načinu Bogatejši strežniški kontrolniki
Zaključek
Zaključne misli“AJAX je mogočno orožje. Je kot velika puška s katero brez težav podremo slona, a prav tako si lahko odpihnemo nogo, če jo usmerimo v napačno smer”
AJAX prinaša na uporabnikov brskalnik precej bogatejšo izkušnjo
Ni ga smiselno uporabiti čisto povsod in za vsako ceno – uporabimo zdravo kmečko pamet – smo zaradi uporabe AJAXa uporabniku delo zares olajšali?
140
Viri za nadalnje raziskovanje ASP.NET AJAX
http://ajax.asp.net DOM Reference
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/d051f7c5-e882-42e8-a5b6-d1ce67af275c.asp
Fiddler http://www.fiddlertool.com/
141
Vprašanja?
142