Page 1


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

ASP.NET 3.5 a C# 2008  

ASP.NET 3.5 a C# 2008