ASP.NET 3.5 a C# 2008 tvorba dynamických stránek PROFESIONÁLNĚ
Matthew MacDonald a Mario Szpuszta
uvod.indd 1
15.9.2008 10:10:07
Pro ASP.NET 3.5 in C# 2008, Second Edition Matthew MacDonald, Mario Szpuszta Original English language edition published Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2008 by Apress L.P. Czech language edition copyright © 2008 by ZONER software, s.r.o. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Apress L.P. Originální anglické vydání vydal Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2008 Apress L.P. České vydání vydal ZONER software, s.r.o., copyright © 2008. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslovného svolení Apress L.P.
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek PROFESIONÁLNĚ Autor: Matthew MacDonald, Mario Szpuszta Copyright © ZONER software, s.r.o. Vydání první v roce 2008. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZR802 ZONER software, s.r.o. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný, Jan Gregor Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP: Miroslav Kučera Zdrojové soubory ke knize: http://www.zonerpress.cz/download/asp-net-35-visual-c-2008.zip
Čtyři bonusové kapitoly: http://www.zonerpress.cz/download/asp-net-35-bonusove-kapitoly.zip
Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, s.r.o. Nové sady 18, 602 00 Brno tel.: 532 190 883, fax: 543 257 245 e-mail: knihy@zoner.cz http://www.zonerpress.cz
ISBN 978-80-7413-008-3
uvod.indd 2
15.9.2008 10:10:53
Obsah O autorech
27
O odborném korektorovi
27
Úvod
28
Co naleznete v této knize?
28
Komu je tato kniha určena
29
Co potřebuje, abyste mohli pracovat s touto knihou?
30
Sdělte nám svůj názor
30
Zdrojové kódy
31
Bonusové kapitoly
31
Část I – Základy ASP.NET Kapitola 1
Úvod do ASP.NET
Evoluce webového vývoje
35
Vývojový svět před příchodem ASP.NET
36
Co je špatného na klasickém ASP?
36
ASP.NET
38
Sedm důležitých faktů o ASP.NET
39
Fakt 1: ASP.NET je integrováno s .NET Frameworkem
39
Fakt 2: ASP.NET se neinterpretuje, ale kompiluje
39
Fakt 3: ASP.NET je vícejazyčné
41
Fakt 4: ASP.NET běží uvnitř společného runtime jazyků
43
Fakt 5: ASP.NET je objektově orientované
45
Fakt 6: ASP.NET podporuje různá zařízení a různé prohlížeče
46
Fakt 7: ASP.NET se snadno rozmisťuje a konfiguruje
47
ASP.NET 3.5 – příběh pokračuje
48
ASP.NET 2.0
48
ASP.NET 3.5
49
Shrnutí
Kapitola 2
54
Visual Studio
Vývojový model .NET
uvod.indd 3
35
55 56
Kompilátor
56
Integrované vývojové rozhraní Visual Studia
57
15.9.2008 10:10:53
4 Weby a webové projekty
58
Vytvoření webu bez projektu
58
Zacílení na více verzí (multitargeting)
61
Navrhování webové stránky
62
Integrované vývojové rozhraní Visual Studia
70
Okno dokumentu
71
Toolbox
71
Seznam chyb a seznam úkolů
72
Průzkumník serveru
74
Editor kódu
75
Přidání referencí na assembly
76
IntelliSense a osnova
79
Model vytváření kódu
81
Jak se soubory kódu v pozadí připojují ke stránkám
84
Jak se připojují značky ovládacích prvků k proměnným stránky
85
Jak se připojují události k obsluhám událostí
87
Webové projekty
88
Vývoj založený na projektu
89
Vytvoření webového projektu
90
Migrace webu z předchozí verze Visual Studia
92
Ladění ve Visual Studiu
93
Ladění po krocích
94
Sledování proměnných
97
Pokročilé body přerušení
98
Makra Visual Studia
99
Web Development Helper
101
Shrnutí
103
Kapitola 3
Webové formuláře
Zpracování stránky
uvod.indd 4
68
Průzkumník řešení
105 105
HTML formuláře
106
Dynamická uživatelská rozhraní
108
Model událostí ASP.NET
109
Automatické odesílání na server
109
Stav zobrazení
111
15.9.2008 10:10:53
5 Soulad s XHTML Etapy zpracování webového formuláře
120
Inicializace pracovního rámce stránky
121
Inicializace uživatelského kódu
121
Validace
122
Zpracování událostí
123
Automatické vázání dat
123
Úklid
124
Ukázka toku zpracování stránky
124
Stránka jako kontejner ovládacích prvků
127
Zobrazení stromu ovládacích prvků
127
Záhlaví stránky
131
Dynamické vytváření ovládacích prvků
132
Třída Page
134
Objekty Session, Application a Cache
134
Objekt Request
135
Objekt Response
136
Objekt Server
139
Objekt User
141
Objekt Trace
141
Přístup ke kontextu HTTP v jiné třídě
147
Shrnutí
Kapitola 4
148
Serverové ovládací prvky
Typy serverových ovládacích prvků Hierarchie serverového ovládacího prvku Serverové ovládací prvky HTML
149 149 151 152
Třída HtmlControl
153
Třída HtmlContainerControl
154
Třída HtmlInputControl
154
Třídy serverových ovládacích prvků HTML
155
Nastavování atributů stylu a jiných vlastností
156
Programátorská tvorba serverových ovládacích prvků
158
Obsluha událostí na straně serveru
159
Webové ovládací prvky Základní třída WebControl
uvod.indd 5
115
162 163
15.9.2008 10:10:54
6 Základní třídy webových ovládacích prvků
164
Jednotky
166
Výčtové hodnoty
167
Barvy
167
Písma
168
Focus
169
Výchozí tlačítko
171
Panely s rolováním
172
Obsluha událostí webových ovládacích prvků
172
Ovládací prvky pro seznamy Ovládací prvky seznamů, z nichž lze vybírat
177
Ovládací prvek BulletedList
179
Ovládací prvky pro validaci vstupů
181
Validační ovládací prvky
181
Validační proces
182
Třída BaseValidator
184
Ovládací prvek RequiredFieldValidator
186
Ovládací prvek RangeValidator
186
Ovládací prvek CompareValidator
187
Ovládací prvek RegularExpressionValidator
187
Ovládací prvek CustomValidator
190
Ovládací prvek ValidationSummary
191
Programátorské využívání validátorů
192
Validační skupiny
194
Bohatě vybavené ovládací prvky ASP.NET
196
Ovládací prvek AdRotator
196
Ovládací prvek Calendar
198
Shrnutí
Kapitola 5
200
Aplikace ASP.NET
Anatomie aplikace ASP.NET
201 201
Aplikační doména
202
Doba života aplikace
203
Aktualizace aplikací
204
Struktura adresáře aplikace
204
Aplikační soubor global.asax
uvod.indd 6
175
205
15.9.2008 10:10:54
7 Aplikační události
207
Ukázka aplikačních událostí
209
Konfigurace ASP.NET Soubor machine.config
210
Soubor web.config
213
Nastavení <system.web>
217
Programátorské čtení a zápis konfiguračních nastavení
222
Nástroj WAT (Website Administration Tool)
225
Rozšiřování struktury konfiguračního souboru
226
Šifrování konfiguračních sekcí
230
Komponenty .NET
232
Vytvoření komponenty
233
Test komponenty prostřednictvím adresáře App_Code
235
Test komponenty prostřednictvím adresáře Bin Rozšiřování kanálu HTTP
235 238
HTTP ovladače a HTTP moduly
238
Vytvoření vlastního ovladače HTTP
240
Konfigurace vlastního ovladače HTTP
241
Registrace ovladačů HTTP bez konfigurace IIS
242
Vytvoření pokročilejšího ovladače HTTP
243
Vytvoření HTTP ovladače pro obsah, který není HTML
246
Vytvoření vlastního HTTP modulu Shrnutí
Kapitola 6
248 251
Správa stavu
253
Správa stavu ASP.NET
253
Stav zobrazení
256
Ukázka práce se stavem zobrazení
257
Ukládání objektů do stavu zobrazení
258
Zachování členských proměnných
261
Posouzení stavu zobrazení
262
Bezpečnost stavu zobrazení
264
Přenášení informací mezi stránkami
265
Dotazovací řetězec
265
Odesílání stránky na server přes jinou stránku
267
Cookies
uvod.indd 7
210
274
15.9.2008 10:10:54
8 Stav relace
276
Architektura relace
276
Práce se stavem relace
277
Konfigurování stavu relace
279
Zabezpečení stavu relace Stav aplikace
285 286
Statické proměnné aplikace Shrnutí
288 290
Část II – Přístup k datům Kapitola 7
Základy ADO.NET
Architektura ADO.NET
294
Poskytovatelé dat ADO.NET
294
Standardizace v ADO.NET
296
SQL Server 2005
297
Základní třídy ADO.NET
298
Třídy připojení
299
Připojovací řetězce
299
Testování připojení
301
Fond připojení
303
Statistiky o připojení
304
Třídy příkazu a třídy čtenáře dat
305
Třídy příkazu (Command class)
305
Třídy čtenáře dat (DataReader class)
307
Metoda ExecuteReader() a čtenář dat
308
Metoda ExecuteScalar()
313
Metoda ExecuteNonQuery()
314
Útoky injektáží SQL
315
Práce s parametrizovanými příkazy
318
Volání uložených procedur
319
Transakce
322
Transakce a aplikace ASP.NET
323
Úrovně izolace
327
Záchytné body
329
Kód nedogmatický vzhledem k poskytovatelům
uvod.indd 8
293
330
15.9.2008 10:10:54
9 Vytvoření továrny na objekty
330
Vytváření objektů v továrně
332
Dotaz s kódem nedogmatickým vůči poskytovatelům
332
Shrnutí
Kapitola 8
334
Datové komponenty a sada dat
Budování komponenty pro přístup k datům
335
Datová třída
337
Uložené procedury
338
Třída přístupu k datům (databázové utility)
339
Testování databázové komponenty Odpojená data
346 348
Webové aplikace a sada dat
349
Integrace XML
349
Sada dat (DataSet)
350
Datový adaptér (DataAdapter)
351
Plnění sady dat
353
Práce s více tabulkami najednou a relace
354
Vyhledávání konkrétních řádků
357
Použití sady ve vlastní třídě pro přístup k datům
358
Vázání dat
359
Datový pohled (DataView) Řazení s datovým pohledem
360 360
Filtrování s datovým pohledem
362
Pokročilé filtrování s relacemi
363
Vypočítané sloupce
364
Silně typové sady dat
366
Vlastní tabulkové adaptéry
367
Vytvoření typové sady dat
368
Rozbor typové sady dat
370
Práce s typovou sadou dat
372
Shrnutí
Kapitola 9
374
Vázání dat
Základy vázání dat Jednoduché vázání dat
uvod.indd 9
335
375 376 376
15.9.2008 10:10:54
10 Další typy výrazů pro vázání
378
Složené vázání dat
383
Ovládací prvky pro zdroje dat Životní cyklus stránky s vázáním dat Ovládací prvek SqlDataSource
391 392
Výběr záznamů
393
Parametrizované příkazy
396
Zpracování chyb
400
Aktualizace záznamů
401
Odstraňování záznamů
405
Vkládání záznamů
406
Nevýhody ovládacího prvku SqlDataSource
407
Ovládací prvek ObjectDataSource
408
Výběr záznamů
409
Aktualizace záznamů
414
Aktualizace pomocí datového objektu
415
Limity ovládacích prvků pro zdroje dat
419
Specifikace problému
419
Přidání dalších položek do seznamu
420
Zpracování dodatečných voleb s SqlDataSource
421
Zpracování dodatečných voleb s ObjectDataSource
422
Shrnutí
Kapitola 10
422
Bohatě vybavené datové ovládací prvky
423
Ovládací prvek GridView
424
Definice sloupců
424
Formátování a GridView
428
Formátování sloupců vázaných na data
429
Styly
430
Formátování pouze některých hodnot
434
Výběr řádků a GridView
436
Využití výběru pro formulář typu hlavní řádek – sdružené řádky
437
Událost SelectedIndexChanged
439
Datový sloupec v podobě výběrových tlačítek
440
Řazení a GridView Řazení s SqlDataSource
uvod.indd 10
390
440 441
15.9.2008 10:10:54
11 Řazení s ObjectDataSource
442
Řazení a výběr
443
Složitější řazení
445
Stránkování a GridView
446
Automatické stránkování
446
Vlastní stránkování s ObjectDataSource
448
Přizpůsobení pruhu se stránkovacími ovládacími prvky
451
Šablony a GridView Použití několika šablon
454
Editace šablon ve Visual Studiu
455
Vázání k metodě
456
Obsluha událostí šablony
457
Editace se šablonou
459
Ovládací prvek ListView
464
Skupiny v ListView
468
Stránkování
469
Ovládací prvky DetailsView a FormView
470
Ovládací prvek DetailsView
471
Ovládací prvek FormView
473
Pokročilé mřížky
475
Souhrny v GridView
475
Zobrazení rodič/potomek v jediné tabulce
477
Editace pole pomocí vyhledávací tabulky
480
Získávání obrázků z databáze
482
Detekce konfliktů při simultánním zpracování
488
Shrnutí
Kapitola 11
uvod.indd 11
452
493
Cachování a asynchronní stránky
495
Cachování v ASP.NET
495
Cachování výstupu
496
Deklarativní cachování výstupu
497
Cachování a dotazovací řetězec
498
Cachování s konkrétními parametry dotazovacího řetězce
499
Vlastní technika cachování
500
Cachování s třídou HttpCachePolicy
501
Cachování fragmentu a nahrazení po uložení do cache
502
15.9.2008 10:10:55
12 Profily cache
505
Konfigurace cache
505
Cachování dat
507
Přidávání prvků do kolekce Cache Jednoduchý test cache
510
Priority cache
511
Cachování s ovládacími prvky zdrojů dat
512
Závislosti cache
515
Závislosti na souboru a na prvku v cache
515
Souhrnné závislosti
517
Zpětné volání při odstranění prvku z cache
517
Notifikace SQL do cache
520
Notifikace cache v SQL Serveru 2000 a v SQL Serveru 7
521
Notifikace cache v SQL Serveru 2005 a SQL Serveru 2008
525
Vlastní závislosti cache
528
Jednoduchá ukázka vlastní závislosti cache
529
Vlastní závislost cache používající fronty zpráv
530
Asynchronní stránky
532
Vytvoření asynchronní stránky
534
Dotazy na data v asynchronní stránce
535
Zpracování chyb
537
Cachování v asynchronních úlohách
540
Vícenásobné asynchronní úlohy a prodlevy
542
Shrnutí
Kapitola 12
544
Soubory a proudy
545
Práce se systémem souborů
545
Třídy Directory a File
546
Třídy DirectoryInfo a FileInfo
548
Třída DriveInfo
551
Práce s atributy
552
Filtrování souborů se zástupnými symboly
554
Získávání informací o verzi souboru
555
Třída Path
556
Prohlížeč souborů
558
Čtení a zápis souborů pomocí proudů
uvod.indd 12
507
563
15.9.2008 10:10:55
13 Textové soubory
564
Binární soubory
566
Nahrávání souborů na server
567
Práce se soubory bezpečná pro více uživatelů
569
Komprimace
574
Serializace
575
Shrnutí
578
Kapitola 13
LINQ
Základy LINQ
580
Odložené vykonávání
581
Jak LINQ pracuje
582
Výrazy LINQ
583
Výrazy LINQ pod kapotou
590
LINQ to DataSet
593
Typová sada dat
595
Hodnoty null
596
LINQ to SQL
596
Třídy datových entit
598
Třída DataContext
599
LINQ to SQL "pod kapotou"
600
LINQ to SQL a databázové komponenty
603
Výběr jediného záznamu nebo jediné hodnoty
606
Automatické generování datových tříd
608
Relace
614
Generování metod pro uložené procedury
622
Potvrzování změn
624
LinqDataSource
630
Zobrazování dat
631
Získávání dat spojených relacemi
634
Editace dat
634
Validace
635
Shrnutí
Kapitola 14
638
XML
Kdy je rozumné používat XML?
uvod.indd 13
579
639 639
15.9.2008 10:10:55
14 Úvod do XML
641
Správně strukturované XML
642
Jmenné prostory XML
643
Schémata XML
645
Zpracování XML založené na proudech
646
Zápis souborů XML
646
Čtení souborů XML
650
Zpracování XML v paměti
653
XmlDocument
654
XPathNavigator
657
XDocument
660
Vyhledávání obsahu XML
665
Vyhledávání s XmlDocument
666
Prohledávání dokumentu XML s XPath
668
Prohledávání XDocument s LINQ
670
Validace obsahu XML
672
Základní schéma
672
Validace s XmlDocument
673
Validace s XDocument
675
Transformace obsahu XML
675
Základní stylový předpis
676
Práce s XslCompiledTransform
677
Práce s ovládacím prvkem Xml
678
Transformace XML s LINQ to XML
679
Vázání dat XML
681
Vázání, které není hierarchické
682
Výrazy XPath
683
Vnořené mřížky
686
Hierarchické vázání s TreeView
687
Práce s XSLT
689
Vázání k obsahu XML z jiných zdrojů
691
Aktualizace XML prostřednictvím XmlDataSource
692
XML a sada dat ADO.NET
692
Převod sady dat do XML
693
Přístup k sadě dat jako k XML
694
Shrnutí
uvod.indd 14
640
Výhody XML
696
15.9.2008 10:10:55
15
Část III – Budování webů ASP.NET Kapitola 15
Uživatelské ovládací prvky
Základy uživatelského ovládacího prvku
700
Vytvoření prostého uživatelského ovládacího prvku
700
Převod stránky na uživatelský ovládací prvek
702
Přidávání kódu do uživatelského ovládacího prvku
703
Obsluha událostí
703
Přidávání vlastností
704
Práce s vlastními objekty
706
Přidávání událostí
709
Vystavení vnitřku webového ovládacího prvku
712
Dynamicky načítané uživatelské ovládací prvky
713
Pracovní rámce portálů
714
Ukládání částí stránky do cache
717
Vlastnost VaryByControl
718
Sdílení ovládacích prvků ukládaných do cache
720
Shrnutí
Kapitola 16
720
Motivy a vzory stránek
721
Kaskádové stylové předpisy (CSS)
721
Vytvoření stylového předpisu
722
Jak se aplikují stylová pravidla Motivy
uvod.indd 15
699
724 727
Adresáře motivu a skinové předpisy
727
Jak se aplikuje jednoduchý motiv
729
Zpracování konfliktů souvisejících s motivem
730
Vytvoření více skinů pro jeden ovládací prvek
731
Skiny se šablonami a obrázky
732
Použití CSS v motivu
734
Aplikování motivů prostřednictvím konfiguračního souboru
735
Aplikování motivu dynamicky
735
Standardizace layoutu webu
737
Základní informace o vzoru stránek
738
Jednoduchý vzor stránek
739
Jednoduchá obsahová stránka
740
15.9.2008 10:10:55
16 Výchozí obsah
743
Vzory stránek, tabulky a layout CSS
743
Vzory stránek a relativní cesty
746
Použití vzorů stránek prostřednictvím konfiguračního souboru
747
Pokročilé vzory stránek
748
Dynamické nastavení vzoru stránek
749
Vnořování vzorů stránek
750
Shrnutí
Kapitola 17
752
Navigace po webu
Stránky s více zobrazeními
753 753
Ovládací prvek MultiView
754
Ovládací prvek Wizard
758
Mapa webu
766
Definice mapy webu
767
Vázání k mapě webu
769
Navigační cesta
770
Zobrazení části plánu webu
772
Objekty mapy webu
776
Přidávání vlastních informací do mapy webu
778
Tvorba vlastního poskytovatele mapy webu
778
Mapování URL
786
Security trimming
787
Ovládací prvek TreeView
788
Objekty TreeNode
789
Plnění uzlů na požádání
792
Styly TreeView
793
Ovládací prvek Menu
797
Styly pro prvek Menu
800
Šablony ovládacího prvku Menu
801
Shrnutí
Kapitola 18
803
Rozmístění webu
Internet Information Services (IIS) Weby IIS a virtuální adresáře
uvod.indd 16
748
Interakce s třídou vzoru stránek
805 805 806
15.9.2008 10:10:55
17 Konzola IIS a konfigurace IIS
807
Mapování webů, virtuálních adresářů a souborů na URL
809
Základy architektury IIS
810
Instalace IIS
826
Správa webů
832
Správa virtuálních adresářů a webů s IIS 5.x a IIS 6.0
833
Správa aplikačních fondů v IIS 6.0
839
Správa virtuálních adresářů a webů s IIS 7.0
845
Správa aplikačních fondů v IIS 7.0 Rozmisťování aplikací ASP.NET
857 859
Ověření instalace ASP.NET na IIS 5.x a IIS 6.0
860
Vykonávání ASP.NET bok po boku na IIS 5.x a IIS 6.0
862
Vykonávání ASP.NET bok po boku na IIS 7.0
863
Konfigurace nastavení HTTP runtimu při rozmisťování na IIS 5.x
864
Kompilační modely v ASP.NET
865
Rozmisťování s Visual Studiem
869
Webové rozmisťovací projekty Visual Studia 2005
870
VirtualPathProvider v ASP.NET
876
Monitorování zdravotního stavu v ASP.NET
881
Základní struktura
881
Události a poskytovatelé
881
Shrnutí
885
Část IV – Bezpečnost Kapitola 19
Bezpečnostní model ASP.NET
Co znamená tvorba bezpečného softwaru?
889
Chápeme potenciální hrozby
890
Zásady bezpečného programování
891
Pochopení strážných
892
Chápeme úrovně bezpečnosti
893
Autentizace
893
Autorizace
894
Důvěrnost a integrita
895
Jak všechno spojit dohromady
896
Bezpečnost IIS
uvod.indd 17
889
897
15.9.2008 10:10:55
18 Autentizace a autorizace na IIS 5.x a IIS 6.0
898
Nástroj pro konfiguraci zabezpečení v IIS 7.0
901
Chápeme SSL
905
Bezpečnostní architektura ASP.NET Autentizace
916
Autorizace
918
Bezpečnostní kontext
918
API členství, rolí a profilů
920
Shrnutí
Kapitola 20
921
Formulářová autentizace
Úvod do formulářové autentizace
923 923
Proč používat formulářovou autentizaci?
924
Proč nepoužívat formulářovou autentizaci?
926
Proč neimplementovat vlastní autentizaci s cookie?
927
Třídy formulářové autentizace
928
Implementace formulářové autentizace
929
Konfigurace formulářové autentizace
930
Odmítnutí přístupu anonymním uživatelům
933
Tvorba vlastní přihlašovací stránky
934
Vlastní úložiště přihlašovacích dokladů
940
Trvalé cookies ve formulářové autentizaci
941
IIS 7.0 a formulářová autentizace
943
Shrnutí
948
Kapitola 21
Členství
949
Úvod do API členství ASP.NET
949
Práce s API členství
952
Konfigurace formulářové autentizace
uvod.indd 18
914
953
Vytvoření úložiště dat
954
Konfigurace připojovacího řetězce a poskytovatele členství
960
Vytváření a autentizace uživatelů
964
Práce s ovládacími prvky pro bezpečnost
966
Ovládací prvek Login
967
Ovládací prvek LoginStatus
978
Ovládací prvek LoginView
979
15.9.2008 10:10:56
19 Ovládací prvek PasswordRecovery
980
Ovládací prvek ChangePassword
985
Ovládací prvek CreateUserWizard
986
Konfigurace členství v IIS 7.0 Konfigurace poskytovatelů a uživatelů
991
Použití API členství s jinými aplikacemi
993
Použití třídy Membership
995
Získávání uživatelů z úložiště
996
Aktualizace uživatelů v úložišti
998
Vytváření a odstraňování uživatelů
999
Ověřování uživatelů
1000
Použití členství v aplikacích Windows Forms
1000
Shrnutí
Kapitola 22
1002
Autentizace Windows
Představení autentizace Windows
1003 1003
Proč používat autentizaci Windows?
1004
Proč nepoužívat autentizaci Windows?
1005
Mechanismy autentizace Windows
1005
Implementace autentizace Windows
1012
Konfigurace IIS 5.x nebo IIS 6.0
1012
Konfigurace IIS 7.0
1014
Konfigurace ASP.NET
1015
Odepření přístupu anonymním uživatelům
1019
Přístup k informacím uživatele Windows
1020
Impersonalizace
1026
Impersonalizace ve Windows 2000
1027
Impersonalizace ve Windows XP
1028
Impersonalizace a delegování v systému Windows Server 2003
1028
Impersonalizace v systému Windows Vista
1031
Impersonalizace a delegování v systému Windows Server 2008
1031
Konfigurovatelná impersonalizace
1032
Programová impersonalizace
1034
Shrnutí
uvod.indd 19
991
1037
15.9.2008 10:10:56
20 Kapitola 23
Autorizace a role
Autorizace URL
1039
Autorizační pravidla
1040
Souborová autorizace
1046
Autorizační kontroly v kódu
1047
Metoda IsInRole()
1047
Třída PrincipalPermission
1048
Autorizace založená na rolích s API rolí
1050
Použití ovládacího prvku LoginView s rolemi
1056
Programátorský přístup k rolím
1057
Použití API rolí s autentizací Windows
1060
Ochrana zdrojů, které nejsou z ASP.NET, v IIS 5 a 6
1062
Mapování dalších typů souborů
1063
Vytvoření vlastního HTTP ovladače
1064
Autorizace a role v IIS 7.0 Autorizace s ASP.NET Roles v IIS 7.0 Správa rolí ASP.NET s IIS 7.0 Shrnutí
Kapitola 24
1066 1068 1070 1072
Profily
Co je profil Představení profilů
1073 1073 1074
Jak profily ukládají data
1075
Profily a autentizace
1075
Profily versus vlastní datové komponenty
1076
Použití poskytovatele SqlProfileProvider
1076
Vytvoření tabulek pro profily
1077
Konfigurace poskytovatele
1079
Definování vlastností profilu
1080
Použití vlastností profilu
1081
Serializace profilu
1083
Skupiny profilu
1085
Profily a vlastní datové typy
1086
API pro profily
1089
Anonymní profily
1092
Vlastní poskytovatel profilu
uvod.indd 20
1039
1094
15.9.2008 10:10:56
21 Třídy vlastního poskytovatele profilu
1095
Návrh FactoredProfileProvider
1096
Naprogramování FactoredProfileProvider
1098
Testování FactoredProfileProvider
1102
Shrnutí
Kapitola 25
1105
Kryptografie
Šifrování dat: diskrétnost
1107
Jmenný prostor .NET pro kryptografii
1108
Úvod do kryptografických tříd .NET
1112
Symetrické šifrovací algoritmy
1113
Asymetrické šifrování
1114
Abstraktní šifrovací třídy
1115
Rozhraní ICryptoTransform
1115
Třída CryptoStream
1116
Šifrování citlivých dat
1117
Správa tajných údajů
1117
Používání symetrických algoritmů
1119
Používání asymetrických algoritmů
1124
Šifrování citlivých dat v databázi Šifrování dotazovacího řetězce
1126 1131
Obalení dotazovacího řetězce
1131
Vytvoření testovací stránky
1134
Shrnutí
Kapitola 26
1136
Vlastní poskytovatelé členství
1137
Architektura vlastních poskytovatelů
1138
Základní kroky při vytváření vlastních poskytovatelů
1139
Návrh vlastního poskytovatele v obecných rysech
1139
Návrh a implementace vlastního úložiště
1140
Implementace tříd poskytovatele
1148
Používání tříd vlastních poskytovatelů
1170
Shrnutí
uvod.indd 21
1107
1174
15.9.2008 10:10:56
22
Část V – Pokročilé uživatelské rozhraní Kapitola 27
Vlastní serverové ovládací prvky
Základy vlastního serverového ovládacího prvku
1177
Vytvoření kostry vlastního ovládacího prvku
1178
Použití vlastního ovládacího prvku
1180
Vlastní ovládací prvky v Toolboxu
1181
Webový ovládací prvek podporující vlastnosti stylu
1183
Proces realizace (generování HTML)
1187
Práce s různými prohlížeči
1188
HtmlTextWriter
1188
Detekce prohlížeče
1189
Vlastnosti prohlížeče
1191
Potlačení automatické detekce typu prohlížeče
1193
Adaptivní realizace prvků
1194
Stav ovládacího prvku a události
1197
Stav zobrazení
1197
Stav ovládacího prvku
1199
Data postbacku a události změn
1201
Spouštění postbacku
1203
Rozšiřování existujících webových ovládacích prvků
1205
Složené ovládací prvky
1205
Odvozené ovládací prvky
1208
Šablonové ovládací prvky
1211
Vytvoření šablonového ovládacího prvku
1211
Používání přizpůsobených šablon
1214
Styly
1218
Shrnutí
Kapitola 28
1221
Podpora návrhového režimu
1223
Klíčoví hráči
1223
Atributy návrhového režimu
1224
Okno Properties
1225
Atributy a dědičnost
1230
Ikona v Toolboxu Webové zdroje
uvod.indd 22
1177
1230 1232
15.9.2008 10:10:56
23 Vytvoření zdroje
1232
Získání zdroje
1233
Nahrazení textu
1234
Serializace kódu
1235
Typové konvertory
1235
Serializační atributy
1243
Typové editory
1245
Designéři ovládacího prvku HTML v návrhovém režimu
1248
Inteligentní značky
1251
Shrnutí
Kapitola 29
1256
Dynamické grafiky a GDI+
Ovládací prvek ImageMap
1257 1257
Vytváření aktivních oblastí
1258
Ošetření kliknutí do aktivních oblastí
1259
Vlastní aktivní oblast
1261
Kreslení s GDI+
1263
Jednoduché kreslení
1263
Formát a kvalita obrázku
1265
Třída Graphics
1266
Práce s třídou GraphicsPath
1269
Pera
1270
Štětce
1273
Vložení dynamické grafiky do webové stránky
1274
Použití formátu PNG
1275
Předávání informací dynamickým obrázkům
1276
Vlastní ovládací prvky používající GDI+
1279
Kreslení grafů s GDI+
1284
Shrnutí
1289
Kapitola 30
Portály s webovými částmi
Typické portálové stránky Základy stránek budovaných s Web Parts
uvod.indd 23
1248
1291 1292 1293
Vytvoření návrhu stránky
1294
Ovládací prvky WebPartManager a WebPartZones
1295
15.9.2008 10:10:56
24 Přidávání webových částí na stránku
1297
Přizpůsobení stránky
1301
Vytváření webových částí
1303
Jednoduché úlohy webové části
1304
Vývoj pokročilých webových částí
1312
Použití webové části
1321
Editory webových částí
1322
Propojování webových částí
1328
Vlastní slovesa a webové části
1336
Uživatelské ovládací prvky a pokročilé webové části
1337
Dynamické nahrávání webových částí
1340
Webové části a autorizace
1346
Závěrečné personalizační úlohy
1346
Shrnutí
1347
Část VI – Programování na straně klienta Kapitola 31
JavaScript a Ajax
Základy JavaScriptu
1351
HTML DOM (Document Object Model)
1352
Události na straně klienta
1353
Bloky skriptu
1355
Manipulace s prvky HTML
1357
Ladění JavaScriptu Základní příklady JavaScriptu
1358 1360
Vytvoření stránkového procesoru v JavaScriptu
1360
Asynchronní stahování obrázků pomocí JavaScriptu
1364
Realizace bloků skriptu
1368
Útoky injektáží skriptu
1370
Požadavek na validaci
1370
Vypnutí požadavku na validaci
1371
Vlastní ovládací prvky s JavaScriptem
1373
Vyskakovací okna
1373
Rollover tlačítka
1377
Rámce Navigace pomocí rámců
uvod.indd 24
1351
1381 1382
15.9.2008 10:10:57
25 Plovoucí rámce (iframe) Pochopení Ajaxu Objekt XMLHttpRequest
1386
Příklad použití Ajaxu
1387
Použití Ajaxu se zpětným voláním klienta
1391
Vytvoření zpětného volání klienta
1392
Zpětná volání klienta "pod pokličkou"
1398
Zpětné volání klienta ve vlastních ovládacích prvcích
1399
Shrnutí
Kapitola 32
1403
ASP.NET AJAX
Úvod do ASP.NET AJAX
1405 1405
ASP.NET AJAX na klientovi – knihovny skriptů
1407
ASP.NET AJAX na serveru – ScriptManager
1408
Serverová zpětná volání
1409
Webové služby v ASP.NET AJAX
1410
Vytvoření webové metody
1412
Proxy webové služby
1417
Umístění webové metody na stránce
1419
Aplikační služby ASP.NET AJAX
1420
Serverové ovládací prvky ASP.NET AJAX
1427
Částečná realizace s prvkem UpdatePanel
1428
Pravidelné obnovování pomocí prvku Timer
1435
Časově náročné aktualizace s prvkem UpdateProgress
1436
Hlubší pohled na klientské knihovny
1439
Pochopení klientského modelu
1440
Objektově orientované programování v JavaScriptu
1441
Pracovní rámec webové stránky Rozšíření ovládacích prvků
1449 1454
Instalace ASP.NET AJAX Control Toolkit
1455
AutoCompleteExtender
1457
Dostupná rozšíření v ASP.NET AJAX Control Toolkit Shrnutí
Kapitola 33 Co je Silverlight
uvod.indd 25
1383 1384
1460 1464
Silverlight
1465 1466
15.9.2008 10:10:57
26 Silverlight versus Flash
1467
Přijetí Silverlightu
1468
Silverlight a WPF
1469
Instalace Silverlightu a rozšíření Visual Studia
1470
Vytvoření projektu Silverlightu
1471
Vstupní HTML stránka
1472
Inicializační skript Silverlightu
1473
Stránka XAML
1475
XAML a kód v pozadí
1478
Vlastnosti a události
1480
Kompilace Silverlightu
1481
Základy Silverlightu
1482
Třídy .NET Framework v Silverlightu Prvek Canvas
1484
Prvek TextBlock
1488
Interakce s HTML
1490
Silverlight a ASP.NET
1496
ASP.NET Futures
1496
Komunikace mezi Silverlightem a ASP.NET
1500
Kreslení ve 2D
1501
Jednoduché tvary
1501
Cesty a geometrie
1506
Štětce
1514
Průhlednost
1516
Animace
1518
Základy animace
1518
Definice animace
1519
Příklad interaktivní animace
1523
Transformace
1526
Shrnutí
Rejstřík
uvod.indd 26
1482
1529
1531
15.9.2008 10:10:57
27
O autorech MATTHEW MACDONALD je autor, pedagog a Microsoft MVP. Pravidelně přispívá do časopisů o programování a je autorem více než tuctu knih o programování .NET, například "Pro WPF: Windows Presentation Foundation in .NET 3.0" (Apress, 2007), "Beginning ASP.NET 3.5 in C# 2008" (Apress, 2007) či "Pro .NET 2.0 Windows Forms and Custom Controls in C#" (Apress, 2006). V šerém dávnověku svého života studoval anglickou literaturu a teoretickou fyziku. V současnosti žije v Torontu se svou ženou a dcerou. MARIO SZPUSZTA pracuje jako architekt ve skupině Developer and Platform Group společnosti Microsoft v Rakousku a pomáhá softwarovým architektům největších podniků a webovým zákazníkům se zaváděním nových technologií Microsoftu. Několik let se specializoval na vývoj bezpečného softwaru, webové služby, a integraci klientů a serverů Microsoft Office do zákaznických aplikací. Mario pravidelně přednáší na místních a mezinárodních konferencích, jako např. DevDays a TechEd Europe Developers. V posledních dvou letech byl držitelem technického obsahu TechEd Europe Developers.
O odborném korektorovi ANDY OLSEN je nezávislý programátor a konzultant žijící ve Velké Británii. Andy pracuje s .NET už od vydání první beta-verze a je spoluautorem a odborným korektorem několika knih od Apressu, které se věnují C#, Visual Basicu, ASP.NET a některým dalším tématům souvisejícím s programováním. Andy je horlivým fanouškem jak fotbalu, tak i ragby. Rovněž rád běhá a lyžuje (bohužel, docela špatně). Andy žije na pobřeží Swansea se svou ženou Jayne a dětmi Emily a Thomasem.
uvod.indd 27
15.9.2008 10:10:57
28
Úvod Jak bezpochyby již víte, ASP.NET je nová generace technologií Microsoftu pro vytváření webových aplikací běžících na straně serveru. Je postavena na Microsoft .NET Frameworku, který je seskupením úzce souvisejících nových technologií, které přináší kompletní revoluci, od přístupu do databáze až po distribuované aplikace. ASP.NET je jednou z nejdůležitějších komponent .NET Frameworku – jedná se o část, která vám umožní vyvíjet velmi výkonné webové aplikace. ASP.NET nemá problémy se získáním zájmu programátorů. Bez nadsázky můžeme říci, že ASP.NET je nejkompletnější platformou pro vývoj webu, které kdy byla sestavena. Daleko převyšuje svého předchůdce ASP, které bylo navrženo jako sada nástrojů pro vkládání dynamického obsahu na běžné webové stránky. Oproti tomu je ASP.NET je plnohodnotnou platformou pro vývoj komplexních a velmi rychlých webových aplikací. V této knize se naučíte všechno, co potřebujete ke zvládnutí ASP.NET 3.5. Pokud jste již programovali v předchozí verzi ASP.NET, můžete se zaměřit výhradně na nové funkce, například LINQ (kapitola 13), ASP.NET AJAX (kapitola 32) a Silverlight (kapitola 33). Pokud jste nikdy v ASP.NET neprogramovali, zjistíte, že tato kniha poskytuje vhodné tempo výuky, při níž projdete všechny základní věci, které potřebujete znát. Rovněž se podíváte na to, co se děje na pozadí a jak ASP.NET interně funguje. Jediným požadavkem pro zvládnutí problematiky této knihy je obstojná znalost jazyka C# a základů .NET. Pokud patříte k vývojářům migrujících z jazyka Java nebo C++, takže C# je pro vás novinkou, možná bude lepší začít s nějakou knihou, která se věnuje základům .NET, např. "Pro C# 2008 and .NET 3.5 Platform" od Andrewa Troelsena. (Předchozí verzi této knihy pod názvem "C# a .NET 2.0 profesionálně" vydal Zoner Press, www.zonerpress.cz, v roce 2006.)
Co naleznete v této knize? Zde je rychlé představení všeho, co můžete najít v této knize:
uvod.indd 28
•
Část I – Základy ASP.NET. V kapitole 1 začneme stručným pohledem na celou platformu ASP.NET, .NET Framework a uvedeme si přehled změn, které se udály v ASP.NET 3.5. V kapitole 2 trošičku odběhneme k nástrojům a podíváme na Visual Studio 2008. V kapitolách 3, 4, 5 a 6 zvládnete klíčové části infrastruktury ASP.NET (například model webové stránky, konfiguraci aplikace a správu stavu). Jakmile ovládnete tyto základní principy, podíváme se na to, jak ASP.NET zpracovává požadavky a spravuje dobu života webových aplikací. Rovněž se dozvíte, jak rozšířit architekturu ASP.NET.
•
Část II – Přístup k datům. V této části se budeme věnovat oblasti nezbytné pro vývoj veškerého softwaru, což je přístup a manipulace s daty. V kapitole 7 a 8 si popíšeme základy ADO.NET a naučíme se navrhovat komponenty pro přístup k datům. V kapitole 9 a 10 se dozvíte o sadě inovativních ovládacích prvků pro vázání dat ASP.NET. Tyto prvky vám umožní naformátovat a zobrazovat data bez nutnosti psát vlastní kód. Kapitola 11 vás zavede k pokročilým strategiím ukládání do cache, což je funkcionalita, která zajišťuje špičkový výkon. Kapitoly 12, 13 a 14 vás následně přenesou mimo svět ADO.NET, protože si ukážeme, jak pracovat se soubory, LINQ, a obsahem XML.
•
Část III – Budování webů ASP.NET. Třetí část této knihy se věnuje základních technikách a funkcionalitách pro správu webových stránek. V kapitole 15 začnete pracovat s uživatelskými ovládacími prvky, které vám umožní opětovně používat části uživatelského rozhraní. V kapitole 16 naleznete více informací o dvou užitečných inovacích ASP.NET – motivy (které slouží pro automatickou stylizaci ovládacích prvků) a vzorové stránky (které jsou určeny pro opětovné použití vaší designové šablony na více webových stránkách). V kapitole 17 si ukážeme, jakým způsobem používat navigační model ASP.NET, aby návštěvníci mohli přecházet z jedné stránky vašeho webu na jinou. V kapitole 18 si pak podrobně popíšeme rozmisťování vašich aplikací a webový server IIS.
15.9.2008 10:10:57
29
•
Část IV – Bezpečnost. V této části se podíváte na bohatou sadu funkcionalit vztahujících se k zabezpečení ASP.NET. V kapitole 19 začneme s celkovým přehledem principů zabezpečení. Poté se společně podíváme na formulářovou autentizaci (kapitola 20) a funkcionalitu členství, která s ní spolupracuje (kapitola 21). V kapitole 22 se budeme věnovat autentizaci Windows a v kapitole 23 se naučíte, jak omezit autentizované uživatele prostřednictvím autorizačních pravidel a jakým způsobem používat zabezpečení na základě rolí. V kapitole 24 prozkoumáte funkcionalitu profilů – což je řešení, které je určeno pro ukládání informací specifických pro uživatele. S využitím informací z kapitoly 25 zvládnete ochránit nejenom data, která ukládáte do databáze, ale také informace, které zasíláte prostřednictvím URL adresy. V kapitole 26 vám poté ukážeme, jakým způsobem se můžete zapojit do bezpečnostního modelu ASP.NET (vytvořením vlastního poskytovatele členství).
•
Část V – Pokročilé uživatelské rozhraní. V této páté části si předvedeme, jakým způsobem lze rozšířit vaše webové stránky o různě pokročilé techniky. V kapitolách 27 a 28 se podíváme na vlastní ovládací prvky. V kapitole 29 odbočíme k problematice GDI+ a ručně vytvářené grafiky. V kapitole 30 nakonec detailně prozkoumáme funkcionalitu webových části ASP.NET, která vám jednoduchým způsobem umožní vytvářet webové portály.
•
Část VI – Programování na straně klienta.. V této poslední části této knihy zvážíme aktuální trendy ve vývoji moderních webů. V kapitolách 31 a 32 popřemýšlíme o tom, jak vytvořit dynamičtější webové stránky (začleněním různých efektů jako například automatické dokončování textu či přetahování), které budou schopny větší interakce s uživatelem (díky schopnosti rychle reagovat na jeho akce). V poslední kapitole této knihy proniknete do světa Silverlightu, což vestavěný plug-in Microsoftu do prohlížeče, který vám umožňuje rozšířit běžné webové stránky o bohatou grafiku, animace, zvuk a samozřejmě i video.
Komu je tato kniha určena Kniha je zamýšlena jako prvotní zdroj informací pro profesionální vývojáře, kteří mají slušné znalosti o webovém vývoji na straně serveru. Kniha neposkytuje vyčerpávající pohled na každou ingredienci nacházející se uvnitř .NET Frameworku – taková kniha by musela mít více než dvojnásobný počet stran. Proto se tato kniha raději zaměřuje na to, aby poskytla inteligentní úvod do ASP.NET pro profesionální programátory, kteří se nepotřebují zdržovat se základy. Průběžně se budete soustřeďovat na různá zákoutí .NET Frameworku, která potřebujete znát, abyste mohli budovat profesionální webové aplikace, mezi něž které patří přístup k datům a XML. S těmito schopnostmi budete schopni vytvářet weby nové generace, a to s nejlepšími nástroji, jaké jsou dnes k dispozici. Kniha je také velmi praktická. Nedozvíte se pouze o schopnostech ASP.NET, dozvíte se také o technikách ze skutečného světa, s jejichž pomocí budete moci převést svůj web na vyšší kvalitativní úroveň. Pozdější kapitoly knihy jsou zasvěcené břitkým tématům, jako jsou vlastní ovládací prvky, dynamická tvorba grafiky, pokročilá bezpečnost, či vysoký výkon při přístupu k datům. Tohle všechno je potřebné pro vývoj profesionálních webových aplikací. Abyste mohli z této knihy vytěžit co nejvíce, měli byste se dobře vyznat v syntaxi jazyka C# a v pojmech objektově orientovaného programování. Nemusíte mít zkušenosti s předchozí verzí ASP.NET, protože veškeré potřebné věci se v této knize probírají. Pokud jste zkušenými programátory v jazycích Java nebo C++ bez jakýchkoliv zkušeností s .NET, měli byste raději začít s nějakou knihou, která se věnuje základům .NET. Vřele vám doporučujeme knihu "Pro C# 2008 and .NET 3.5 Platform" od Andrewa Troelsena. (Předchozí verzi této knihy pod názvem "C# a .NET 2.0 profesionálně" vydal Zoner Press, www.zonerpress.cz, v roce 2006.)
uvod.indd 29
15.9.2008 10:10:57
30
Co potřebuje, abyste mohli pracovat s touto knihou? Hlavním požadavkem pro práci s touto knihou je nějaký počítač s nainstalovaným Visual Studiem 2008. Přestože teoreticky se dá kód vytvářet ručně, je to nesmírně pracné, a to ani nemluvíme o vysoké pravděpodobnosti vzniku různých chyb. Tento ruční přístup nikdy nepoužívá v profesionálních kruzích. POZNÁMKA Můžete používat odlehčené Visual Studio Web Developer 2008 Express Edition, ale u některých příkladů narazíte na značná omezení. Nejdůležitější omezení je to, že Visual Studio Web Developer 2008 Express Edition nemůžete používat pro vytvoření knihoven tříd, které jsou základní části moderního designu založeného na komponentách (ačkoliv toto omezení můžete v praxi obejít použitím dvou express edicí současně – Visual Studio Web Developer Express Edition pro vytvoření webových stránek a Visual C# 2008 Express Edition pro vytvoření komponent).
Pokud také plánujete hostovat weby ASP.NET, musíte používat Windows XP Professional nebo (v ideálním případě) serverovou verzi Windows, např. Windows Server 2003 nebo Windows Server 2008. Rovněž si musíte nainstalovat IIS (Internet Information Services), což je software pro hostování webů. Webový server IIS, který se podrobněji popisuje v kapitole 18, je součástí výše zmíněných operačních systémů. Do této knihy je také začleněno několik příkladů, které využívají ukázkové databáze dodávané společně s SQL Serverem, aby bylo možné demonstrovat funkčnost kódu pro přístup k datům, techniky týkající se bezpečnosti či webové služby. Pro vyzkoušení těchto příkladů můžete používat libovolnou verzi SQL serveru, včetně SQL Server 2005 Express Edition, která je součástí některých verzí Visual Studia (a volně ke stažení na stránkách http://msdn.microsoft.com/sql/express). Pokud budete používat nějaké jiné relační databáze, pravděpodobně se neobejdete bez drobných úprav kódu uvedeného v této knize.
Sdělte nám svůj názor Jako čtenáři této knihy se stáváte těmi nejdůležitějšími kritiky a komentátory. Vážíme si vašeho názoru a chtěli bychom vědět, co děláme správně, co bychom mohli dělat lépe, ve kterých oblastech bychom měli publikovat a také vaše další podnětné myšlenky, o které jste ochotni se s námi podělit. Jako odborný redaktor Zoner Press vítám vaše názory. Můžete mi psát – poslat e-mail nebo dopis – a sdělit mi, co se vám v této knize líbilo nebo nelíbilo, stejně tak, co bychom měli udělat, aby naše další knihy byly lepší. Pokud mi napíšete, nezapomeňte prosím připojit název knihy, ISBN, jméno autora, vaše jméno, telefon, fax nebo e-mail. Pozorně zhodnotím vaše názory a poskytnu je autorovi a redaktorům, kteří pracovali na této knize. Prosím, vězte, že nemohu pomoci s technickými problémy, které se týkají obsahu knihy, a že díky velkému množství e-mailů, které dostávám, nemohu zaručit odpověď na každou zprávu. E-mail: miroslav.kucera@zoner.cz nebo knihy@zoner.cz. Adresa: ZonerPress, ZONER software, s.r.o., Miroslav Kučera, Nové sady 18, 602 00 Brno.
uvod.indd 30
15.9.2008 10:10:58
31
Zdrojové kódy Zdrojové soubory k této knize je možné stáhnout na této adrese (velikost 8.7 MB): http://www.zonerpress.cz/download/asp-net-35-visual-c-2008.zip
Dále jsou k dispozici ke stažení čtyři bonusové kapitoly (velikost 3.8 MB): http://www.zonerpress.cz/download/asp-net-35-bonusove-kapitoly.zip
Bonusové kapitoly K této knize jsou k dispozici čtyři bonusové kapitoly ve formátu PDF. V těchto kapitolách naleznete obsah, který kvůli technologickým omezením tisku nemohl být zařazen do této knihy. Jedná se o obsah, který není považován za důležitý z hlediska vývoje webu ASP.NET. Podívejte se, co v těchto čtyřech kapitolách najdete:
•
Bonusová kapitola 1. V této kapitole si popíšeme, jak používat prostředky a lokalizace na webech vytvořených s ASP.NET. Jedná se o základní kapitolu pro vývojáře, kteří potřebují vytvořit webové stránky, které mají být k dispozici ve více jazykových variantách.
•
Bonusové kapitoly 2, 3, a 4. Tyto kapitoly popisují webové služby a funkce, které vám umožní vytvořit takový kód, který může být přes Internet zavolán nějakou jinou aplikací. Pro vývojáře se webové služby stávají zajímavějšími hlavně v okamžiku, kdy začínají uvažovat o vývoji bohatých klientů, protože vám umožňují poskytnout webovou funkcionalitu pro běžné desktopové aplikace. Protože koncept webových služeb je v současnosti nahrazován novou technologií známou jako WCF (Windows Communication Foundation), nebylo toto téma zařazeno do této knihy.
POZNÁMKA Tyto čtyři bonusové kapitoly pocházejí z předchozího vydání této knihy. Pokud tedy náhodou vlastníte knihu "ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně", kterou vydal Zoner Press v roce 2006, je zbytečné si tyto bonusové kapitoly stahovat, protože neobsahují nic nového.
uvod.indd 31
15.9.2008 10:10:58
32
uvod.indd 32
15.9.2008 10:10:58
Část I
Základy ASP.NET Chcete-li začít psát kód nějakého webu ASP.NET, musíte nejprve zvládnout jistou malou sadu základních dovedností. V této části probereme .NET Framework, který podporuje každá aplikace .NET (kapitola 1), designérský nástroj Visual Studio, jenž pomáhá budovat a testovat weby (kapitola 2), a infrastrukturu ASP.NET, díky níž weby pracují (kapitoly 3, 4, 5 a 6). Přestože se mohou tato témata jevit profesionálnímu vývojáři ASP.NET jako až příliš základní přehled, obsahují několik kriticky důležitých a citlivých míst. Každý seriózní vývojář ASP.NET se potřebuje dobře vyznat v podrobnostech takových záležitostí, jako jsou životní cyklus webové stránky a webové aplikace, zpracování fronty požadavku ASP.NET (ASP.NET request processing pipeline), správa stavu (state management) a konfigurační model ASP.NET. Jejich pochopení je nejenom klíčové pro vytváření webových aplikací s vysokým výkonem, ale patří též mezi nezbytné dovednosti, chcete-li rozšiřovat infrastrukturu ASP.NET, což je téma, které budeme v kapitolách této části probírat průběžně.
Kapitola 01.indd 33
15.9.2008 10:11:48
34
Kapitola 01.indd 34
15.9.2008 10:11:57
35
KAPITOLA 1 Úvod do ASP.NET Když u Microsoftu vytvářeli .NET, nesnili pouze o budoucnosti – na srdci jim také ležely různé neduhy a omezení současné generace technologií webového vývoje. Než začneme pracovat s ASP.NET 3.5, neuškodí, když se trochu poohlédneme zpět, a budeme se chvilku těmto problémům věnovat. Pak lépe pochopíte, jaká řešení .NET nabízí. V této kapitole probereme historickou cestu, kterou urazil webový vývoj, a jež nás dovede až k ASP.NET. Prolétneme tryskem okolo nejvýznamnějších rysů .NET a zběžně se seznámíme s klíčovými změnami, které přicházejí s ASP.NET 3.5. Jestliže s ASP.NET začínáte, tato kapitola vám pomůže, abyste se rychle dostali do obrazu. Jste-li příležitostným vývojářem v .NET, máte dvě možnosti. Tou první je, že si kapitolu přečtete, abyste bryskně získali přehled o tom, jak to s ním vypadá dnes. Druhá možnost je taková, že rovnou přejdete k oddílu "ASP.NET 3.5 – příběh pokračuje", abyste se seznámili s tím, co má ve svém arzenálu ASP.NET 3.5.
Evoluce webového vývoje První přenos dat přes HTTP (Hypertext Transfer Protocol) uskutečnil Tim Berners-Lee už před více než deseti lety. Od té doby prodělalo HTTP exponenciální růst popularity, prolomilo hranice malé skupiny vizionářů počítačové vědy, a proniklo jak do soukromého sektoru, tak i do byznysu. Dnes je to téměř slovo patřící do běžného hovorového jazyka. Když bylo HTTP zřízeno poprvé, bylo pro vývojáře nelehkou výzvou navrhovat aplikace, které se uměly vyhledat a vzájemně spolu komunikovat. Aby vývojáři mohli úspěšně čelit takové výzvě, byly pro ně vytvořeny různé standardy, jako HTML (Hypertext Markup Language) nebo XML (Extensible Markup Language). HTML definovalo prostý jazyk, s jehož pomocí je možné popsat, jak zobrazit komplikované dokumenty na prakticky jakékoliv počítačové platformě. XML zase vytvořilo sadu pravidel pro vytváření formátů dat neutrálních vzhledem k platformám, s jejichž pomocí si pak mohou rozličné aplikace vyměňovat informace. Tyto standardy garantovaly, že web mohl od té doby využívat kdokoliv, odkudkoliv, a s jakýmkoliv typem počítačového systému. Souběžně s tím výrobci softwaru čelili svým vlastním výzvám. Potřebovali vyvinout nejenom takové jazyky a programovací nástroje, které by uměly komunikovat s webem, ale také celé pracovní rámce, jež by vývojářům umožnily navrhovat nejenom architekturu aplikací, ale také je vyvíjet a rozšiřovat – a to, pokud možno,
Kapitola 01.indd 35
15.9.2008 10:11:57
36
Kapitola 1 – Úvod do ASP.NET
co nejsnadnějším způsobem. Přední výrobci softwaru, IBM, Sun Microsystems či Microsoft, spěchali, aby uspokojili vzniklou potřebu hromadou nových produktů. ASP.NET 3.5 je nejnovější kapitolou ve stále probíhajících závodech ve zbrojení. Společnost Microsoft s technologií .NET vytvořila integrovanou skupinu komponent, která kombinuje budování částí pro web (značkovací jazyky a HTTP) s osvědčenou metodologií orientovanou na objekty.
Vývojový svět před příchodem ASP.NET Webové aplikace první generace se obtížně programovaly i udržovaly, a také čelily signifikantním výzvám co do výkonu a škálovatelnosti (scalability). Obecně se dá říci, že rané technologie webového vývoje spadají do dvou základních kategorií:
•
Oddělené, malinkaté aplikace, které se vykonávají voláním na straně serveru. Dobrým příkladem jsou rané implementace CGI (Common Gateway Interface). Klíčovým problémem tohoto vývojového modelu je, že konzumuje obrovské množství serverových zdrojů, protože každý požadavek vyžaduje oddělenou instanci aplikace. Důsledkem je, že aplikace jsou mnohem méně škálovatelné (scalable) v prostředích s velkým počtem simultánních uživatelů.
•
Skripty, které interpretuje nějaký zdroj na serveru. Do této kategorie patří klasické ASP (Active Server Pages) a rané implementace ColdFusion. Na těchto platformách vytváříte soubory obsahující kód HTML a vložený kód skriptu. Soubor skriptu prozkoumá při běhu parser, který střídá realizaci obyčejného HTML a vykonávání vloženého kódu. Tento proces je mnohem méně efektivní, než když se vykonává zkompilovaný kód.
ASP.NET znamená mnohem víc než prostou evoluci jednoho či druhého typu aplikace. ASP.NET není nějaká sada nemotorných háků, které umožňují na serveru spouštět aplikace nebo vykonávat komponenty. Je to zcela jinak. Webové aplikace ASP.NET jsou plnohodnotné aplikace .NET, které vykonávají kompilovaný kód a jež udržují runtime .NET. ASP.NET také používá všechny schopnosti .NET Frameworku – což je vyčerpávající soubor nástrojů tříd – právě tak snadno jako obyčejná aplikace Windows. ASP.NET v podstatě odstraňuje dělicí čáru mezi vývojem aplikací a webovým vývojem, protože rozšiřuje nástroje a technologie, které výhradně používali vývojáři desktopových aplikací, do světa webového vývoje.
Co je špatného na klasickém ASP? Jestliže jste doposud programovali s klasickým ASP, možná se divíte, proč Microsoft změnil v ASP.NET úplně všechno. Naučit se úplně nový pracovní rámec, to rozhodně není dětská slavnost, zvláště tehdy, když .NET přichází s hromadou nových pojmů a nabízí některé části, jejichž zvládnutí může být dosti zapeklitou záležitostí. Všeobecně se dá říci, že klasické ASP je solidním nástrojem pro vývoj webových aplikací s využitím technologií Microsoftu. Ovšem, podobně jako je tomu u většiny vývojových modelů, ASP sice některé problémy řeší, nicméně také přináší několik nových problémů. V následujících částech si tyto problémy stručně popíšeme.
Kód, co se táhne jako špagety Pokud jste někdy vytvářeli aplikace s ASP, pravděpodobně jste se setkali s dlouhými stránkami, které obsahují směs skriptu realizovaného na straně serveru a HTML. Podívejte se na ukázku. Kód v ní uvedený naplňuje rozevírací seznam (ovládací HTML prvek) výsledky získanými databázovým dotazem:
Kapitola 01.indd 36
15.9.2008 10:11:58
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
37
<% Set dbConn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") dbConn.Provider = "sqloledb" dbConn.Open "Server=SERVER_NAME; Database=Pubs; Trusted_Connection=yes" %> <select name="cboAuthors"> <% rs.Open "SELECT * FROM Authors", dbConn, 3, 3 Do While Not rs.EOF %> <option value="<%=rs("au_id")%>"> <%=rs("au_lname") & ", " & rs("au_fname")%> </option> <% rs.MoveNext Loop %> </select>
V této ukázce je zapotřebí celých 19 řádků kódu na to, aby se vygeneroval jediný ovládací HTML prvek. To není zrovna působivé. Horší ale je, že takový styl psaní kódu má negativní dopad na výkon aplikace, protože se dohromady míchá HTML kód a skript. Až bude tuhle stránku zpracovávat ISAPI (Internet Server Application Programming Interface) ASP, což je rozšíření, které běží na webovém serveru, bude se muset skriptovací engine několikrát zapínat a vypínat, ačkoliv se jedná o zpracování jednoho jediného požadavku. Tím se zvyšuje doba nutná na zpracování celé stránky a její odeslání klientovi. Dále, webové stránky psané tímto stylem mohou snadno a rychle nabobtnat do nezvladatelných délek. A přidáte-li do celé skládačky ještě vaše vlastní komponenty COM, které budete potřebovat na zprovoznění funkcionalit, které ASP poskytnout neumí, stane se noční můra ohledně údržby takových stránek ještě tíživější. Závěr je jasný. Bez ohledu na to, jaký přístup zvolíte, kód ASP vykazuje tendenci, že se postupně stane odpudivým, nadměrně dlouhým, a neuvěřitelně obtížně laditelným – pokud ovšem dokážete nějaké ladění ASP ve vašem prostředí vůbec zprovoznit. V ASP.NET takové problémy neexistují. Webové stránky se píší s ohledem na tradiční objektově orientované pojmy, a obsahují takové ovládací prvky, že s nimi pracujete velmi obdobným způsobem jako v případě desktopových aplikací. To znamená, že nemusíte dělat směs z HTML značek a inline kódu. Pokud přijmete při vytváření stránek ASP.NET přístup, kdy se používá kód v pozadí (code-behind), bude kód opravdu oddělen od prezentace, což zjednoduší údržbu kódu a umožní oddělit design webové stránky od obtížné práce spojené s vytvořením kódu pro webové stránky.
Skriptovací jazyky V době, kdy bylo vytvořeno, vypadalo ASP jako perfektní řešení pro desktopové vývojáře, kteří se přesouvali do světa webu. Místo toho, aby se museli učit nějaký úplně nový jazyk, nebo novou metodologii, jim ASP umožnilo, aby použili jim důvěrně známé jazyky, jako VBScript, na programovací platformě založené na serveru. Protože se už tehdy jako podkladová kostra používal populární programovací model COM (Component Object Model), skriptovací jazyky fungovaly i jako pohodlný dopravní prostředek pro přístup ke
Kapitola 01.indd 37
15.9.2008 10:11:58
Kapitola 1 – Úvod do ASP.NET
38
komponentám a prostředkům serveru. Ale i když bylo ASP snadno pochopitelné pro vývojáře, kteří dovedně ovládali skriptovací jazyky, jako je VBScript, tahle důvěrná známost nebyla získána zadarmo. Protože ASP bylo založeno na starších technologiích, které byly původně navrženy pro použití u klientů, nemohly stejně dobře fungovat v novém prostředí webového vývoje. Výkon nebyl jediným problémem. Každý objekt nebo proměnná, které byly použity v klasickém skriptu ASP, se vytvářely jako datový typ variant. Většina programátorů Visual Basicu dobře ví, že datové typy variant jsou vágně typované. Požadují větší množství paměti a jsou známé (a kontrolují se) až při běhu, důsledkem čehož je nižší výkon než u striktně typovaných proměnných. Kompilátor Visual Basicu a vývojové nástroje navíc nemohly tyto datové typy identifikovat už v návrhovém režimu. To způsobilo, že bylo téměř nemožné vytvořit opravdu integrované vývojové prostředí (IDE, integrated development environment), které by poskytlo programátorům ASP cokoliv podobného, jako jsou třeba vyspělé ladicí prostředky, IntelliSense, nebo kontroly chyb, což jsou věci běžné ve Visual Basicu a Visual C++. Bez ladicích nástrojů na odpovídající úrovni se programátoři ASP dostávali do těžkých stresů, když měli napravovat chyby, které vznikaly v jejich skriptech. ASP.NET všechny takové problémy obchází velkým obloukem. Pro začátek stačí říct, že stránky a webové služby ASP.NET se vykonávají uvnitř CLR (common language runtime), takže mohou být napsány v jakémkoliv jazyku, pro který existuje kompilátor fungující v souladu s požadavky CLR. Už nejste omezeni pouze na VBScript nebo JavaScript – můžete používat i moderní objektově orientované jazyky, jako jsou C# nebo Visual Basic. Je také důležité připomenout, že stránky ASP.NET se neinterpretují, ale kompilují do tzv. assembly, což je termín .NET pro jakoukoliv jednotku zkompilovaného kódu. Jedná se o jeden z nejvýznamnějších zobecňujících příspěvků do webového vývojového modelu Microsoftu. I když třeba vytvoříte svůj kód C# nebo Visual Basicu v Poznámkovém bloku a zkopírujete ho přímo do nějakého virtuálního adresáře na webovém serveru, aplikace se dynamicky zkompiluje, jakmile k ní přistoupí nějaký klient, a její kopie se uloží do cache pro potřeby budoucích požadavků. Jestliže se po ukončení kompilačního procesu kterýkoliv ze souborů změní, aplikace se automaticky překompiluje, jakmile ji bude nějaký klient požadovat.
ASP.NET Vývojáři Microsoftu popsali ASP.NET jako svou šanci "odeslat příkaz pro zformátování systému", a začít se zcela novým a modernějším vývojovým modelem. Tradiční pojmy týkající se vytváření webových aplikací však ve světě .NET stále platí. Každá webová aplikace se skládá z webových stránek. Můžete zpracovávat bohatě vybavený HTML, používat JavaScript, vytvářet komponenty, do nichž zapouzdříte programovací logiku, nebo přizpůsobovat a vylaďovat své aplikace za pomoci různých konfiguračních voleb. V pozadí však ASP.NET pracuje odlišně než tradiční skriptovací technologie, mezi které patří klasické ASP nebo PHP. ASP.NET se v porovnání s dřívějšími platformami webového vývoje odlišuje v těchto věcech:
•
ASP.NET nabízí úplný, objektově orientovaný programovací model, který obsahuje architekturu řízenou událostmi, založenou na ovládacích prvcích, což podporuje zapouzdřování kódu a jeho opětovné využívání.
•
ASP.NET dává možnost psát kód v kterémkoliv z podporovaných jazyků .NET (mezi ně patří Visual Basic, C#, J# a mnoho dalších jazyků, které mají kompilátory od jiných výrobců).
•
V ASP.NET je vše podřízeno vysokému výkonu. Stránky ASP.NET a komponenty se kompilují na požádání, a tudíž se neinterpretují pokaždé, když se použijí. ASP.NET také obsahuje vyladěný model pro přístup k datům a flexibilní ukládání dat do cache, aby bylo možné ještě více zvyšovat výkon.
Kapitola 01.indd 38
15.9.2008 10:11:58
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
39
Tohle je pouze několik ze základních rysů, mezi které dále patří rozšířená správa stavu (state management), praktické vázání dat, dynamická tvorba grafiky nebo robustní model bezpečnosti. S jednotlivými zdokonaleními se podrobně seznámíte v knize a zjistíte, jak do celého obrázku zapadá ASP.NET 3.5.
Sedm důležitých faktů o ASP.NET Jestliže s ASP.NET začínáte (nebo si prostě chcete osvěžit nějaké základy), budou pro vás následující oddíly zajímavé. Uvádí se v nich sedm nejdůležitějších faktů o .NET.
Fakt 1: ASP.NET je integrováno s .NET Frameworkem .NET Framework je rozčleněn do pečlivě propracované kolekce funkčních částí, zahrnující více než 10 000 typů (termín .NET pro třídy, struktury, rozhraní a další klíčové programovací ingredience). Než se můžete pustit do programování jakéhokoliv druhu aplikace .NET, je potřeba, abyste měli základní informace o těchto částech – a abyste chápali, proč jsou věci uspořádány tak, jak uspořádány jsou. Obrovská kolekce funkcionality, kterou poskytuje .NET Framework, je zorganizována tak, že klasičtí programátoři Windows to budou považovat za šťastný krok vpřed. Každá z těch tisíců tříd v .NET Frameworku je seskupena do logického, hierarchického kontejneru, kterému se říká jmenný prostor (namespace). Různé jmenné prostory poskytují různé funkce. Když se to vezme všechno dohromady, jmenné prostory .NET nabízejí funkcionalitu téměř jakéhokoliv aspektu distribuovaného vývoje, od front zpráv (message queuing) až po otázky bezpečnosti. Této obrovské skupině nástrojů se říká knihovna tříd (class library). Je zajímavé, že třídy .NET Frameworku používáte v ASP.NET stejně, jako v jakémkoliv jiném druhu aplikace .NET (mezi které patří samostatné aplikace Windows, služby Windows, utility pro příkazový řádek atd.). Jinak řečeno – .NET dává webovým vývojářům stejné nástroje, jaké poskytuje vývojářům bohatě vybavených klientských aplikací. TIP Jedním z nejlepších zdrojů, v němž se dozvíte o všech nových zákoutích .NET Frameworku, je jeho referenční příručka knihovny tříd (.NET Framework class library reference), která je součástí referenční knihovny MSDN Help. Máte-li nainstalované Visual Studio 2008, dostanete se do knihovny MSDN Help tak, že zvolíte Start -> Programy -> Microsoft Visual Studio 2008 -> Microsoft Visual Studio 2008 Documentation (přesný text prvků menu závisí na vaší konkrétní verzi Visual Studia). Jakmile jednou nápovědu načtete, referenční informace o třídách naleznete uspořádané podle jmenných prostorů pod uzlem .NET Development -> .NET Framework SDK -> Class Library Reference.
Fakt 2: ASP.NET se neinterpretuje, ale kompiluje Jedním z hlavních důvodů degradace výkonu ve skriptech ASP je to, že v kódu webových stránek s ASP se používají interpretované skriptovací jazyky. To znamená, že když se aplikace vykonává, musí skriptovací hostitel na serveru interpretovat kód a přeložit jej do strojového kódu nižší úrovně, pěkně řádek po řádku. Tento proces je – jak každý ví – velmi pomalý. POZNÁMKA V tomto případě je reputace o něco horší než skutečnost. Interpretovaný kód je pomalejší než zkompilovaný kód, ale rozdíl ve výkonu není až tak významný, abyste s ASP nemohli vytvářet profesionální weby.
Kapitola 01.indd 39
15.9.2008 10:11:58
40
Kapitola 1 – Úvod do ASP.NET
Aplikace ASP.NET se kompilují vždy – a skutečně, je nemožné spouštět kód C# nebo Visual Basicu, aniž by se předtím nejprve nezkompiloval. Aplikace ASP.NET procházejí dvěma kompilačními etapami. V první etapě se kód C#, který jste napsali, zkompiluje do přechodného jazyka, jenž se nazývá Microsoft Intermediate Language (MSIL), nebo prostě jen IL. Tento první krok je fundamentální příčinou toho, že v .NET je možné používat různé programovací jazyky. Všechny jazyky .NET (včetně C#, Visual Basicu, a mnoha dalších) se totiž zkompilují do virtuálně identického kódu IL. První kompilační krok může nastat automaticky, když se stránka poprvé požaduje, nebo se může vykonat předem (to je proces, kterému se říká předběžná kompilace, precompiling). Zkompilovanému souboru s kódem IL se říká assembly. Druhá úroveň kompilace nastává těsně předtím, než se stránka skutečně vykoná. V tomto okamžiku se kód IL zkompiluje do nativního nízkoúrovňového strojového kódu. Tato etapa se nazývá kompilace just-in-time (JIT) a probíhá stejně pro všechny aplikace .NET (včetně například aplikací Windows). Oba kroky kompilačního procesu vidíte na obrázku 1-1.
Obrázek 1-1. Kompilace webové stránky ASP.NET. Kompilace .NET je rozdělena do dvou kroků proto, aby se vývojářům mohlo nabídnout co největší pohodlí a co nejlepší přenositelnost. Předtím, než může kompilátor vytvořit nízkoúrovňový strojový kód, potřebuje znát typ operačního systému a hardwarovou platformu, kde bude aplikace běžet (například 32bitový nebo 64bitový operační systém Windows). Když jsou obě kompilační etapy dokončeny, můžete vytvořit zkompilovanou assembly s kódem .NET, kterou je možné distribuovat na více než jednu platformu.
Kapitola 01.indd 40
15.9.2008 10:11:58
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
41
Kompilace JIT by samozřejmě nebyla tak užitečná, kdyby se musela provádět pokaždé, když nějaký uživatel požádá o zobrazení nějaké webové stránky. Aplikace ASP.NET se naštěstí nemusejí kompilovat při každém požadavku na webovou stránku. Kód IL se vytvoří pouze jednou, a pak už se generuje jen tehdy, když dojde k modifikaci zdroje. Obdobně se uchovávají i kopie souborů s nativním strojovým kódem, a sice v systémovém adresáři, jehož cesta je obvykle c:\Windows\Microsoft.NET\Framework\v2.0.50727\TemporaryASP.NET Files. POZNÁMKA Možná se divíte, proč se dočasné soubory ASP.NET nacházejí v adresáři s číslem verze 2.0, a nikoliv s číslem verze 3.5. ASP.NET 3.5 v zásadě používá engine ASP.NET 2.0 (s několika novými funkcemi navíc). O tomto designu se další informace dozvíte později v této kapitole, v sekci "ASP.NET 3.5 – příběh pokračuje”.
Jak se dozvíte v kapitole 2, skutečné místo, kde se váš kód kompiluje do IL, závisí na tom, jak vytvoříte a rozmístíte svou webovou aplikaci. Budujete-li svůj webový projekt ve Visual Studiu, zkompiluje se kód do IL, když zkompilujete daný projekt. Jestliže však budujete odlehčený (lighterweight) web bez projektu, kompiluje se kód každé stránky jen tehdy, když o ni požádáte poprvé. Každopádně kód při prvním vykonání projde druhým krokem kompilace (z IL do strojového kódu). ASP.NET také obsahuje nástroje pro předběžnou kompilaci, s nimiž můžete aplikaci kompilovat rovnou do strojového kódu, jakmile jste ji už rozmístili na ostrý webový server. Umožňuje to vyhnout se zátěži představovanou první kompilací, když rozmisťujete dokončenou aplikaci. Tím také zabráníte jiným lidem, aby mohli manipulovat s vaším kódem. Předběžná kompilace se popisuje v kapitole 18. POZNÁMKA Přestože jsou počítačové testy výkonnosti hodně kontroverzní, zajímavé porovnání Javy a ASP.NET najdete na http://msdn2.microsoft.com/en-us/vstudio/aa700836.aspx. Mějte ale na paměti, že skutečné nesnáze omezující výkon se obvykle vztahují ke konkrétním "úzkým hrdlům" systému, jakými jsou například rychlost přístupu na disk, zatížení CPU, rychlost síťového připojení atd. V mnoha testech výkonnosti vykazuje ASP.NET lepší výsledky než jiná řešení, protože podporuje ty schopnosti platforem, které mají vliv na výkon, například ukládání dat do cache. Není to následek nárůstu rychlosti, který je způsoben tím, že kód je zkompilovaný.
Fakt 3: ASP.NET je vícejazyčné I když při vývoji svých aplikací patrně dáváte přednost jednomu z jazyků před ostatními, tahle volba neurčuje, čeho všeho budete moci docílit ve svých webových aplikacích. Je to proto, že ať použijete kterýkoliv jazyk, kód se vždy zkompiluje do IL. IL je odrazovým můstkem každé řízené aplikace (řízená aplikace, managed application, je jakákoliv aplikace, která byla napsána pro .NET a vykonává se uvnitř řízeného prostředí CLR). V jistém smyslu je jazykem .NET právě IL. Je to jediný jazyk, kterému CLR rozumí. Abyste IL snadněji pochopili, ukažme si jednoduchý příklad. Podívejme se na kód, který byl napsaný v jazyku C#: using System; namespace HelloWorld { public class TestClass {
Kapitola 01.indd 41
15.9.2008 10:11:58
423
KAPITOLA 10 Bohatě vybavené datové ovládací prvky V předchozí kapitole jste viděli, jak se vykonávají dotazy pomocí ovládacích prvků pro zdroje dat, s asistencí vlastní třídy pro přístup k datům, nebo bez ní. V rámci těchto prací jste také použili některé bohatě vybavené datové ovládací prvky ASP.NET, jako je GridView. Nijak jste se ovšem nenořili do funkcionality, již tyto ovládací prvky poskytují. V této kapitole se pěkně zblízka podíváte na tři nejmocnější datové ovládací prvky, které ASP.NET nabízí: GridView, DetailsView a FormView. Nezapomeneme na nový prvek ListView. Naučíte se doladit jejich formátování a pod svou kontrolu dostanete takové schopnosti, jako je výběr, řazení, filtrování a šablony. Seznámíte se také s pokročilými scénáři, mezi něž patří zobrazování obrázků, výpočet souhrnů, a vytváření seznamu typu hlavní záznam – sdružené záznamy podrobností (master-details) v jediném ovládacím prvku.
EVOLUCE BOHATĚ VYBAVENÝCH DATOVÝCH OVLÁDACÍCH PRVKŮ ASP.NET Bohatě vybavené (rich) datové ovládací prvky se v ASP.NET změnily víc než jakákoliv jiná sada ovládacích prvků. Ve snaze poskytnout vývojářům co nejlepší ovládací prvky pro zobrazování dat, a přitom s minimem nezbytného kódu, byly ovládací prvky z ASP.NET 1.x (DataGrid, DataList a Repeater) nahrazeny v ASP.NET 2.0 mocnějšími nástroji (GridView, DetailsView a FormView), přičemž ASP.NET 3.5 ještě přišlo s ListView. Původní prvky z ASP.NET 1.x pořád existují, i když většina programátorů ASP.NET žádný z nich už nepoužívá, výjimkou jsou situace, kdy je to vhodné kvůli zpětné kompatibilitě. Následuje přehled všech datových ovládacích prvků ASP.NET.
Kapitola 10.indd 423
•
DataGrid. Byl zaveden v ASP.NET 1.0 a v ASP.2.0 kompletně nahrazen ovládacím prvkem GridView. GridView poskytuje stejnou sadu funkcí (a něco navíc) a zjednodušuje psaní kódu. Prvek DataGrid standardně není v Toolboxu Visual Studia 2005.
•
DataList. Byl zaveden v ASP.NET 1.0 a většinu jeho funkcionality nahrazuje GridView, protože poskytuje obdobnou sadu šablon a mnohem jednodušší model kódu. DataList však má jednu funkci, kterou GridView nemá: možnost vytvořit vícesloupcovou tabulku, ve které každá buňka tvoří separátní záznam. GridView tento neobvyklý design nepodporuje, protože si vynucuje, aby každý záznam zabíral oddělený řádek. Stejného výsledku ovšem docílíte s novým ovládacím prvkem ListView.
•
Repeater. Byl zaveden v ASP.NET 1.0. Slouží jako holá kostra pro ovládací prvek založený na šabloně, který neposkytuje žádné funkce či parádičky. Repeater byl nahrazen prvkem ListView, který nabízí stejnou flexibilitu, a jenž má navíc zabudované některé funkce, jako výběr, řazení a editování.
15.9.2008 10:12:40
424
Kapitola 10 – Bohatě vybavené datové ovládací prvky
... pokračování z předchozí stránky.
•
GridView. Nejmocnější mřížka v ASP.NET. Zobrazuje záznamy v řádcích tabulky, buď pomocí sloupců, nebo na základě šablony, nebo pomocí nějaké kombinace obojího. GridView byl zaveden v ASP.NET 2.0, v ASP.NET 3.5 se nezměnil.
•
ListView. Flexibilní ovládací prvek založený na šabloně, který sice nenabízí všechny funkce, které má GridView, nicméně poskytuje možnost realizovat data bez značky <table>. ListView je jednou z novinek ASP.NET 3.5.
•
DetailsView. DetailsView je nejmocnější ovládací prvek ASP.NET pro úlohy, ve kterých potřebujete v jednom okamžiku zobrazovat data z jediného záznamu. DetailsView používá tabulkové rozvržení a podporuje šablony. DetailsView byl zaveden v ASP.NET 2.0, v ASP.NET 3.5 se nezměnil.
•
FormView. Je podobně jako DetailsView navržen k zobrazování dat z jediného záznamu. Na rozdíl od něj ovšem vyžaduje použití nějakých šablon. Jeho jediná skutečná výhoda spočívá v možnosti zobrazit data v designu, které není tabulkový. FormView byl zaveden v ASP.NET 2.0 a v ASP.NET 3.5 se nezměnil.
Tato kapitola se zaměřuje na prvky GridView, ListView, DetailsView a FormView (v uvedeném pořadí).
Ovládací prvek GridView Jestliže jste programovali s ASP.NET 1.x, patrně jste používali původní ovládací prvek DataGrid. Když v týmu ASP.NET čelili výzvě rozšířit a zdokonalit prvek DataGrid tak, aby byla současně zachována zpětná kompatibilita, rozhodli se, že pro ASP.NET 2.0 vytvoří zcela nový ovládací prvek. Tímto ovládacím prvkem, který zůstal v ASP.NET 3.5 beze změny, je GridView. GridView je neobyčejně flexibilní ovládací prvek pro zobrazování dat v mřížce skládajících se z řádků a sloupců. Obsahuje širokou škálu interně zabudovaných schopností, jako jsou výběr, stránkování, řazení a editování, přičemž se dá rozšiřovat prostřednictvím šablon. Skvělou předností GridView oproti DataGrid je jeho podpora scénářů "bez kódu". Pomocí GridView se dá vyřešit mnoho běžně se vyskytujících úloh, jako jsou stránkování a výběr, aniž byste museli psát nějaký kód. S ovládacím prvkem DataGrid jste byli například nuceni obsluhovat události, pokud jste chtěli implementovat takové schopnosti. GridView jste už v akci viděli v předchozí kapitole. Nicméně jste se vůbec nezabývali tím, jak ho přizpůsobit,
aby zobrazoval data přesně tak, jak potřebujete.
Definice sloupců V ukázkách GridView, s nimiž jste se setkali doposud, byla vlastnost GridView.AutoGenerateColumns nastavena na true. V takovém případě prozkoumá GridView datový objekt pomocí reflexe a vyhledá všechny sloupce (záznamu), nebo vlastnosti (vlastního objektu). Pak vytvoří své sloupce (každý z nich odpovídá jednomu sloupci, resp. vlastnosti) v tom pořadí, v jakém odpovídající sloupce, resp. vlastnosti, našel. Automatické generování sloupců je šikovné, když potřebujete rychle vytvořit nějaké testovací stránky, nicméně neposkytuje takovou flexibilitu, jakou obvykle potřebujete v praxi. Co když chcete některé sloupce skrýt, změnit jejich pořadí, nebo nakonfigurovat nějaký aspekt jejich zobrazení, jako je formátování nebo text v záhlaví? Ve všech těchto případech je potřeba nastavit AutoGenerateColumns na false a definovat sloupce v sekci <Columns> značky ovládacího prvku GridView.
Kapitola 10.indd 424
15.9.2008 10:12:47
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
425
TIP Je možné mít AutoGenerateColumns nastavenou na hodnotu true, a současně definovat sloupce v sekci <Columns>. V takovém případě se sloupce, které explicitně definujete, automaticky přidají před vygenerované sloupce. Tuto techniku jsme využili v předchozí kapitole, kde jsme vytvořili GridView s automaticky vygenerovanými sloupci vázanými na data, a současně jsme ručně specifikovali další sloupec s ovládacími prvky pro editovací akce. Nejvíc flexibility ovšem získáte, pokud všechny sloupce definujete explicitně.
Existuje několik typů sloupců, které naleznete v tabulce 10-1. Pořadí značek sloupců určuje pořadí sloupců v GridView (zprava doleva). Tabulka 10-1. Typy sloupců. Sloupec
Popis
BoundField
Zobrazí text z pole (field) ve zdroji dat.
ButtonField
Zobrazí tlačítko pro každý prvek v seznamu.
CheckBoxField
Zobrazí zaškrtávací políčko pro každý prvek v seznamu. Použije se automaticky pro sloupec typu true/false. (V SQL Serveru jsou to sloupce s datovým typem bit).
CommandField
Poskytuje tlačítka pro výběr nebo editaci.
HyperlinkField
Tento sloupec zobrazí svůj obsah (pole ze zdroje dat nebo statický text) v podobě hypertextového odkazu.
ImageField
Tento sloupec zobrazí obrázek z binárního pole (za předpokladu, že se dá úspěšně interpretovat jako některý z podporovaných formátů obrázku).
TemplateField
Tento sloupec umožňuje pomocí vlastní šablony specifikovat vícenásobná pole (multiple fields), vlastní ovládací prvky, nebo libovolný HTML kód. Poskytuje nejvyšší úroveň kontroly nad zobrazením, nicméně vám dá také nejvíce práce.
Základním typem sloupce je BoundField, který se váže na jeden sloupec v datovém objektu. Takto např. vypadá definice pro jediný vázaný datový sloupec ze zdroje dat, v němž se zobrazí obsah pole EmployeeID: <asp:BoundField DataField="EmployeeID" HeaderText="ID" />
Oproti automaticky generovanému sloupci už tu máme jedno vylepšení – záhlaví bylo změněno z EmployeeID na ID.
Když poprvé vytvoříte GridView, vlastnost AutoGenerateColumns nenastavujete, takže se použije výchozí hodnota true. Když ho svážete s nějakým ovládacím prvkem zdroje dat, nic se nezmění. Jakmile ale kliknete na odkaz Refresh Schema ovládacího prvku zdroje dat, přepne se vlastnost AutoGenerateColumns na false, a Visual Studio přidá značku <asp: BoundField> pro každé pole (fields), které najde ve zdroji dat. Tento přístup má několik výhod:
•
Nastavením vlastností objektu sloupce si můžete snadno přizpůsobit pořadí sloupců, záhlaví sloupců a další detaily.
•
Můžete skrýt sloupce, které nechcete zobrazovat. Jednoduše odstraníte odpovídající značky sloupců. (Tuto techniku byste ovšem neměli používat příliš často – pokud nechcete nějaká data zobrazit, je mnohem lepší zmenšit objem získávaných dat.)
Kapitola 10.indd 425
15.9.2008 10:12:47
Kapitola 10 – Bohatě vybavené datové ovládací prvky
426
TIP Sloupce se dají také skrýt programátorsky. Sloupce se skrývají pomocí kolekce Columns ovládacího prvku GridView. Nastavíte-li například GridView1.Columns[2].Visible na false, skryjete třetí sloupec. Skryté sloupce se ve vygenerovaném kódu HTML vůbec neobjeví.
•
Explicitně definované sloupce jsou rychlejší než automaticky generované sloupce, protože automaticky generované sloupce nutí GridView, aby se při běhu obracel na zdroj dat.
•
Můžete přidávat sloupce navíc, pokud chcete kombinovat výběr, editaci a další funkce.
TIP Pokud modifikujete zdroj dat takovým způsobem, že bude vracet jinou sadu sloupců, je možné regenerovat sloupce GridView. Stačí vybrat GridView a v jeho inteligentní značce kliknout na odkaz Refresh Schema. Tím se vyhodí veškeré vaše vlastní sloupce, které jste přidali (jako například sloupec, co obsahuje ovládací prvky pro editaci).
Podívejte se na kompletní deklaraci GridView s explicitně definovanými sloupci: <asp:GridView ID="gridEmployees" runat="server" DataSourceID="sourceEmployees" AutoGenerateColumns="False"> <Columns> <asp:BoundField DataField="EmployeeID" HeaderText="ID" /> <asp:BoundField DataField="FirstName" HeaderText="First Name" /> <asp:BoundField DataField="LastName" HeaderText="Last Name" /> <asp:BoundField DataField="Title" HeaderText="Title" /> <asp:BoundField DataField="City" HeaderText="City" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="sourceEmployees" runat="server" ConnectionString="<%$ ConnectionStrings:Northwind %>" ProviderName="System.Data.SqlClient" SelectCommand="SELECT EmployeeID, FirstName, LastName, BirthDate, Title, City FROM Employees"> </asp:SqlDataSource>
Když explicitně deklarujete vázaný sloupec, máte příležitost nastavit celou řadu jeho vlastností. Tyto vlastnosti jsou podrobně vypsány v tabulce 10-2. Tabulka 10-2. Vlastnosti sloupce typu BoundField (vázaný na data). Vlastnost
Popis
DataField
Název pole (v řádku) nebo vlastnosti (objektu) prvku dat, který chcete v tomto sloupci zobrazit.
DataFormatString
Tato vlastnost formátuje hodnoty pole (field). Hodí se například, když potřebujete správně zobrazovat peněžní částky nebo datum. V předchozích verzích .NET bylo potřeba nastavit vlastnost HtmlEncode na false, jestliže jste chtěli použít vlastnost DataFormatString. V současnosti toto není požadováno.
Kapitola 10.indd 426
15.9.2008 10:12:47
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
427
Vlastnost
Popis
ApplyFormatInEditMode
Je-li true, formátovací řetězec se bude aplikovat pouze tehdy, když se hodnota objeví v textovém boxu editačního režimu. Výchozí hodnota je false, což znamená, že se použije normální podkladový formát (částka se objeví ve tvaru 1143.02, nikoliv v naformátovaném tvaru $1,143.02 či 1 143,02 Kč).
FooterText
První dvě vlastnosti nastavují text záhlaví a zápatí mřížky, pokud má mřížka záhlaví (ShowHeader je true) a zápatí (ShowFooter je true). Do záhlaví se obvykle dává vypovídající nadpis sloupce, zatímco v zápatí bývá nějaká dynamicky vypočítaná hodnota, například součet (tuto techniku předvedeme v oddílu "Souhrny v GridView" poblíž konce kapitoly). Chcete-li v záhlaví zobrazit místo textu obrázek, nastavte vlastnost HeaderImageUrl.
HeaderText HeaderImageUrl
ReadOnly
Je-li true, není možné v režimu editace měnit hodnotu sloupce. Jednoduše se neposkytne žádný editační ovládací prvek. Pouze pro čtení obvykle bývají sloupce primárního klíče.
InsertVisible
Je-li false, nemůže se hodnota sloupce nastavit na režim vkládání. To se hodí tehdy, pokud chcete hodnotu daného sloupce nastavovat programátorsky, nebo ji založit na nějaké výchozí hodnotě definované v databázi.
Visible
Je-li false, sloupec nebude na stránce vidět (a nebude se pro něj generovat žádný kód HTML). Tato vlastnost poskytuje pohodlný způsob, jak programátorsky skrývat a zase odkrývat konkrétní sloupce, a tím měnit všeobecný vzhled dat.
SortExpression
Výraz, který se dá připojit na konec dotazu, aby se data seřadila podle daného sloupce. Používá se v součinnosti s řazením, viz oddíl " Řazení v GridView".
HtmlEncode
Je-li true (výchozí), pak se veškerý text HTML zakóduje, aby speciální znaky netropily na stránce nějakou neplechu. Kódování HTML můžete vypnout, chcete-li vložit nějakou funkční značku HTML (jako například hypertextový odkaz), nicméně tento přístup není bezpečný. Vždy je lepší použít kódování HTML na všechny hodnoty, a jinou funkcionalitu pak poskytovat přes reakci na události GridView související s výběrem.
NullDisplayText
Text, který se má zobrazit pro hodnoty null. Výchozí je prázdný řetězec, můžete ale uvést nějakou jinou explicitní výchozí hodnotu, jako je třeba "(hodnota chybí)".
ConvertEmptyStringToNull
Pokud je true, tak předtím, než bude potvrzena editace, budou nahrazeny všechny prázdné řetězce hodnotami null.
ControlStyle
Konfigurují vzhled pouze pro tento sloupec, překrývají styly řádku. O stylech se více informací dozvíte v průběhu kapitoly.
HeaderStyle FooterStyle ItemStyle
Nechcete-li sloupce konfigurovat ručně, vyberte GridView a klikněte v okně Properties na tři tečky (…) napravo od vlastnosti Columns. Uvidíte dialogové okno Fields, ve kterém můžete sloupce přidávat, od-
Kapitola 10.indd 427
15.9.2008 10:12:48
Kapitola 10 – Bohatě vybavené datové ovládací prvky
428
straňovat a vylepšovat (viz následující obrázek 10-1).
Obrázek 10-1. Konfigurace sloupců ve Visual Studiu. I když jste se už seznámili s podpůrnými konstrukcemi GridView, stále jste na začátku dlouhého seznamu jeho schopností vyšší úrovně. V následujících oddílech se budeme zabývat těmito tématy:
• • • •
Formátování. Jak naformátovat řádky a hodnoty dat.
•
Šablony. Jak plně dostat pod kontrolu vzhled, formátování a editaci tím, že si nadefinujete šablony.
Výběr. Jak umožnit uživateli vybrat řádek v GridView, a jak na to reagovat. Řazení. Jak dynamicky změnit uspořádání GridView (jakožto reakci na kliknutí v záhlaví sloupce). Stránkování. Jak rozdělit rozsáhlou sadu výsledků na několik stránek dat, ať už automaticky, nebo pomocí vlastního kódu pro stránkování.
Formátování a GridView Formátování se skládá z několika vzájemně provázaných úloh. Nejprve musíte zajistit, aby se řádně prezentovaly hodnoty vyjadřující datum, peněžní částky a jiné číselné hodnoty. To zařídíte pomocí vlastnosti DataFormatString. Pak budete chtít aplikovat na každý aspekt mřížky, počínaje záhlavím a konče hodnotami dat, perfektní směs voleb pro barvy, písmo, orámování a zarovnání. GridView tyto funkce podporuje prostřednictvím stylů. A nakonec můžete zachycovat události, prozkoumávat data řádků, a aplikovat formátování na konkrétní data programátorsky. V příštích oddílech se podíváme na všechny tyto techniky. Prvek GridView sám vystavuje několik formátovacích vlastností, které samy sebe dostatečně vysvětlují svými názvy, a proto se zde jimi nezabýváme. Patří mezi ně vlastnost GridLines (přidání, nebo skrytí orámování tabulky), CellPadding a CellSpacing (rozestupy mezi buňkami), Caption a CaptionAlign (vztahují se k titulku celé mřížky).
Kapitola 10.indd 428
15.9.2008 10:12:48
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
429
TIP
Chcete vytvořit GridView, který by roloval uvnitř webové stránky? Jde to velmi snadno. Jednoduše umístěte GridView do ovládacího prvku Panel, nastavte vhodnou velikost panelu a vlastnost Panel.Scrollbars na hodnotu Auto, Vertical, nebo Both.
Formátování sloupců vázaných na data Každý sloupec typu BoundField poskytuje vlastnost DataFormatString. S ní můžete nakonfigurovat vzhled hodnot vyjadřujících čísla nebo datum, a to pomocí formátovacího řetězce. Formátovací řetězce se obvykle skládají ze zástupných symbolů a indikátorů, které jsou uvnitř složených závorek. Typický formátovací řetězec vypadá takto: {0:C}
Nula reprezentuje hodnotu, která se bude formátovat, písmeno vyjadřuje předdefinovaný formátovací styl. C zde znamená formát měny (z anglického slova Currency) a slouží k naformátování čísla jako částky se symbolem měny (podle místního nastavení), takže číslo 3400.34 se v USA zobrazí ve tvaru $3,400.34. Počítač, který je nakonfigurován pro jiné místní nastavení, může zobrazit částku v jiném formátu a s jiným symbolem měny. U nás bude mít tato částka vzhled 3 400,34 Kč. Podívejte se na sloupec, ve kterém se používá uvedený formátovací řetězec: <asp:BoundField DataField="UnitPrice" HeaderText="Price" DataFormatString="{0:C}" />
Chcete-li použít jiný formát měny, můžete změnit lokalizační nastavení webového serveru (v sekci Místní a jazyková nastavení (Regional and Language Options) ovládacích panelů (Control Panel)). Nebo můžete v kódu pro vaši webovou aplikaci nastavit jinou kulturu, nebo použít prvek <globalization> v souboru web.config (obě techniky se předvádějí v kapitole 18). POZNÁMKA Potřebujete-li ve své aplikaci zobrazovat řetězce různých měn, zabudované formátování vám stačit nebude, takže to budete muset vyřešit nějak po svém. Typickou strategií je vytvořit strukturu Money, která bude obalovat peněžní částky a kulturu. Pak můžete překrýt Money.ToString() a vrátit takovou řetězcovou reprezentaci, jakou právě potřebujete.
Některé další volby pro číselné hodnoty jsou uvedeny v tabulce 10-3. Tabulka 10-3. Formátovací řetězce pro čísla. Typ
Formátovací řetězec
Ukázka
Peněžní částky
{0:C}
V USA $1,234.50, u nás 1 234,50 Kč. Záporná čísla jsou v USA v závorkách ($1,234.50), u nás se uvádí -1 234,50 Kč.
Vědecký (exponenciální)
{0:E}
1,234500E+003 (u nás).
Procenta
{0:P}
45.6%
Kapitola 10.indd 429
15.9.2008 10:12:48
430
Kapitola 10 – Bohatě vybavené datové ovládací prvky
Typ
Formátovací řetězec
Ukázka
Pevný počet desetinných míst
{0:F?}
Záleží na tom, kolik desetinných míst uvedete. {0:F3} vede na 123.400, {0:F0} pak na 123.
Další příklady naleznete v nápovědě Visual Studia. Pro hodnoty vyjadřující datum nebo čas je rovněž k dispozici rozsáhlý seznam voleb. Pokud například chcete zobrazit hodnotu BirthDate (datum narození) ve tvaru měsíc/den/rok (tzn. ve tvaru 12/30/05), mohli byste použít tento sloupec: <asp:BoundField DataField="BirthDate" HeaderText="Birth Date" DataFormatString="{0:MM/dd/yy}" />
Další ukázky jsou uvedeny v tabulce 10-4. Tabulka 10-4. Formátovací řetězce pro datum a čas. Typ
Formátovací řetězec
Ukázka
Krátké datum
{0:d}
M/d/yyyy (například v USA 10/30/2005, u nás 30.10.2005).
Dlouhé datum
{0:D}
dddd, MMMM dd, yyyy (například v USA Sunday, January 30, 2005, u nás neděle 30. leden 2005).
Dlouhé datum a krátký čas
{0:f }
dddd, MMMM dd, yyyy HH:mm aa (například: Sunday, January 30, 2005 10:00 AM).
Dlouhé datum a dlouhý čas
{0:F}
dddd, MMMM dd, yyyy HH:mm:ss aa (například: Monday, January 30, 2005 10:00:23 AM).
Standard ISO, podle kterého lze řadit
{0:s}
yyyy-MM-dd HH:mm:ss (například: 2005-01-30 10:00:23).
Měsíc a den
{0:M}
MMMM dd (například v USA January 30, u nás 30. leden).
Všeobecný formát (General)
{0:G}
M/d/yyyy HH:mm:ss aa (závisí na místních nastaveních) (například: 10/30/2002 10:00:23 AM).
Znaky pro formátovací řetězce nejsou specifické pro GridView. Můžete je také používat u jiných ovládacích prvků, ve výrazech vázání dat v šablonách (to uvidíte později v této kapitole), a také jako parametry mnoha různých metod. Například typy Decimal a DateTime vystavují své vlastní metody ToString(), které přebírají formátovací řetězec, takže můžete hodnoty formátovat ručně.
Styly GridView vystavuje bohatý formátovací model založený na stylech. Celkem můžete pro GridView nastavit
osm stylů, které se podrobněji popisují v tabulce 10-5. Tabulka 10-5. Styly GridView. Styl
Popis
HeaderStyle
Konfiguruje vzhled řádku záhlaví, který obsahuje nadpisy sloupců, pokud jste se rozhodli je zobrazovat (ShowHeader má hodnotu true).
Kapitola 10.indd 430
15.9.2008 10:12:49
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
431
Styl
Popis
RowStyle
Konfiguruje vzhled jednotlivých řádků.
AlternatingRowStyle
Pokud je tento styl nastaven, na každý druhý řádek se aplikuje dodatečné formátování. Toto formátování funguje jako dodatek ke stylu RowStyle. Pokud například nastavíte pomocí RowStyle nějaké písmo, použije se rovněž na každý druhý řádek, pokud explicitně nenastavíte prostřednictvím AlternatingRowStyle nějaké jiné písmo.
SelectedRowStyle
Konfiguruje vzhled aktuálně vybraného řádku. Funguje jako dodatek k formátování s RowStyle.
EditRowStyle
Konfiguruje vzhled řádku, který se nachází v režimu editace. Funguje jako dodatek k formátování s RowStyle.
EmptyDataRowStyle
Konfiguruje styl, který se použije pro jediný prázdný řádek v tom speciálním případě, kdy vázáný datový objekt neobsahuje žádné řádky.
FooterStyle
Konfiguruje vzhled řádku zápatí u spodní strany GridView, pokud jste se rozhodli je zobrazovat (ShowFooter má hodnotu true).
PagerStyle
Konfiguruje vzhled řádku s odkazy na další stránky, pokud máte zapnuto stránkování (AllowPaging je nastavena na true).
Popisované styly nejsou vlastnostmi s jedinou hodnotou. Každý styl vystavuje objekt Style, který obsahuje vlastnosti pro volbu barev (ForeColor a BackColor), orámování (BorderColor, BorderStyle a BorderWidth), rozměry řádku (Height a Width), zarovnání řádku (HorizontalAlign a VerticalAlign), a pro konfiguraci vzhledu textu (Font a Wrap). Tyto vlastnosti stylů umožňují upravit téměř každý aspekt vzhledu daného prvku. A pokud nechcete všechna nastavení týkající se vzhledu natvrdo nastavovat ve webové stránce, můžete nastavit vlastnost CssClass objektu stylu na nějakou CSS třídu, která je definována v propojeném stylovém předpisu (linked stylesheet, o stylech se více dozvíte v kapitole 16).
Definice stylů Když se nastavují vlastnosti stylu, používají se dvě různé syntaxe (obě uvidíte v této kapitole). První je syntaxe s pomlčkou (anglicky se jí říká object-walker syntax), která vyjadřuje vlastnosti a podvlastnost ve formě atributů otevírající značky GridView. Ukázka: <asp:GridView runat="server" ID="grid" RowStyle-ForeColor="DarkBlue" ... />
Alternativní syntaxe je založena na vnořených značkách, jako zde: <asp:GridView runat="server" ID="grid" ...> <RowStyle ForeColor="DarkBlue" ... /> ... </asp:GridView>
Oba přístupy jsou ekvivalentní. Při nastavování vlastností stylu ovšem musíte učinit ještě jedno rozhodnutí. Můžete totiž specifikovat globální vlastnosti stylu, které ovlivňují všechny sloupce mřížky (jako v předchozích ukázkách), nebo definovat styly, jež budou specifické pro jednotlivé sloupce. Chcete-li vytvořit styl specifický
Kapitola 10.indd 431
15.9.2008 10:12:49
Kapitola 10 – Bohatě vybavené datové ovládací prvky
432
pro daný sloupec, musíte přidat atributy stylu (nebo vnořené značky) dovnitř značky patřičného sloupce, jehož vzhled chcete upravit, jak to vidíte zde: <asp:GridView runat="server" ID="grid" ...> <Columns> <asp:BoundField DataField="EmployeeID" HeaderText="ID" ItemStyle-Width="30px"/> ... </Columns> </asp:GridView>
A takto vypadá ekvivalentní kód s vnořenou značkou: <asp:GridView runat="server" ID="grid" ...> <Columns> <asp:BoundField DataField="EmployeeID" HeaderText="ID"> <ItemStyle Width="30px" /> </asp:BoundField> ... </Columns> </asp:GridView>
Tato technika se používá hlavně tehdy, když potřebujete definovat konkrétní šířky sloupců. Pokud je neurčíte, ASP.NET udělá sloupce právě tak široké, aby se do nich vešla data, která obsahují (resp. pokud je zapnuté zalamování, aby se do nich vešel text, aniž aby se muselo rozdělit slovo na konci řádku). Jestliže jsou hodnoty v daném sloupci různě široké, šířka se určí podle nejdelší hodnoty, nebo podle délky záhlaví (rozhoduje, co je delší). Ale i když má mřížka sloupce dostatečně široké, možná byste rádi některý sloupec rozšířili ještě více, aby nevypadal přeplněný vzhledem ke stavu sousedních sloupců. V takovém případě budete muset explicitně specifikovat větší šířku. Podívejte se na kompletně naformátovanou značku GridView: <asp:GridView ID="GridView1" runat="server" DataSourceID="sourceEmployees" Font-Names="Verdana" Font-Size="X-Small" ForeColor="#333333" CellPadding="4" GridLines="None" AutoGenerateColumns="False"> <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> <RowStyle BackColor="#FFFBD6" ForeColor="#333333" /> <AlternatingRowStyle BackColor="White" /> <Columns> <asp:BoundField DataField="EmployeeID" HeaderText="ID"> <ItemStyle Font-Bold="True" BorderWidth="1" /> </asp:BoundField> <asp:BoundField DataField="FirstName" HeaderText="First Name" /> <asp:BoundField DataField="LastName" HeaderText="Last Name" /> <asp:BoundField DataField="City" HeaderText="City"> <ItemStyle BackColor="LightSteelBlue" /> </asp:BoundField> <asp:BoundField DataField="Country" HeaderText="Country"> <ItemStyle BackColor="LightSteelBlue" />
Kapitola 10.indd 432
15.9.2008 10:12:49
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
433
</asp:BoundField> <asp:BoundField DataField="BirthDate" HeaderText="Birth Date" DataFormatString="{0:MM/dd/yyyy}" /> <asp:BoundField DataField="Notes" HeaderText="Notes"> <ItemStyle Wrap="True" Width="400"/> </asp:BoundField> </Columns> </asp:GridView>
V tomto příkladu se pomocí několika vlastností GridView nastavuje písmo, upravuje rozestup buněk a orámování buněk. Pomocí stylů se tučně zvýrazní záhlaví a zařídí se, aby se střídala barva pozadí lichých a sudých řádků. Styly specifické pro sloupec jsou použity pro zvýraznění informací o sídle (City a Country) pomocí jiné barvy pozadí, pro nastavení hodnot ID na tučný řez, a pro explicitní nastavení šířky sloupce Notes. Na závěr se prostřednictvím DataFormatString naformátují všechny hodnoty obsahující datum narození (sloupec BirthDate). Konečný výsledek (v místních nastaveních pro USA) vidíte na obrázku 10-2.
Obrázek 10-2. Naformátovaný GridView.
Konfigurace stylů ve Visual Studiu Není vůbec nutné kódovat vlastnosti stylu ovládacího prvku GridView ručně v jeho značce, protože má bohatě vybavenou podporu pro dobu návrhu. Vlastnosti stylu se dají upravovat v okně Properties. Pokud například chcete nakonfigurovat písmo pro záhlaví, rozbalte vlastnost HeaderStyle, kde uvidíte vnořenou vlastnost Font. Nastavte ji, jak potřebujete. Jediným omezením tohoto přístupu je, že se nedají nastavovat styly pro jednotlivé sloupce – pokud něco takového potřebujete, musíte nejprve otevřít dialog Fields (který jste viděli na obrázku 10-1), a v něm editovat vlastnost Columns. Pak můžete vybrat patřičný sloupec a nastavit jeho vlastnosti podle svých představ.
Kapitola 10.indd 433
15.9.2008 10:12:49
753
KAPITOLA 17 Navigace po webu Navigace je fundamentální komponentou jakéhokoliv webu. Přestože je dost snadné přenést uživatele z jedné stránky na jinou, vytvořit unifikovaný navigační systém, který bude dobře fungovat po celém vašem webu, už zabere trochu práce. Ačkoliv vlastní navigační systém s několika odkazy si můžete vyrobit i sami, nepochybně brzy zjistíte, že to půjde mnohem rychleji, když využijete zabudovaný navigační systém ASP.NET. V této kapitole se budete zabývat třemi klíčovými tématy:
•
Ovládací prvky MultiView a Wizard. Umožňují zhustit několik kroků do jediné stránky. S nimi se dá zkombinovat několik pracovních stránek na jediné místo, čímž se navigace zjednodušuje.
•
Plán, neboli mapa webu (site map). Umožňuje definovat navigační strukturu webu a přímo ji svázat s bohatě vybavenými ovládacími prvky. Dozvíte se také, jak se dá tento pracovní rámec rozšířit, aby podporoval různé typy ovládacích prvků a různá umístění úložišť pro plán webu.
•
Bohatě vybavené navigační ovládací prvky. Patří mezi ně TreeView a Menu. Přestože navigace není jediným účelem těchto ovládacích prvků, hodí se pro potřeby navigace přímo ideálně. V této kapitole se dozvíte o široké škále jejich funkcí.
Pomocí výše zmíněných ovládacích prvků, plánu webu a vzorů stránek dokážete vybudovat kompletní navigační systém s minimálním úsilím. A nejlepší na tom je, že ASP.NET jasně odděluje data (informace o struktuře webu) od jejich implementace (navigační ovládací prvky). To znamená, že můžete změnit uspořádání webových stránek, nahrazovat je jinými nebo je přejmenovávat, aniž byste web nějak poškodili nebo museli upravovat nějaký kód. Nebudete muset udělat nic víc, než provést potřebné změny v souboru plánu webu vaší aplikace.
Stránky s více zobrazeními V mnohých webech se složitější úkoly člení do několika stránek. Pokud například chcete do internetového obchodu přidat položku do nákupního vozíku a dojet k pokladně, musíte přeskočit z jedné stránky na jinou. Je to nejčistší přístup, který se také snadno programuje – za předpokladu, že přenášíte informace z jedné stránky na jinou pomocí vhodné techniky správy stavu (dotazovacími řetězci počínaje a stavem relace konče). V jiných situacích chcete vložit do jediné stránky kód pro několik jiných stránek. Například byste rádi poskytli výběr jedné z několika variant vztahujících se k zobrazení stejných dat (jako třeba tabulku založenou
Kapitola 17.indd 753
15.9.2008 10:16:33
754
Kapitola 17 – Navigace po webu
na mřížce, nebo graf) a umožnili uživateli se přepínat z jednoho zobrazení do jiného, aniž by musel opustit aktuální stránku. Nebo byste chtěli zpracovat úlohu složenou z několika kroků (klasickým příkladem jsou informace získávané od uživatele při jeho registraci), aniž byste se museli starat o to, jak přenášet relevantní informace mezi jednotlivými webovými stránkami. TIP Z hlediska uživatele asi není velký rozdíl v tom, zdali použijete několik samostatných stránek nebo jedinou stránku s několika zobrazeními. Ve webu, který je dobře navržen, uživatel zaznamená jediný rozdíl – při přístupu přes více zobrazení se nezmění URL adresa v prohlížeči. Primární rozdíl je v modelu kódu. Pokud použijete přístup přes více stránek, získáte dokonalejší separaci, ovšem budete mít více práce s tím, jak mají jednotlivé stránky spolu komunikovat (tedy určit způsob, jakým budou stránky sdílet nebo přenášet informace). U přístupu přes několik zobrazení na jediné stránce sice o tuto separaci přijdete, ale snadněji se vám bude psát kód, který je složen z malých, nedělitelných úloh.
V ASP.NET 1.x se dala stránka s více zobrazeními vytvořit pouze tak, že se na ni přidalo několik ovládacích prvků Panel. Každý panel reprezentoval jedno zobrazení (resp. jeden krok). Pak jste mohli nastavovat vlastnost Visible jednotlivých panelů, aby v daném okamžiku byl viditelný jenom jeden z nich. Nevýhodou tohoto přístupu je, že stránka se trochu komplikuje, protože se musí psát kód navíc pro správu jednotlivých panelů. A kromě toho – není to zrovna moc robustní přístup, protože drobná chyba může způsobit, že na stránce se zobrazí dva panely současně. Dnes už naštěstí nemusíte navrhovat vlastní systém několika zobrazení úplně od počátku. Můžete využít jeden ze dvou ovládacích prvků vyšší úrovně, které návrh tohoto druhu značně usnadňují – jsou to prvky MultiView a Wizard.
Ovládací prvek MultiView MultiView je ze dvou ovládacích prvků pro systém více zobrazení tím jednodušším. MultiView v podstatě dává možnost deklarovat několik zobrazení a v daném okamžiku zobrazit pouze jediné. Nemá žádné výchozí uživatelské rozhraní – získáte pouze HTML kód a ovládací prvky, které mu dodáte. MultiView je ekvivalentní přístupu přes vlastní panely, který jsme vysvětlili výše. MultiView se vytvoří docela snadno. Do vašeho souboru .aspx přidejte značku <asp:MultiView>, a pak jednu značku <asp:View> pro každé samostatné zobrazení. <asp:MultiView ID="MultiView1" runat="server"> <asp:View ID="View1" runat="server">...</asp:View> <asp:View ID="View2" runat="server">...</asp:View> <asp:View ID="View3" runat="server">...</asp:View> </asp:MultiView>
Dovnitř značek <asp:View> následně vložte HTML kód a webové ovládací prvky, které budou tvořit dané zobrazení. <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0"> <asp:View ID="View1" runat="server"> <b>Showing View #1<br /> <br /> <asp:Image ID="Image1" runat="server" ImageUrl="~/cookies.jpg" /></b> </asp:View>
Kapitola 17.indd 754
15.9.2008 10:16:37
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
755
<asp:View ID="View2" runat="server"> <b>Showing View #2</b><br /> <br /> Text content. </asp:View> <asp:View ID="View3" runat="server"> <b>Showing View #3</b><br /> <br /> <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar> </asp:View> </asp:MultiView>
TIP Zobrazení se rovněž dají přidávat programátorsky (stejně jako jakýkoliv jiný ovládací prvek) tím, že vytvoříte instanci nového objektu zobrazení a přidáte ji do MultiView metodou Add() nebo AddAt() kolekce Views.
Visual Studio ukáže všechna zobrazení už v době návrhu – pěkně jedno po druhém (viz obrázek 17-1). Jednotlivé regiony můžete editovat úplně stejně, jako byste editovali jakoukoliv jinou část stránky.
Obrázek 17-1. Několik zobrazení v době návrhu.
Kapitola 17.indd 755
15.9.2008 10:16:38
756
Kapitola 17 – Navigace po webu
POZNÁMKA Podobného efektu jako s MultiView docílíte i s ovládacím prvkem Accordion (harmonika), který je součástí ASP.NET AJAX Control Toolkit. Ovládací prvek Accordion umožňuje vytvořit skupinu panelů, které lze sbalovat a rozbalovat. Funguje to tak, že uživatel klikne na záhlaví nějakého panelu, který se následně rozbalí, přičemž všechny ostatní panely se pak automaticky zavřou (sbalí). Accordion má ovšem dramaticky odlišné vnitřnosti než prvek MultiView, protože většinu své práce vykonává na straně klienta. O tomto prvku se dozvíte více v kapitole 32.
To, co se konkrétně zobrazí, určuje MultiView.ActiveViewIndex. Je to jediné zobrazení, které je ve stránce realizováno. Výchozí hodnota ActiveIndex je -1, což znamená, že se žádné zobrazení neukáže. Je možné to udělat třeba tak, že necháte uživatele, aby si vybral zobrazení z nějakého seznamu, který obsahuje všechna dostupná zobrazení. Podívejte se na úsek kódu, který sváže všechna zobrazení s ovládacím prvkem seznamu: protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { DropDownList1.DataSource = MultiView1.Views; DropDownList1.DataTextField = "ID"; DropDownList1.DataBind(); } }
A tady máte kód, který nastaví aktuální zobrazení podle toho, co uživatel vybere (na základě indexu vybrané položky seznamu): protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { MultiView1.ActiveViewIndex = DropDownList1.SelectedIndex; }
Výsledek vidíte na obrázku 17-2.
Obrázek 17-2. Přepínání zobrazení pomocí ovládacího prvku pro seznam. Pokud chcete dát zobrazením nějaké výstižnější názvy, naplňte jednoduše celý seznam ručně. Jenom dejte pozor, aby souhlasilo pořadí názvů s pořadím zobrazení. Uvedený kód se vlastně vůbec nemusí psát, protože MultiView obsahuje několik inteligentních značek. Podobně jako některé bohatě vybavené datové ovládací prvky, rozpoznává i MultiView konkrétní názvy pří-
Kapitola 17.indd 756
15.9.2008 10:16:38
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
757
kazů v ovládacích prvcích tlačítek. (Ovládacím prvkem tlačítka se rozumí jakýkoliv ovládací prvek, který implementuje rozhraní IButtonControl, takže mezi ně patří Button, ImageButton a LinkButton.) Přidáte-li do zobrazení takový ovládací prvek tlačítka, který bude používat dohodnuté názvy příkazů, bude mít tlačítko jistou automatickou funkcionalitu. Všechny dohodnuté názvy příkazů jsou vypsány v tabulce 17-1. Každý název příkazu má také odpovídající statický člen ve třídě MultiView, takže se velmi snadno dostanete ke správnému příkazu, pokud ho budete chtít nastavit programátorsky. Tabulka17-1. Dohodnuté názvy příkazů pro MultiView. Název příkazu
Člen ve třídě MultiView
Popis
PrevView
PrevViewCommandName
Přejde na předchozí zobrazení.
NextView
NextViewCommandName
Přejde na následující zobrazení.
SwitchViewByID
SwitchViewByIDCommandName
Přejde na zobrazení s konkrétním ID (řetězec s názvem). ID se vezme z vlastnosti CommandArgument ovládacího prvku tlačítka.
SwitchViewByIndex
SwitchViewByIndexCommandName
Přejde na zobrazení s konkrétním číselným indexem. Index se vezme z vlastnosti CommandArgument ovládacího prvku tlačítka.
Pokud si to chcete vyzkoušet, přidejte do prvních dvou zobrazení následující tlačítko (nezapomeňte na to, aby tlačítka měla různý identifikátor, ID): <asp:Button ID="cmdNext" runat="server" Text="Next >" CommandName="NextView" />
Pak přidejte do druhého a třetího zobrazení toto tlačítko: <asp:Button ID="cmdPrev" runat="server" Text="< Prev" CommandName="PrevView" />
A nakonec zajistěte, aby se v rozvíracím seznamu zobrazil správný název zobrazení, když budete pracovat s tlačítky. Tohle zařídíte v obsluze události MultiView.ActiveViewIndexChanged: protected void MultiView1_ActiveViewChanged(object sender, EventArgs e) { DropDownList1.SelectedIndex = MultiView1.ActiveViewIndex; }
VÝKON STRÁNEK MULTIVIEW Nejdůležitější věcí, kterou musíte vědět o MultiView, je to, že na rozdíl od bohatě vybavených datových ovládacích prvků (GridView, FormsView atd.), MultiView není kontejner, jenž by pojmenovával prvky, které v sobě obsahuje. To znamená, že přidáte-li do jednoho zobrazení ovládací prvek s názvem textBox1, nemůžete už do jiného zobrazení přidat jiný ovládací prvek se stejným názvem. A skutečně – v termínech modelu stránky není žádný opravdový rozdíl mezi ovládacími prvky, které přidáte do zobrazení, a ovládacími prvky ve zbytku stránky. V obou případech budou ovládací prvky, které vytvoříte, přístupné přes členské proměnné ve vaší třídě stránky.
Kapitola 17.indd 757
15.9.2008 10:16:38
758
Kapitola 17 – Navigace po webu
... pokračování z předchozí stránky. To znamená, že ve druhém zobrazení je možné snadno nakonfigurovat ovládací prvek poté, co byla v prvním zobrazení vyvolána nějaká událost nějakého ovládacího prvku. Důsledkem je, že stránky, které vytváříte s MultiView, mají tendenci se chovat jako normální stránky. Je tomu tak proto, že celý model ovládacích prvků (včetně všech ovládacích prvků ze všech zobrazení) se vytváří při každém odeslání stránky na server a přetrvává ve stavu zobrazení. Většinou to nebude představovat nějaký významný faktor, pokud programátorsky nemanipulujete s velkým počtem ovládacích prvků (v takovém případě by asi bylo vhodné vypnout u těchto ovládacích prvků EnableViewState), nebo pokud nepoužíváte několik zdrojů dat. Pokud například máte tři zobrazení a každé z nich má jiný ovládací prvek zdroje dat, tak pokaždé, když se stránka odešle na server, provedou své dotazy všechny tři ovládací prvky zdrojů dat, což znamená, že všechna zobrazení se svážou (včetně těch, co nejsou na stránce viditelná). Abyste se vyvarovali této zbytečné zátěže, můžete využít techniky, které jsme popsali v kapitole 9 – například můžete ponechat ovládací prvky nesvázané, takže v případě potřeby je svážete programátorsky, nebo zrušíte proces vázání u těch zobrazení, jež nejsou aktuálně viditelná. Samozřejmě – nikde není řečeno, že každý MultiView musí používat vázání dat. Perfektním scénářem pro MultiView je nějaký dlouhý sled vstupních ovládacích prvků – například nějaký formulář, který je použit pro průzkum veřejného mínění, jenž je rozdělen do několika zobrazení, aby se uživatel nemusel po formuláři posouvat nahoru a dolů. Zde funguje MultiView uspokojivě, protože nakonec, až vyplňování skončí, snadno přečtete všechna data ze všech ovládacích prvků ze všech zobrazení.
Nyní můžete přecházet z jednoho zobrazení do jiného pomocí tlačítek (viz obrázek 17-3).
Obrázek 17-3. Přepínání zobrazení pomocí dohodnutých názvů příkazů.
Ovládací prvek Wizard Ovládací prvek Wizard (průvodce) je atraktivnější varianta ovládacího prvku MultiView. Kromě toho, že rovněž podporuje zobrazení vždy jediného panelu z několika, obsahuje i velké množství zabudovaného (a přizpůsobitelného) chování, včetně navigačních tlačítek, stylů, šablon, či pruhu s odkazy na kroky průvodce. Průvodci obvykle reprezentují jedinou úlohu, ve které uživatel postupně přechází z jednoho kroku na druhý: například z aktuálního kroku přejde na krok bezprostředně následující (nebo na krok bezprostředně předcházející, pokud chce opravit nějaký údaj). Ovládací prvek Wizard ASP.NET dále podporuje nelineární navigaci, čímž se zde myslí to, že se můžete rozhodnout ignorovat krok, který je založen na informacích dodaných koncovým uživatelem.
Kapitola 17.indd 758
15.9.2008 10:16:38
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
759
Ovládací prvek Wizard standardně zobrazuje navigační tlačítka a svislý pruh vlevo s odkazy na jednotlivé kroky. Pruh s těmito odkazy můžete skrýt, nastavíte-li vlastnost Wizard.DisplaySideBar na false. Obvykle se to dělá tehdy, když chcete striktně vynutit, aby uživatel postupoval průvodcem postupně (neskákal v něm sem a tam, jak se mu zachce). Obsah jednotlivých kroků dodáváte prostřednictvím libovolných ovládacích prvků HTML nebo ASP.NET. Na obrázku 17-4 vidíte ukázku regionu, v němž můžete do instance průvodce, který obsahuje nějaký předem připravený obsah, přidávat váš vlastní obsah.
Obrázek 17-4. Region pro vložení obsahu konkrétního kroku.
Kroky průvodce Chcete-li v ASP.NET vytvořit průvodce, jednoduše specifikujte jednotlivé kroky a jejich obsah značkami <asp:WizardStep>. Každý krok přebírá nějaké základní informace, které jsou vypsány v tabulce 17-2. Tabulka 17-2. Vlastnosti třídy WizardStep. Vlastnost
Popis
Title
Popisný název kroku. Tento název se používá ve svislém pruhu odkazů vlevo.
StepType
Typ kroku jako hodnota výčtu WizardStepType. Hodnota určuje typ navigačních tlačítek, která se v daném kroku zobrazí. Možnosti jsou Start (zobrazí tlačítko Next), Step (zobrazí tlačítka Next a Previous), Finish (zobrazí tlačítka Finish a Previous), Complete (nezobrazí žádné tlačítko a skryje pruh odkazů, pokud byl zapnutý) a Auto (typ kroku se odvodí z pozice v kolekci). Výchozí je Auto, což znamená, že první krok je Start, poslední krok je Finish, a všechny ostatní kroky mezi nimi jsou Step.
AllowReturn
Vyjadřuje, zdali se bude uživatel moci vrátit do daného kroku. Jinak řečeno – pokud je false, uživatel se nebude moci vrátit k předchozímu kroku. Odkaz v levém sloupci pro předchozí krok nebude mít pro tento krok žádný efekt a tlačítko Previous v následujícím kroku buď takový nevratný krok přeskočí, nebo bude rovnou skryté (což závisí na hodnotě vlastnosti AllowReturn předchozích kroků).
Následující ukázka průvodce obsahuje čtyři kroky, které dohromady reprezentují jednoduchý dotazník. Na konci je krok s vlastností StepType nastavenou na hodnotu Complete, ve kterém se vypíše závěrečná zpráva. Navigační tlačítka a pruh odkazů vlevo se přidávají automaticky.
Kapitola 17.indd 759
15.9.2008 10:16:38
Kapitola 17 – Navigace po webu
760
<asp:Wizard ID="Wizard1" runat="server" Width="467px" BackColor="#EFF3FB" BorderColor="#B5C7DE" BorderWidth="1px"> <WizardSteps> <asp:WizardStep ID="WizardStep1" runat="server" Title="Personal"> <h3>Personal Profile</h3> Preferred Programming Language: <asp:DropDownList ID="lstLanguage" runat="server"> <asp:ListItem>C#</asp:ListItem> <asp:ListItem>VB</asp:ListItem> <asp:ListItem>J#</asp:ListItem> <asp:ListItem>Java</asp:ListItem> <asp:ListItem>C++</asp:ListItem> <asp:ListItem>C</asp:ListItem> </asp:DropDownList> <br /> </asp:WizardStep> <asp:WizardStep ID="WizardStep2" runat="server" Title="Company"> <h3>Company Profile</h3> Number of Employees: <asp:TextBox ID="txtEmpCount" runat="server"/> Number of Locations: <asp:TextBox ID="txtLocCount" runat="server"/> </asp:WizardStep> <asp:WizardStep ID="WizardStep3" runat="server" Title="Software"> <h3>Software Profile</h3> Licenses Required: <asp:CheckBoxList ID="lstTools" runat="server"> <asp:ListItem>Visual Studio 2008</asp:ListItem> <asp:ListItem>Office 2007</asp:ListItem> <asp:ListItem>Windows Server 2008</asp:ListItem> <asp:ListItem>SQL Server 2008</asp:ListItem> </asp:CheckBoxList> </asp:WizardStep> <asp:WizardStep ID="Complete" runat="server" Title="Complete" StepType="Complete"> <br /> Thank you for completing this survey.<br /> Your products will be delivered shortly.<br /> </asp:WizardStep> </WizardSteps> </asp:Wizard>
Jednotlivé kroky průvodce vidíte na obrázku 17-5.
Kapitola 17.indd 760
15.9.2008 10:16:39
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
761
Obrázek 17-5. Průvodce skládající se ze čtyř kroků. Na rozdíl od ovládacího prvku MultiView vidíte ve Visual Studiu na návrhové ploše webové stránky vždy pouze jediný krok. Krok, s jehož návrhem chcete právě pracovat, vybíráte z inteligentní značky, viz obrázek 17-6. Ale pozor – pokaždé, když to uděláte, Visual Studio změní hodnotu vlastnosti Wizard.ActiveStepIndex na krok, který jste právě vybrali. Před spuštěním aplikace tedy nezapomeňte nastavit hodnotu této vlastnosti zpět na 0, aby průvodce odstartoval prvním krokem.
Obrázek 17-6. Navrhování kroku průvodce.
Kapitola 17.indd 761
15.9.2008 10:16:39
Kapitola 17 – Navigace po webu
762
POZNÁMKA Zapamatujte si, že pokud přidáváte ovládací prvky do oddělených kroků průvodce, že u všech se vytvoří instance a že tyto prvky se uchovávají ve stavu zobrazení (view state), bez ohledu na to, který krok je právě aktuální. Potřebujete-li zeštíhlit nějakého složitého průvodce, rozdělte ho do několika samostatných stránek, ze stránky na stránku přecházejte metodou Server.Transfer(), a smiřte se s méně elegantním programovacím modelem.
Události průvodce Pokud to budete potřebovat, můžete vytvořit kód, kterým průvodce přimějete, aby reagoval na několik událostí, jež jsou podrobně vypsány v tabulce 17-3. Tabulka 17-3. Události ovládacího prvku Wizard. Událost
Popis
ActiveStepChanged
Nastane, když se ovládací prvek přepne do nového kroku (buď proto, že uživatel klikl na navigační tlačítko, nebo pokud jste v kódu programátorsky změnili vlastnost ActiveStepIndex).
CancelButtonClick
Nastane, když se klikne na tlačítko Cancel. Toto tlačítko se standardně nezobrazuje, nicméně je můžete přidat do každého kroku, nastavíte-li vlastnost Wizard. DisplayCancelButton. V průvodcích obvykle tlačítko s funkcí Cancel existuje. Pokud nepotřebujete vykonávat nějaký údržbový či úklidový kód, jednoduše nastavte vlastnost CancelDestinationPageUrl – pak se o přesměrování automaticky postará samotný průvodce.
FinishButtonClick
Nastane, když se klikne na tlačítko Finish.
NextButtonClick PreviousButtonClick
Nastane, když se v některém z kroků klikne na tlačítko Next, resp. Previous. Protože ovšem existuje více než jedna možnost, jak se dostat z jednoho kroku na další, je lepší zpracovávat událost ActiveStepChanged.
SideBarButtonClick
Nastane, když se klikne na tlačítko v postranní nabídce odkazů.
Existují v podstatě dva programovací modely průvodce.
•
Potvrzovat průběžně. To je rozumné, jestliže každý krok průvodce obaluje nedělitelnou (atomickou) nevratnou operaci. Pokud například máte do procesu zpracování objednávky zařazen krok pro autorizaci kreditní karty, za kterým následuje finální platba, nemůžete uživateli povolit, aby se vrátil zpět a upravil číslo kreditní karty. Tento model vytvoříte tak, že u některých (nebo u všech) kroků nastavíte vlastnost AllowReturn na false a změny budete potvrzovat v každém kroku jako reakci na událost ActiveStepChanged.
•
Potvrdit na konci. Tento model je rozumný tehdy, když se v jednotlivých krocích získávají informace pro operaci, kterou je možné vykonat až na konci celého průvodce. Pokud shromažďujete informace o uživateli a hodláte pro něj vytvořit nový uživatelský účet teprve tehdy, až získáte všechny požadované informace, pravděpodobně uživateli dovolíte, aby se mohl v průběhu práce s průvodcem vracet a opravovat to, co uvedl v předchozích krocích. Kód pro vygenerování nového účtu spustíte až tehdy, až průvodce skončí, jako reakci na událost FinishButtonClick.
Kapitola 17.indd 762
15.9.2008 10:16:39
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
763
Chcete-li pro aktuální příklad implementovat model "potvrdit na konci", stačí reagovat na událost FinishButtonClick. Podívejte se na ukázku, která vypíše shrnutí toho, co uživatel vybral v průvodci: protected void Wizard1_FinishButtonClick (object sender, WizardNavigationEventArgs e) { StringBuilder sb = new StringBuilder(); sb.Append("<b>You chose: <br />"); sb.Append("Programming Language: "); sb.Append(lstLanguage.Text); sb.Append("<br />Total Employees: "); sb.Append(txtEmpCount.Text); sb.Append("<br />Total Locations: "); sb.Append(txtLocCount.Text); sb.Append("<br />Licenses Required: "); foreach (ListItem item in lstTools.Items) { if (item.Selected) { sb.Append(item.Text); sb.Append(" "); } } sb.Append("</b>"); lblSummary.Text = sb.ToString(); }
Aby to celé fungovalo, musíte do posledního kroku přidat ovládací prvek Label s názvem lblSummary. V tomto příkladu se lblSummary umisťuje až ve finálním kroku, který zobrazuje shrnutí. TIP Pokud chcete zjistit, kudy uživatel chodil po průvodci, pomůže vám metoda Wizard.GetHistory(), která vrací kolekci objektů WizardStepBase, jež už byly zpřístupněny, a které jsou chronologicky uspořádány v opačném pořadí. To znamená, že první prvek v kolekci reprezentuje předchozí krok, druhý prvek reprezentuje krok před předchozím krokem atd.
Styly a šablony průvodce Největší předností ovládacího prvku Wizard je nepochybně to, jak umožňuje přizpůsobovat vzhled. To znamená, že pokud chcete používat základní model (tzn. proces složený z několika kroků s navigačními tlačítky a různými událostmi), nejste přikováni k výchozímu uživatelskému rozhraní. Máte k dispozici různé možnosti, které volíte podle toho, jak radikálně chcete průvodce změnit. U těch méně dramatických modifikací bude stačit nastavit pár vlastností nejvyšší úrovně. Můžete nastavovat barvu, písmo, rozestup či styl orámování (obdobně jako u jiných ovládacích prvků ASP.NET). Můžete také přizpůsobovat vzhled jednotlivých tlačítek. Pokud například chcete upravit tlačítko Next, můžete využít tyto vlastnosti: StepNextButtonType (použít tlačítko, odkaz, nebo obrázkový odkaz), StepNextButtonText (přizpůso-
Kapitola 17.indd 763
15.9.2008 10:16:39
764
Kapitola 17 – Navigace po webu
bit text tlačítka nebo odkazu), StepNextButtonImageUrl (nastavit obrázek pro odkaz ve formě obrázku) a StepNextButtonStyle (použít styl ze stylového předpisu). Prostřednictvím vlastnosti HeaderText můžete také přidat vlastní záhlaví. Větší kontroly nad průvodcem dosáhnete prostřednictvím stylů. S nimi můžete všelijak formátovat různé části průvodce. Styly používáte úplně stejně jako u bohatě vybavených datových ovládacích prvků, mezi něž patří GridView. Všechny styly, které můžete použít, jsou vypsány v tabulce 17-4. A podobně jako u jiných ovládacích prvků založených na stylech, i zde platí, že pokud jsou nastavení stylu konfliktní, konkrétnější nastavení stylu (jako je SideBarStyle) potlačí všeobecnější nastavení stylu (jako je ControlStyle). Například StartNextButtonStyle v prvním kroku potlačí nastavení NavigationButtonStyle. Tabulka 17-4. Styly ovládacího prvku Wizard. Styl
Popis
ControlStyle
Aplikuje se na všechny sekce ovládacího prvku Wizard.
HeaderStyle
Aplikuje se na sekci záhlaví ovládacího prvku Wizard, která je viditelná jen tehdy, přiřadíte-li text do vlastnosti HeaderText.
SideBarStyle
Aplikuje se na pruh odkazů ovládacího prvku Wizard.
SideBarButtonStyle
Aplikuje se jen na tlačítka v pruhu odkazů.
StepStyle
Aplikuje se na tu sekci ovládacího prvku, ve které definujete obsah daného kroku.
NavigationStyle
Aplikuje se na spodní oblast ovládacího prvku, kde se zobrazují navigační tlačítka.
NavigationButtonStyle
Aplikuje se jen na navigační tlačítka.
StartNextButtonStyle
Aplikuje se na tlačítko Next v prvním kroku (když je StepType nastavena na Start).
StepNextButtonStyle
Aplikuje se na tlačítko Next v průběžných krocích (když je StepType nastavena na Step).
StepPreviousButtonStyle
Aplikuje se na tlačítko Previous v průběžných krocích (když je StepType nastavena na Step).
FinishPreviousButtonStyle
Aplikuje se na tlačítko Previous v posledním kroku (když je StepType nastavena na Finish).
CancelButtonStyle
Aplikuje se na stornovací tlačítko, je-li vlastnost Wizard.DisplayCancelButton nastavena na true.
A konečně – pokud prostřednictvím vlastností a stylů nemůžete dosáhnout vámi požadované úrovně přizpůsobení, můžete ještě použít šablony, pomocí kterých můžete kompletně specifikovat vlastní vzhled ovládacího prvku Wizard. Při úpravách vzhledu prostřednictvím obyčejných technik dodáváte značkování pouze pro obsah kroku (jak jste to viděli na obrázku 17-1). Se šablonami můžete dodat značkování pro libovolný region průvodce, jako jsou záhlaví, pruh odkazů nebo tlačítka. Všechny šablony se deklarují odděleně od obsahu kroku. Na obrázku 17-7 vidíte místa, kde všude se dají specifikovat šablony.
Kapitola 17.indd 764
15.9.2008 10:16:39
1405
KAPITOLA 32 ASP.NET AJAX V předchozí kapitole jste vstoupili do světa programování na straně klienta. Naučili jste se několika základním technikám použití JavaScriptu a uvažovali jste nad tím, jak prostřednictvím technik Ajaxu vytvořit rychleji reagující stránky – a to buď sami, nebo prostřednictvím funkcionality zpětného volání klienta v ASP.NET. Tyto příklady demonstrovaly základy, ze kterých můžete vyjít při vytváření různě pokročilých stránek. Bohužel, programovací model obsahuje ještě spoustu věcí, které je možné zlepšovat. Pokud se výhradně spoléháte na JavaScript, je pouze na vás, abyste přemostili mezeru mezi serverovou abstrakcí ASP.NET a mnohem omezenějším HTML DOM. Není to jednoduché. Bez výhod IntelliSense Visual Studia a jeho ladicích nástrojů, je obtížné napsat bezchybný kód a diagnostikovat problémy. Vytvoření kódu, který bude fungovat ve všech moderních prohlížečích, rovněž představuje výzvu, protože zde rozhodně není nouze o menší výstřednosti a implementační odlišnosti napříč prohlížeči. Funkcionalita zpětného volání klienta ASP.NET tyto problémy částečně řeší tím, že vám poskytuje serverový model, s jehož pomocí můžete generovat potřebný kód, který je vykonáván na straně klienta (konkrétně se jedná o kód, jenž prostřednictvím objektu XMLHttpRequest vykoná asynchronní požadavek). Model zpětného volání klienta má ovšem do dokonalosti daleko. Rozhraní vypadá trochu neobratně, integrace do modelu stránky je trochu nešikovná, přičemž neexistuje ani typování dat. Je pouze na vás, abyste vymysleli způsob, jak serializovat informace, které potřebujete přenášet, do jediného řetězce. Sami také musíte vytvořit kód JavaScriptu, který obdrží zpětné volání, deserializuje řetězec a aktualizuje webovou stránku. Celkově vzato je funkcionalita zpětného volání klienta vynikajícím nástrojem pro vytvoření ovládacích prvků podporujících Ajax, ale už méně zajímavým způsobem, jak navrhovat kompletní webové stránky. Programátoři ASP.NET mají jinou možnost. Mohou totiž používat sadu nástrojů ASP.NET AJAX, které poskytují několik funkcionalit, jež vám mohou pomoci s vytvářením ajaxových stránek. V této kapitole podrobně prozkoumáte ASP.NET AJAX a naučíte se, jak jej používat k vytvoření nové generace interaktivních dynamických webových stránek.
Úvod do ASP.NET AJAX ASP.NET AJAX se skládá ze dvou klíčových částí – z části na straně klienta a z části na straně serveru. Klientská část je sada knihoven JavaScriptu. Tyto knihovny nejsou žádným způsobem spojeny s ASP.NET. V praxi to znamená, že na webových stránkách je mohou používat i programátoři jiných jazyků než ASP.NET. Kli-
Kapitola 32.indd 1405
15.9.2008 10:18:27
Kapitola 32 – ASP.NET AJAX
1406
entské knihovny toho nenabízí příliš mnoho, alespoň co se týče funkcionality (nejsou zde například žádné předem vytvořené kousky funkcionalit, které byste mohli jednoduše umístit na vaše webové stránky). Místo toho vytvářejí základ, který je nezbytný pro vývoj stránek prostřednictvím ASP.NET AJAX. Tento základ nejenom rozšiřuje jazyk JavaScriptu, aby vyplnil několik jeho mezer (například přidává podporu dědičnosti), ale také poskytuje určitou základní infrastrukturu (například metody pro správu doby života komponent, manipulaci s běžnými datovými typy, provádění reflexe atd.). Serverová část ASP.NET AJAX funguje na vyšší úrovni. Obsahuje ovládací prvky a komponenty, které používají klientské knihovny JavaScriptu. Webový formulář, který například obsahuje komponentu DragPanel (ze sady nástrojů ASP.NET AJAX), poskytuje uživatelům schopnost přetahovat panel v okně přihlížeče. Na pozadí běží vlastní kód JavaScriptu, který používá knihovny ASP.NET AJAX na straně klienta. Komponenta DragPanel ovšem veškerý potřebný kód JavaScriptu vytváří sama, díky čemuž jste ušetřeni problémů spojených s psaním kódu. ASP.NET AJAX je počátkem nového směru ve vývoji ASP.NET. Předtím, než se v této kapitole posunete dále, bude užitečné získat přehled o všech funkcích, které poskytuje, takže zde je jejich stručný přehled:
•
Rozšíření jazyka JavaScript. Tato rozšíření poněkud přibližují JavaScript k moderním, objektově orientovaným, programovacím jazykům s podporou jmenných prostorů, dědičnosti, rozhraní, výčtů a reflexe.
•
Vzdálené volání metod. Tato funkcionalita vám umožní získat informace ze serveru bez odeslání celé webové stránky zpět na server. Řeší stejný problém jako funkcionalita zpětného volání klienta, o níž jste se více dozvěděli v kapitole 31. Oproti ní ovšem umožňuje pracovat se silně typovými metodami místo plnění všech vašich dat do jediného řetězce.
•
Služby ASP.NET. Tato funkcionalita vám umožní zavolat server pro komunikaci s modelem ASP.NET. V současné době můžete pracovat se dvěma službami ASP.NET – službou, která používá informace formulářové autentizace a službou, jež získává data z aktuálního profilu uživatele.
•
Obnovení části stránky. Nový ovládací prvek UpdatePanel poskytuje způsob, jak specifikovat část stránky, kterou bude možné aktualizovat bez toho, aby bylo nutné posílat na server celou stránku. Ze všeho nejlepší je fakt, že pro řízení procesu aktualizace nemusíte psát žádný kód JavaScriptu.
•
Předem vytvořené ovládací prvky. Populární sada ovládacích prvků ASP.NET AJAX Control Toolkit obsahuje přes 30 ovládacích prvků, které používají rozšířenou funkcionalitu ASP.NET AJAX pro dosažení skvělých efektů. Najdete zde například ovládací prvky, které provedou sbalení a rozbalení, přidají dynamické animace, nebo jež podporují automatické dokončování a přetahování. Znovu připomínáme, že tyto ovládací prvky zajišťují všechny potřebné nízkoúrovňové detaily JavaScriptu.
V této kapitole prozkoumáte všechny tyto funkcionality.
PŘEMĚNA ATLASU NA ASP.NET AJAX Pokud pravidelně sledujete dění kolem ASP.NET AJAX, je možné, že jste kdysi pracovali s jednou jeho beta-verzí, která nesla označení Atlas. ASP.NET AJAX nahrazuje Atlas. Nejprve byl vydán jako samostatná komponenta, kterou šlo používat ve spojení s ASP.NET 2.0. Dnes je plně integrovanou součásti platformy ASP.NET 3.5. Ačkoliv ASP.NET AJAX obsahuje celou řadu nejdůležitějších funkcionalit původního Atlasu, několik funkcionalit bylo ponecháno bez povšimnutí. Jednou takovou (a současně nejvíce pozoruhodnou) funkcionalitou byl značkovací standard založený na XML , který byl označován jako klientský skript (client script).
Kapitola 32.indd 1406
15.9.2008 10:18:39
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
1407
... pokračování z předchozí stránky. Tento klientský skript poskytoval deklarativní způsob, jak ve stránce definovat ovládací prvky, které mohou být manipulovány prostřednictvím klientského kódu (podobně jako značky ovládacích prvků ASP.NET definují serverové objekty, s nimiž lze manipulovat prostřednictvím serverového kódu). Pokud jste například vytvořili stránku se dvěma serverovými ovládacími prvky TextBox a chtěli klientovi zpřístupnit text v těchto dvou textových polích, nadefinovali byste je v klientském bloku skriptu. Klientský blok skriptu dále poskytoval cestu k dalším funkcionalitám Atlasu, např. chování (což jsou deklarativní funkce jako automatické dokončování či zpracování událostí myši), vázání dat na straně klienta nebo animace. Další informace o Atlasu můžete najít v předchozím vydání této knihy (ASP.NET 2.0 a C# - tvorba dynamických stránek profesionálně, Zoner Press). Když se Atlas rozvinul do ASP.NET AJAX, opustil standard klientského skriptu společně se souvisejícími funkcionalitami (např. vázání dat), což je jistě škoda. Některé z těchto funkcionalit jsou ovšem dostupné ve vydání ASP.NET AJAX Futures. (Verze Futures poskytuje rozpracované technologie, které mohou být v budoucnu eventuálně integrovány do jádra platformy .NET.) Existují ovšem významné pochybnosti o tom, zdali bude klientský skript v budoucnosti znovu uveden. Přináší totiž nejenom nové komplikace, ale také se překrývá s jiným XML standardem – výkonnějším jazykem XAML, který používají aplikace Silverlightu (viz kapitola 33).
ASP.NET AJAX na klientovi – knihovny skriptů Klientská část ASP.NET AJAX se spoléhá na malou kolekci souborů JavaScriptu. Existují dva způsoby, jak rozmisťovat soubory skriptu ASP.NET AJAX. Pokud vytváříte nějakou aplikaci ASP.NET 3.5, jsou vždy umístěny v assembly System.Web.Extensions.dll a provedou se na požádání. Pokud nevytváříte aplikace v ASP.NET nebo pokud přidáváte funkcionalitu na straně klienta do běžné stránky HTML, můžete si stáhnout soubory JavaScriptu samostatně z webu ASP.NET AJAX (http://ajax.asp.net/downloads/default.aspx) jako část knihovny Microsoft AJAX Library. Pokud si stáhnete knihovnu Microsoft AJAX Library, zjistíte, že ASP.NET AJAX používá pouze tři základní soubory JavaScriptu – MicrosoftAjax.js, MicrosoftAjaxWebForms.js a MicrosoftAjaxTimer.js. Společně s těmito základními soubory se zde nachází více než 100 velmi malých souborů JavaScriptu, ve kterých jsou uloženy globalizační informace (například datové formáty). TIP Microsoft AJAX Library stojí za stažení i tehdy, pokud se chcete blíže podívat na skutečný kód JavaScriptu. Najdete zde nejenom ladicí verzi každého ze tří základních souborů, ale také jejich finální verze. Tyto produkční verze mají odstraněna všechna prázdná místa a komentáře, aby výsledné soubory mohly být co nejmenší. Pro porovnání: největším souborem je Microsoft.Ajax.js, jehož ladicí verze má 254 KB. Produkční verze má pouze 82 KB .
V ASP.NET nenaleznete jednotlivé soubory JavaScriptu pro klientské knihovny. Klientské knihovny jsou umístěny přímo v assembly System.Web.Extensions.dll, přičemž jsou poskytovány jako skriptový zdroj. Skriptový zdroj je podobný webovým zdrojům, o nichž jste se dozvěděli v kapitole 28. Skriptové zdroje vám (podobně jako webové zdroje) umožní mapovat URL na zdroj, který je umístěn v assembly. Zde je například ukázka bloku skriptu, který rozbalí knihovnu skriptů ASP.NET AJAX. <script src="/YourWebSite/ScriptResource.axd?d=RUSU1mIv69CJ9H5JUAOSw8L4674 LfxGOQg6Nw7HtNHheB3bMiw7Ov16bX1KPG6N1oTYEi65ggRoIP1hWapSttV3udoNXGrk095YGEzuX0M1&a mp;t=633127440334523405" type="text/javascript"> </script>
Kapitola 32.indd 1407
15.9.2008 10:18:39
Kapitola 32 – ASP.NET AJAX
1408
Pokud se podíváte do souboru web.config na nějakou aplikaci ASP.NET 3.5, určitě najdete mapování, které linkuje požadavek na ScriptResource.axd na třídu System.Web.Handlers.ScriptResourceHandler, jež je uložena v assembly System.Web.Extensions.dll. <handlers> ... <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler ..." /> </handlers>
Třída ScriptResourceHandler prozkoumá předaný argument dotazovacího řetězce a vrátí požadovaný soubor skriptu. Stručně řečeno – ScriptResourceHandler zpracuje skriptové zdroje stejným způsobem, jakým WebResourceHandler zpracuje webové zdroje.
ASP.NET AJAX na serveru – ScriptManager S velkou pravděpodobností nebudete chtít na každé stránce, která vyžaduje komponentu ASP.NET AJAX, ručně vypisovat dlouhé adresy URL, jež ukazují na skriptové zdroje. V takovém případě je dobrým řešením použít ovládací prvek ScriptManager ASP.NET. ScriptManager je mozkem serverového modelu ASP.NET AJAX. Jedná se o webový ovládací prvek, který
nemá vůbec žádnou vizuální podobu na stránce. Provádí však klíčovou úlohu – realizuje odkazy na javascriptové knihovny ASP.NET AJAX.
SKRIPTOVÉ ZDROJE VERSUS WEBOVÉ ZDROJE Všechno tohle vyvolává jednu vynikající otázku – proč ASP.NET, které obsahuje systém pro webové zdroje, zahrnuje i podobný systém pro skriptové zdroje? Soubory JavaScriptu je totiž možné vložit do assembly prostřednictvím běžných webových zdrojů. Odpověď je tato – skriptové zdroje přidávají určitá zdokonalení. Pokud je požadujícím webovým prohlížečem IE 7, skriptové zdroje automaticky použijí komprimaci pro rychlejší stahování. Kromě toho se ScriptResourceHandler trochu více elegantněji zapojí do infrastruktury ASP.NET AJAX na straně klienta. Jakmile se soubor skriptu načte, ScriptResourceHandler zavolá funkci Sys.Application.notifyScriptLoaded() na straně klienta. Pokud používáte soubor skriptu, který se poskytuje prostřednictvím webového zdroje, nebo soubor skriptu, jenž vůbec není vnořen do assembly, je pouze na vás, abyste na konci vašeho skriptu zavolali funkci Sys.Application.notifyScriptLoaded(). Tento krok oznámí pracovnímu rámci ASP.NET AJAX na straně klienta, že skript byl načten, takže bude možné zpracovávat další skript. V případě, kdy tuto akci neprovedete, nebudou některé rysy ASP.NET AJAX v určitých prohlížečích správně fungovat.
Pokud chcete přidat na vaši stránku prvek ScriptManager, můžete jej přetáhnout ze záložky AJAX Extensions toolboxu Visual Studia. Podívejte se na deklaraci prvku ScriptManager v souboru .aspx: <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
Každá stránka, která využívá funkcionality ASP.NET AJAX, vyžaduje instanci prvku ScriptManager. Jedna stránka může obsahovat pouze jeden prvek ScriptManager. Vedle realizace odkazů na klientské knihovny ASP.NET AJAX má ScriptManager na starosti i některé další důležité úlohy. Může realizovat odkazy na jiné
Kapitola 32.indd 1408
15.9.2008 10:18:40
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
1409
soubory skriptu (často na požadavek jiných ovládacích prvků a komponent ASP.NET AJAX), vytvářet proxy, které vám umožní asynchronně volat webové služby z prohlížeče, nebo řídit způsob, jakým bude prvek UpdatePanel obnovovat obsah. V této kapitole prozkoumáme všechna tato témata. TIP
Pokud na vašem webu využíváte nějakou funkcionalitu ASP.NET AJAX, je docela rozumné umístit prvek
ScriptManager do vzorové stránky (master page). To ovšem může někdy působit problémy, protože rozdílný obsah stránek může vyžadovat odlišnou konfiguraci vlastností prvku ScriptManager (například přidání nových skriptů nebo nových odkazů na webové služby). V takové situaci řešení spočívá v použití prvku ScriptManager na vzorové stránce a prvku ScriptManagerProxy na obsahové stránce. Na každé takové obsahové stránce můžete konfigurovat ovládací prvek ScriptManagerProxy stejným způsobem jako prvek ScriptManager.
Nyní, když jsme vám sdělili základní informace o modelu ASP.NET AJAX (tedy o klientských knihovnách a serverovém ovládacím prvku ScriptManager), jste připraveni začít vytvářet stránky, které budou využívat různé funkcionality ASP.NET AJAX. Jako úplně první věc vám předvedeme, jak využít ASP.NET AJAX pro vytvoření alternativy k technice zpětného volání klienta za účelem získání informací ze serveru. Dále vám ukážeme, jak se dají webové ovládací prvky s podporou ASP.NET AJAX využít pro získání typických ajaxových efektů (a to s malým úsilím). A nakonec se blíže podíváme na klientské knihovny ASP.NET AJAX, které podporují tyto funkcionality, přičemž vás naučíme, jak vytvořit vlastní komponentu ASP.NET AJAX.
Serverová zpětná volání Prvním příkladem použití ASP.NET AJAX, o němž budeme přemýšlet, je revidovaná verze stránky zpětného volání klienta z kapitoly 31. Tato stránka obsahuje dvě pole se seznamy (viz obrázek 32-1). V prvním seznamu se zobrazuje seznam regionů. Ve druhém seznamu se pak zobrazují oblasti vybraného regionu. Trik spočívá v tom, že tento druhý seznam se vyplní pokaždé, když uživatel provede nějaký výběr v prvním seznamu. Vyplnění druhého seznamu se neobejde bez zavolání serveru, který prohledá databázi a poskytne výsledky.
Obrázek 32-1. Příklad dynamického seznamu. Aby tato stránka mohla využívat funkcionalitu zpětného volání klienta ASP.NET, musíte implementovat trochu těžkopádné rozhraní ICallbackEventHandler. ASP.NET AJAX ovšem používá poněkud jiný pří-
Kapitola 32.indd 1409
15.9.2008 10:18:40
1410
Kapitola 32 – ASP.NET AJAX
stup. V ASP.NET AJAX jsou zpětná volání vždy vykonávána prostřednictvím samostatné serverové metody – z technického pohledu se jedná o webovou službu. Tento návrh zlepšuje oddělení logiky, což vám pomáhá lépe uspořádat váš kód. Ovšem mnohem důležitější je fakt, že je zajištěn proces serializace. To znamená, že nemusíte vymýšlet vlastní metodu pro zaslání komplexních dat (viz například náš neohrabaný systém pro rozdělení jednotlivých hodnot řetězce, který byl popisován v kapitole 31). V následujících sekcích vám předvedeme, jak vytvořit webovou službu, kterou potřebujete, přičemž vám rovněž nastíníme několik možností jejího využití.
Webové služby v ASP.NET AJAX Při vykonávání serverového zpětného volání pomocí ASP.NET AJAX volá váš javascriptový kód na straně klienta nějakou metodu v serverové webové službě. Webová služba je kolekcí jedné nebo více serverových metod, které mohou být volány vzdálenými klienty. Pro zavolání webové služby klient zasílá zprávu s požadavkem prostřednictvím HTTP (podobně jako v procesu odeslání webové stránky, ovšem s tím rozdílem, že tělo požadavku obsahuje argumenty, které se předají metodě). ASP.NET poté vytvoří objekt webové služby, který spustí kód v odpovídající webové metodě, vrátí výsledek. Objekt webové služby bude poté zničen. Formát zprávy pro požadavek a odpověď bývá různý. Tradičně se jedná o XML standard označovaný jako SOAP, ovšem v ASP.NET AJAX se jedná o odlehčenou textovou alternativu označovanou jako JSON (JavaScript Object Notation), která se používá hlavně z důvodu lepší kompatibility mezi prohlížeči. TIP Další informace o webových službách můžete najít na webu vydavatelství Zoner Press (http://www. zonepress.com). V sekci Download můžete najít tři bonusové kapitoly (ve formátu PDF), které podrobněji popisují protokoly webové služby, architekturu webové služby a postup, jak vytvořit a používat webové služby ASP.NET. Tyto kapitoly jsou v češtině a pocházejí z předchozího vydání této knihy.
Je důležité si uvědomit, že ačkoliv mechanismus zpětného volání ASP.NET AJAX používá webové služby, specializuje se hlavně na implementaci. Pokud jste trochu obeznámeni s webovými službami, nepochybně zjistíte, že ASP.NET AJAX zavádí určité speciální omezení. První omezení – webová stránka nemůže volat jiné webové služby než webové služby ASP.NET AJAX (například webové služby třetích stran, které byly vytvořeny na jiných platformách). Důvodem je skutečnost, že tyto jiné webové služby nepodporují zjednodušený model JSON, který se používá v ASP.NET AJAX. Druhé omezení – webová stránka nemůže volat webové služby, které jsou umístěny v jiných doménách (jinak řečeno – na jiných webových serverech). Je to kvůli tomu, že většina webových prohlížečů nedovoluje použití objektu XMLHttpRequest napříč různými doménami (čímž se předchází některým potenciálním skriptovacím útokům). Tato omezení pochopitelně vůbec neomezují původně zamýšlené použití funkcionality zpětného volání (ve smyslu mechanismu stránky k provádění aplikačních úloh na straně serveru). Pokud ovšem pomocí webových služeb plánujete vystavovat serverovou funkcionalitu klientům, vývojářům třetích stran či aplikacím, které neběží na .NET, musíte si uvědomit, že toto vůbec není cílem webových služeb v ASP.NET AJAX. POZNÁMKA Samozřejmě existují určité způsoby, jak tato omezení obejít. Ve vaší webové aplikaci můžete například zavolat nějakou webovou metodu, která následně zavolá nějakou jinou webovou metodu, jež existuje v jiné doméně. Tato přemosťující technika funguje, protože kód webového serveru nemá stejná omezení jako prohlížeč na straně klienta. Jinak řečeno – ze serveru je možné libovolně volat různé webové služby v různých doménách.
Kapitola 32.indd 1410
15.9.2008 10:18:40
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
1411
Vytvoření webové služby Ačkoliv se webové služby na stránkách ASP.NET AJAX používají speciálním způsobem, jsou definovány stejným způsobem. Stejně jako všechny ostatní webové služby ASP.NET i webové služby, které budete používat s ASP.NET AJAX, se skládají ze dvou částí: souboru .asmx, který vystupuje jako koncový bod webové služby a souboru .cs, jenž obsahuje skutečný kód C#. Tyto soubory musíte vložit na web, který obsahuje stránku ASP.NET AJAX, jež bude používat danou webovou službu. Nejrychlejším způsobem, jak vytvořit webovou službu ve Visual Studiu, je zvolit Website -> Add New Item (nebo Project -> Add New Item for web projects), vybrat šablonu Web Service, zadat název souboru (v následujícím příkladě se jedná o TerritoriesService) a klepnout na Add. Pokud vytváříte web bez projektu, soubor .asmx bude umístěn v adresáři webové aplikace, zatímco odpovídající soubor .cs bude umístěn do složky App_Code, aby mohl být automaticky zkompilován. POZNÁMKA K tomu, abyste mohli použít webovou službu s ASP.NET AJAX, nemusíte webovou aplikaci hostovat ve virtuálním adresáři IIS. Místo toho ji můžete otestovat pomocí integrovaného webového serveru ve Visual Studiu. Tento postup funguje, protože kód skriptu, který volá webovou službu, automaticky používá relativní cestu. V důsledku toho bude stránka schopna sestavit správnou URL, bez ohledu na to, jaký port zvolí webový server Visual studia.
Na souboru .asmx není nic mimořádného – pokud jej otevřete, najdete zde jediný řádek s direktivou WebService, která specifikuje jazyk kódu, umístění souboru s kódem v pozadí a název třídy: <%@ WebService Language="C#" CodeBehind="~/App_Code/TerritoriesService.cs" Class="TerritoriesService" %>
V tomto příkladu je vytvořena webová služba s názvem TerritoriesService.asmx se souborem kódu v pozadí TerritoriesService.cs. Třída kódu v pozadí definuje třídu s názvem TerritoriesService, která vypadá následovně: [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class TerritoriesService : System.Web.Services.WebService {...}
Tato třída je odvozena ze System.Web.Services.WebService, což je tradiční základní třída pro webové služby. Jedná se ovšem pouze o konvenci, která není nutná. Odvozením ze třídy WebService získáte přístup k některým vestavěným objektům (např. Application, Server, Session a User) bez potřeby procházet statickou vlastnost HttpContext.Current. Povšimněte si skutečnosti, že deklarace třídy webové služby obsahuje tři atributy. První dva atributy – WebService (nastavuje jmenný prostor XML, který se používá ve zprávách webové služby) a WebServiceBinding (indikuje úroveň shody se standardy, jež webová služba podporuje) – se použijí pouze tehdy, pokud voláte webovou službu pomocí zpráv SOAP. Tyto atributy se nevztahují na stránky ASP.NET AJAX. Třetí atribut – ScriptService – je ovšem mnohem důležitější. Konfiguruje totiž webovou službu tak, aby povolila volání JSON z klientů JavaScriptu. Bez tohoto detailu nebude možné na stránce ASP.NET AJAX používat webovou službu.
Kapitola 32.indd 1411
15.9.2008 10:18:40
1412
Kapitola 32 – ASP.NET AJAX
POZNÁMKA Ve výchozím nastavení je atribut ScriptService okomentován. Abyste mohli vytvořit webovou službu, kterou lze volat ze stránky ASP.NET AJAX, ujistěte se, že jste odstranili značky pro komentáře.
Vytvoření webové metody Nyní jste připraveni napsat kód pro vaši webovou službu. Každá webová služba obsahuje jednu nebo více metod, které jsou označeny atributem WebMethod. Atribut WebMethod činí metodu vzdáleně volatelnou. Pokud přidáte nějakou metodu, která neobsahuje atribut pro webovou metodu, kód na straně serveru ji sice bude schopen používat, nicméně JavaScript na straně klienta ji nebude schopen přímo volat. [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class TerritoriesService : System.Web.Services.WebService { WebMethod()] public void DoSomething() { ... } }
Není nutné vytvářet metodu jako veřejnou (jak je tomu zde). Toto se obvykle dělá kvůli konvenci a jasnosti. Webové metody mají určitá omezení. Datové typy, které používáte pro hodnoty parametrů a návratové hodnoty, musí používat jeden z datových typů, jež jsou uvedeny v tabulce 32-1. Tabulka 32-1. Datové typy webové služby pro parametry a návratové hodnoty. Datový typ
Popis
Základní typy
Základní datové typy C#, např. celá čísla (short, int, long), nepodepsaná celá čísla (ushort, uint, ulong), neintegrální numerické typy (float, double, decimal) a několik jiných různých typů (bool, string, char, byte, DateTime).
Výčty
Jsou podporovány výčtové typy (definované v C# klíčovým slovem enum). Webová služba však používá řetězcový název hodnoty výčtu (nikoli podkladové celé číslo).
Vlastní objekty
Můžete předat jakýkoliv objekt, který vytvoříte na základě vlastní třídy nebo struktury. Jediným omezením je to, že se přenáší pouze data veřejných členů a vlastnosti, přičemž všichni veřejní členové a vlastnosti musí používat jeden z podporovaných datových typů. Pokud používáte třídu, která obsahuje nějaké vlastní metody, tyto metody se na klienta nepřenesou, takže pro něj nebudou dostupné.
Pole nebo kolekce
Můžete používat pole jakéhokoliv podporovaného typu. Můžete také používat ArrayList, který se jednoduše převede na pole. Nemůžete používat specializovanější kolekce jako Hashtable. Můžete používat obecné kolekce. Ve všech těchto případech musí být objekty v kolekci serializovatelné.
XmlNode
Objekty založené na System.Xml.XmlNode jsou reprezentacemi částí dokumentu XML. Tuto skutečnost můžete používat k zasílání libovolného XML.
Kapitola 32.indd 1412
15.9.2008 10:18:40
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
1413
Datový typ
Popis
Sada dat a datová tabulka
Sadu dat (DataSet) a datovou tabulku (DataTable) můžete používat pro vrácení informací z relační databáze. Nejsou podporovány jiné datové objekty ADO.NET, jako třeba datové sloupce (DataColumns) nebo datové řádky (DataRows). Když použijete sadu dat (DataSet) nebo datovou tabulku (DataTable), automaticky se převede na XML podobným způsobem jako při použití metod GetXml() nebo WriteXml().
STAV RELACE VE WEBOVÉ SLUŽBĚ Atribut WebMethod akceptuje několik parametrů, z nichž většina má na stránkách ASP.NET AJAX poměrně malý význam. Jednou výjimkou je vlastnost EnableSession, která má standardně hodnotu false. Tato vlastnost realizuje stav relace, který může být přístupný vaší webové službě. Výchozí hodnota false je rozumná v tradiční webové službě, která nepoužívá ASP.NET AJAX, protože zde nejsou informace o relaci potřebné, přičemž klient nemusí udržovat cookie relace. Ovšem u webové služby ASP.NET AJAX se volání webové služby vždy provede v kontextu webové stránky ASP.NET, která se vykonává v kontextu aktuálního uživatele webové aplikace. To znamená, že tento uživatel má živou relaci a cookie relace, která se automaticky přenáší společně s voláním webové služby. Podívejte se na příklad, který poskytuje webové metodě přístup k objektu Session: [WebMethod(EnableSession = true)] public void DoSomething() { if (Session["myObject"] != null) { // (Použije objekt ve stavu relace.) } else { // (Vytvoří nový objekt a uloží jej do stavu relace.) } }
V našem příkladu se dvěma seznamy to znamená, že webová služba musí poskytnout způsob pro získání oblastí, které spadají pod daný region. Následující kód znázorňuje webovou službu, která obsahuje webovou metodu s názvem GetTerritoriesInRegion(), která získává takové oblasti: [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class TerritoriesService : System.Web.Services.WebService { [WebMethod()] public List<Territory> GetTerritoriesInRegion(int regionID) { SqlConnection con = new SqlConnection( WebConfigurationManager.ConnectionStrings[
Kapitola 32.indd 1413
15.9.2008 10:18:41
Kapitola 32 – ASP.NET AJAX
1414
"Northwind"].ConnectionString); SqlCommand cmd = new SqlCommand( "SELECT * FROM Territories WHERE RegionID=@RegionID", con); cmd.Parameters.Add(new SqlParameter("@RegionID", SqlDbType.Int, 4)); cmd.Parameters["@RegionID"].Value = regionID; List<Territory> territories = new List<Territory>(); try { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { territories.Add(new Territory( reader["TerritoryID"].ToString(), reader["TerritoryDescription"].ToString())); } reader.Close(); } catch (SqlException err) { // Maskuje chyby. throw new ApplicationException("Data error."); } finally { con.Close(); } return territories; } }
Kód v metodě GetTerritoriesInRegion() je podobný kódu, který jsme použili v kapitole 31 pro poskytnutí zpětného volání klienta. Zásadním rozdílem tohoto kódu je to, že nevrací jeden dlouhý řetězec s výsledky. Informace jsou vráceny prostřednictvím silně typovaného seznamu objektů Territory. To je mnohem lepší způsob, který umožňuje předcházet různým nahodilým chybám. Třída Territory zaobaluje dva kousky řetězcové informace. Místo vlastností používá veřejné členské proměnné, protože funguje výhradně jako datový balík, který přenáší informace po síti: public class Territory { public string ID; public string Description; public Territory(string id, string description) { this.ID = id; this.Description = description;
Kapitola 32.indd 1414
15.9.2008 10:18:41
ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně
1415
} public Territory() { } }
Tuto definici třídy můžete umístit buď do stejného souboru s kódem jako webovou službu, nebo do samostatného souboru v adresáři App_Code.
Volání webové služby Když jste nyní vytvořili webovou službu, kterou potřebujete, musíte ještě nakonfigurovat stránku tak, aby věděla o službě TerritoriesService. K tomuto účelu potřebujete do stránky přidat ovládací prvek ScriptManager. Poté přidejte sekci <Services> do značky pro ovládací prvek ScriptManager. V této sekci jsou pomocí prvků ServiceReference uvedeny všechny služby, které vaše stránka používá a jejich umístění. Podívejte se, jak přidat referenci na soubor TerritoriesService.asmx uvedený dříve: <asp:ScriptManager ID="ScriptManager1" runat="server"> <Services> <asp:ServiceReference Path="~/TerritoriesService.asmx" /> </Services> </asp:ScriptManager> ScriptManager vygeneruje proxy JavaScriptu, kterou můžete použít pro vytvoření vašeho volání. V aktuálním příkladu použijeme tuto proxy pro volání webových metod webové služby TerritoriesService. Zde je řádek kódu JavaScriptu, který volá metodu GetTerritoriesInRegion(): TerritoriesService.GetTerritoriesInRegion(regionID, OnRequestComplete);
Pokud jste už někdy předtím naprogramovali webovou službu v ASP.NET, povšimnete si, že syntaxe na straně klienta pro volání webové služby v ASP.NET AJAX se trochu liší od syntaxe .NET. V aplikaci .NET musíte nejprve vytvořit objekt proxy a poté na tomto objektu zavolat webovou službu. Na stránce ASP.NET AJAX použijete připravený objekt proxy, který bude mít stejný název jako má třída webové služby. Volání webové služby na straně klienta jsou asynchronní, takže parametry původní webové metody musíte vždy poskytnout společně s dalším parametrem, který specifikuje funkci JavaScriptu na straně klienta, jež by se měla zavolat při přijetí výsledku. Nepovinně můžete přidat jiné reference na funkce, které se použijí, když je volání dokončeno: TerritoriesService.GetTerritoriesInRegion(regionID,OnRequestComplete, OnError);
Posledním krokem, který je zapotřebí vykonat pro dokončení našeho příkladu se seznamy, je přidat kód JavaScriptu, jenž bude volat webovou službu a zpracovávat výsledek. V tomto případě potřebujeme alespoň dvě funkce – jednu pro spuštění zpětného volání a druhou pro přijetí výsledku. Podívejte se na funkci JavaScriptu, která spustí proces: function GetTerritories(regionID) { TerritoriesService.GetTerritoriesInRegion(regionID, OnRequestComplete, OnError); }
Kapitola 32.indd 1415
15.9.2008 10:18:41
1416
Kapitola 32 – ASP.NET AJAX
Jakákoliv změna výběru v prvním poli se seznamem spustí funkci JavaScriptu, která vykoná zpětné volání a předá hodnotu regionID z aktuálního výběru: <asp:DropDownList ID="lstRegions" Runat="server" ... onchange="GetTerritories(this.value);" />
Z technického pohledu můžete umístit veškerý kód přímo do funkce GetTerritories() v atributu události onchange a tím zmenšit počet funkcí JavaScriptu, které musíte napsat. Nicméně oddělením kódu, který volá webovou službu, se nejenom rapidně zlepší jeho čitelnost, ale také udržovatelnost. Funkce OnRequestComplete() se spustí po přijetí odpovědi. Akceptuje návratovou hodnotu prostřednictvím jediného parametru. Poté předá informace do druhého pole se seznamem na webové stránce: function OnRequestComplete(result) { var lstTerritories = document.getElementById("lstTerritories"); lstTerritories.innerHTML = ""; for (var n = 0; n < result.length; n++) { var option = document.createElement("option"); option.value = result[n].ID; option.innerHTML = result[n].Description; lstTerritories.appendChild(option); } }
Pozoruhodným rysem tohoto kódu je to, že je schopen pracovat s výsledkem, který byl vrácen webovou metodou, bez dalších deserializačních prací. Tohle všechno je ještě působivější, uvážíme-li, že webová metoda vrací obecný seznam objektů Territory, což je věc, která nemá odpovídající ekvivalent v kódu JavaScriptu. ASP.NET AJAX místo toho vytvoří definici objektu Territory, přičemž v poli vrací celý seznam. To umožní vašemu kódu JavaScriptu procházet pole a prověřovat vlastnosti ID a Description každé položky. Existuje jedna menší vychytávka, kterou nyní můžete uplatnit. Místo použití metody document.getElementById() můžete použít alias ASP.NET AJAX $get, který vykoná stejnou funkci a vypadá následovně: var lstTerritories = $get("lstTerritories");.
Na webových stránkách ASP.NET AJAX se toto zcela běžné používá. Tento příklad nyní funguje stejně jako příklad se zpětným voláním z kapitoly 31, ovšem s tím rozdílem, že tato verze používá silně typovanou webovou metodu bez komplikovaného kódu pro serializaci řetězce. Rovněž nemusíte přidávat žádný serverový kód pro získání reference zpětného volání a jeho dynamického vložení. Můžete používat přímočaré proxy, které poskytují přístup k vaší službě. Jako poslední úpravu přidejte časový limit a funkci pro ošetření chyb, viz níže: function OnError(result) { var lbl = document.getElementById("lblInfo"); lbl.innerHTML = "<b>" + result.get_message() + "</b>"; }
Kapitola 32.indd 1416
15.9.2008 10:18:41