asp.net 3.5 a c# 2008

77

Upload: zoner-software-as

Post on 06-Mar-2016

250 views

Category:

Documents


4 download

DESCRIPTION

ASP.NET 3.5 a C# 2008

TRANSCRIPT

Page 1: ASP.NET 3.5 a C# 2008
Page 2: ASP.NET 3.5 a C# 2008

ASP.NET 3.5 a C# 2008tvorba dynamických stránek

PROFESIONÁLNĚ

Matthew MacDonald a Mario Szpuszta

uvod.indd 1uvod.indd 1 15.9.2008 10:10:0715.9.2008 10:10:07

Page 3: ASP.NET 3.5 a C# 2008

Pro ASP.NET 3.5 in C# 2008, Second EditionMatthew 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 PressKatalogové číslo: ZR802

ZONER software, s.r.o.Nové sady 18, 602 00 Brno

Překlad: RNDr. Jan Pokorný, Jan GregorOdpovědný redaktor: Miroslav KučeraŠéfredaktor: Ing. Pavel KristiánDTP: 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 dis-tribuová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: [email protected] http://www.zonerpress.cz

ISBN 978-80-7413-008-3

uvod.indd 2uvod.indd 2 15.9.2008 10:10:5315.9.2008 10:10:53

Page 4: ASP.NET 3.5 a C# 2008

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 35

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í 54

Kapitola 2 Visual Studio 55

Vývojový model .NET 56

Kompilátor 56

Integrované vývojové rozhraní Visual Studia 57

uvod.indd 3uvod.indd 3 15.9.2008 10:10:5315.9.2008 10:10:53

Page 5: ASP.NET 3.5 a C# 2008

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 68

Průzkumník řešení 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 105

Zpracování stránky 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

uvod.indd 4uvod.indd 4 15.9.2008 10:10:5315.9.2008 10:10:53

Page 6: ASP.NET 3.5 a C# 2008

5

Soulad s XHTML 115

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í 148

Kapitola 4 Serverové ovládací prvky 149

Typy serverových ovládacích prvků 149

Hierarchie serverového ovládacího prvku 151

Serverové ovládací prvky HTML 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 162

Základní třída WebControl 163

uvod.indd 5uvod.indd 5 15.9.2008 10:10:5415.9.2008 10:10:54

Page 7: ASP.NET 3.5 a C# 2008

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 175

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í 200

Kapitola 5 Aplikace ASP.NET 201

Anatomie aplikace ASP.NET 201

Aplikační doména 202

Doba života aplikace 203

Aktualizace aplikací 204

Struktura adresáře aplikace 204

Aplikační soubor global.asax 205

uvod.indd 6uvod.indd 6 15.9.2008 10:10:5415.9.2008 10:10:54

Page 8: ASP.NET 3.5 a C# 2008

7

Aplikační události 207

Ukázka aplikačních událostí 209

Konfigurace ASP.NET 210

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 235

Rozšiřování kanálu HTTP 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 248

Shrnutí 251

Kapitola 6 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 274

uvod.indd 7uvod.indd 7 15.9.2008 10:10:5415.9.2008 10:10:54

Page 9: ASP.NET 3.5 a C# 2008

8

Stav relace 276

Architektura relace 276

Práce se stavem relace 277

Konfigurování stavu relace 279

Zabezpečení stavu relace 285

Stav aplikace 286

Statické proměnné aplikace 288

Shrnutí 290

Část II – Přístup k datům

Kapitola 7 Základy ADO.NET 293

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 330

uvod.indd 8uvod.indd 8 15.9.2008 10:10:5415.9.2008 10:10:54

Page 10: ASP.NET 3.5 a C# 2008

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í 334

Kapitola 8 Datové komponenty a sada dat 335

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 346

Odpojená data 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) 360

Řazení s datovým pohledem 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í 374

Kapitola 9 Vázání dat 375

Základy vázání dat 376

Jednoduché vázání dat 376

uvod.indd 9uvod.indd 9 15.9.2008 10:10:5415.9.2008 10:10:54

Page 11: ASP.NET 3.5 a C# 2008

10

Další typy výrazů pro vázání 378

Složené vázání dat 383

Ovládací prvky pro zdroje dat 390

Životní cyklus stránky s vázáním dat 391

Ovládací prvek SqlDataSource 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í 422

Kapitola 10 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 440

Řazení s SqlDataSource 441

uvod.indd 10uvod.indd 10 15.9.2008 10:10:5415.9.2008 10:10:54

Page 12: ASP.NET 3.5 a C# 2008

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 452

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í 493

Kapitola 11 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

uvod.indd 11uvod.indd 11 15.9.2008 10:10:5515.9.2008 10:10:55

Page 13: ASP.NET 3.5 a C# 2008

12

Profily cache 505

Konfigurace cache 505

Cachování dat 507

Přidávání prvků do kolekce Cache 507

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í 544

Kapitola 12 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ů 563

uvod.indd 12uvod.indd 12 15.9.2008 10:10:5515.9.2008 10:10:55

Page 14: ASP.NET 3.5 a C# 2008

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 579

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í 638

Kapitola 14 XML 639

Kdy je rozumné používat XML? 639

uvod.indd 13uvod.indd 13 15.9.2008 10:10:5515.9.2008 10:10:55

Page 15: ASP.NET 3.5 a C# 2008

14

Úvod do XML 640

Výhody 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í 696

uvod.indd 14uvod.indd 14 15.9.2008 10:10:5515.9.2008 10:10:55

Page 16: ASP.NET 3.5 a C# 2008

15

Část III – Budování webů ASP.NET

Kapitola 15 Uživatelské ovládací prvky 699

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í 720

Kapitola 16 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 724

Motivy 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

uvod.indd 15uvod.indd 15 15.9.2008 10:10:5515.9.2008 10:10:55

Page 17: ASP.NET 3.5 a C# 2008

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

Interakce s třídou vzoru stránek 748

Dynamické nastavení vzoru stránek 749

Vnořování vzorů stránek 750

Shrnutí 752

Kapitola 17 Navigace po webu 753

Stránky s více zobrazeními 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í 803

Kapitola 18 Rozmístění webu 805

Internet Information Services (IIS) 805

Weby IIS a virtuální adresáře 806

uvod.indd 16uvod.indd 16 15.9.2008 10:10:5515.9.2008 10:10:55

Page 18: ASP.NET 3.5 a C# 2008

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 857

Rozmisťování aplikací ASP.NET 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 889

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 897

uvod.indd 17uvod.indd 17 15.9.2008 10:10:5515.9.2008 10:10:55

Page 19: ASP.NET 3.5 a C# 2008

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 914

Autentizace 916

Autorizace 918

Bezpečnostní kontext 918

API členství, rolí a profilů 920

Shrnutí 921

Kapitola 20 Formulářová autentizace 923

Úvod do formulářové autentizace 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 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

uvod.indd 18uvod.indd 18 15.9.2008 10:10:5615.9.2008 10:10:56

Page 20: ASP.NET 3.5 a C# 2008

19

Ovládací prvek PasswordRecovery 980

Ovládací prvek ChangePassword 985

Ovládací prvek CreateUserWizard 986

Konfigurace členství v IIS 7.0 991

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í 1002

Kapitola 22 Autentizace Windows 1003

Představení autentizace Windows 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í 1037

uvod.indd 19uvod.indd 19 15.9.2008 10:10:5615.9.2008 10:10:56

Page 21: ASP.NET 3.5 a C# 2008

20

Kapitola 23 Autorizace a role 1039

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 1066

Autorizace s ASP.NET Roles v IIS 7.0 1068

Správa rolí ASP.NET s IIS 7.0 1070

Shrnutí 1072

Kapitola 24 Profily 1073

Co je profil 1073

Představení profilů 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 1094

uvod.indd 20uvod.indd 20 15.9.2008 10:10:5615.9.2008 10:10:56

Page 22: ASP.NET 3.5 a C# 2008

21

Třídy vlastního poskytovatele profilu 1095

Návrh FactoredProfileProvider 1096

Naprogramování FactoredProfileProvider 1098

Testování FactoredProfileProvider 1102

Shrnutí 1105

Kapitola 25 Kryptografie 1107

Š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 1126

Šifrování dotazovacího řetězce 1131

Obalení dotazovacího řetězce 1131

Vytvoření testovací stránky 1134

Shrnutí 1136

Kapitola 26 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í 1174

uvod.indd 21uvod.indd 21 15.9.2008 10:10:5615.9.2008 10:10:56

Page 23: ASP.NET 3.5 a C# 2008

22

Část V – Pokročilé uživatelské rozhraní

Kapitola 27 Vlastní serverové ovládací prvky 1177

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í 1221

Kapitola 28 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 1230

Webové zdroje 1232

uvod.indd 22uvod.indd 22 15.9.2008 10:10:5615.9.2008 10:10:56

Page 24: ASP.NET 3.5 a C# 2008

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 1248

HTML v návrhovém režimu 1248

Inteligentní značky 1251

Shrnutí 1256

Kapitola 29 Dynamické grafiky a GDI+ 1257

Ovládací prvek ImageMap 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 1291

Typické portálové stránky 1292

Základy stránek budovaných s Web Parts 1293

Vytvoření návrhu stránky 1294

Ovládací prvky WebPartManager a WebPartZones 1295

uvod.indd 23uvod.indd 23 15.9.2008 10:10:5615.9.2008 10:10:56

Page 25: ASP.NET 3.5 a C# 2008

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 1351

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 1358

Základní příklady JavaScriptu 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 1381

Navigace pomocí rámců 1382

uvod.indd 24uvod.indd 24 15.9.2008 10:10:5715.9.2008 10:10:57

Page 26: ASP.NET 3.5 a C# 2008

25

Plovoucí rámce (iframe) 1383

Pochopení Ajaxu 1384

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í 1403

Kapitola 32 ASP.NET AJAX 1405

Úvod do ASP.NET AJAX 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 1449

Rozšíření ovládacích prvků 1454

Instalace ASP.NET AJAX Control Toolkit 1455

AutoCompleteExtender 1457

Dostupná rozšíření v ASP.NET AJAX Control Toolkit 1460

Shrnutí 1464

Kapitola 33 Silverlight 1465

Co je Silverlight 1466

uvod.indd 25uvod.indd 25 15.9.2008 10:10:5715.9.2008 10:10:57

Page 27: ASP.NET 3.5 a C# 2008

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 1482

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í 1529

Rejstřík 1531

uvod.indd 26uvod.indd 26 15.9.2008 10:10:5715.9.2008 10:10:57

Page 28: ASP.NET 3.5 a C# 2008

27

O autorechMATTHEW 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), "Begin-ning ASP.NET 3.5 in C# 2008" (Apress, 2007) či "Pro .NET 2.0 Windows Forms and Cus-tom 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 podni-ků 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 me-zinárodních konferencích, jako např. DevDays a TechEd Europe Developers. V posled-

ních dvou letech byl držitelem technického obsahu TechEd Europe Developers.

O odborném korektoroviANDY OLSENANDY OLSEN je nezávislý programátor a konzultant žijící ve Velké Británii. Andy pra-cuje 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 27uvod.indd 27 15.9.2008 10:10:5715.9.2008 10:10:57

Page 29: ASP.NET 3.5 a C# 2008

28

ÚvodJak 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 souvi-sejí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 nej-kompletně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řed-chozí 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:

• Čá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 funk-cionalitá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.

uvod.indd 28uvod.indd 28 15.9.2008 10:10:5715.9.2008 10:10:57

Page 30: ASP.NET 3.5 a C# 2008

29

• Část IV – Bezpečnost. V této části se podíváte na bohatou sadu funkcionalit vztahujících se k za-bezpeč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í spo-lupracuje (kapitola 21). V kapitole 22 se budeme věnovat autentizaci Windows a v kapitole 23 se na-učí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í tren-dy 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řeta-hová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 Micro-softu 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čenaKniha je zamýšlena jako prvotní zdroj informací pro profesionální vývojáře, kteří mají slušné znalosti o we-bové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 profesio-ná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 ob-jektově 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 29uvod.indd 29 15.9.2008 10:10:5715.9.2008 10:10:57

Page 31: ASP.NET 3.5 a C# 2008

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řes-tože teoreticky se dá kód vytvářet ručně, je to nesmírně pracné, a to ani nemluvíme o vysoké pravděpodob-nosti 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 komponen-tá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 mu-sí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án-ká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ázorJako č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: [email protected] nebo [email protected].

Adresa: ZonerPress, ZONER software, s.r.o., Miroslav Kučera, Nové sady 18, 602 00 Brno.

uvod.indd 30uvod.indd 30 15.9.2008 10:10:5815.9.2008 10:10:58

Page 32: ASP.NET 3.5 a C# 2008

31

Zdrojové kódyZdrojové 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é kapitolyK 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ů, pro-tože vám umožňují poskytnout webovou funkcionalitu pro běžné desktopové aplikace. Protože kon-cept 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 31uvod.indd 31 15.9.2008 10:10:5815.9.2008 10:10:58

Page 33: ASP.NET 3.5 a C# 2008

32

uvod.indd 32uvod.indd 32 15.9.2008 10:10:5815.9.2008 10:10:58

Page 34: ASP.NET 3.5 a C# 2008

Čá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áklad-ních dovedností. V této části probereme .NET Framework, který podporuje každá aplikace .NET (kapito-la 1), designérský nástroj Visual Studio, jenž pomáhá budovat a testovat weby (kapitola 2), a infrastrukturuASP.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, obsa-hují 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 kon-figurač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 33Kapitola 01.indd 33 15.9.2008 10:11:4815.9.2008 10:11:48

Page 35: ASP.NET 3.5 a C# 2008

34

Kapitola 01.indd 34Kapitola 01.indd 34 15.9.2008 10:11:5715.9.2008 10:11:57

Page 36: ASP.NET 3.5 a C# 2008

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ývojePrvní 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 vizio-nářů 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ře-ny 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 neu-trá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 35Kapitola 01.indd 35 15.9.2008 10:11:5715.9.2008 10:11:57

Page 37: ASP.NET 3.5 a C# 2008

Kapitola 1 – Úvod do ASP.NET36

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 tech-nologií .NET vytvořila integrovanou skupinu komponent, která kombinuje budování částí pro web (značko-vací jazyky a HTTP) s osvědčenou metodologií orientovanou na objekty.

Vývojový svět před příchodem ASP.NETWebové 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 technolo-gií 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 špagetyPokud 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 36Kapitola 01.indd 36 15.9.2008 10:11:5815.9.2008 10:11:58

Page 38: ASP.NET 3.5 a C# 2008

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 Applica-tion 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ři-dáte-li do celé skládačky ještě vaše vlastní komponenty COM, které budete potřebovat na zprovoznění funk-cionalit, 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 odpu-divý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ě desk-topový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í jazykyV době, kdy bylo vytvořeno, vypadalo ASP jako perfektní řešení pro desktopové vývojáře, kteří se přesou-vali 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že-né 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 37Kapitola 01.indd 37 15.9.2008 10:11:5815.9.2008 10:11:58

Page 39: ASP.NET 3.5 a C# 2008

Kapitola 1 – Úvod do ASP.NET38

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 po-skytlo 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 skrip-tech.

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ém-koliv 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.NETVý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í lo-giku, nebo přizpůsobovat a vylaďovat své aplikace za pomoci různých konfiguračních voleb. V pozadí všakASP.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 říze-nou 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 38Kapitola 01.indd 38 15.9.2008 10:11:5815.9.2008 10:11:58

Page 40: ASP.NET 3.5 a C# 2008

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 zdokonale-ní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.NETJestliž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í pro-gramá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 kompilujeJední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í hos-titel 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 39Kapitola 01.indd 39 15.9.2008 10:11:5815.9.2008 10:11:58

Page 41: ASP.NET 3.5 a C# 2008

Kapitola 1 – Úvod do ASP.NET40

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 zkompilo-vanou assembly s kódem .NET, kterou je možné distribuovat na více než jednu platformu.

Kapitola 01.indd 40Kapitola 01.indd 40 15.9.2008 10:11:5815.9.2008 10:11:58

Page 42: ASP.NET 3.5 a C# 2008

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émo-vém adresáři, jehož cesta je obvykle c:\Windows\Microsoft.NET\Framework\v2.0.50727\Tempora-ryASP.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 desig-nu 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 roz-mí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ředsta-vovanou 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í Javya ASP.NET najdete na http://msdn2.microsoft.com/en-us/vstudio/aa700836.aspx. Mějte ale na pa-mě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ču-je, č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 41Kapitola 01.indd 41 15.9.2008 10:11:5815.9.2008 10:11:58

Page 43: ASP.NET 3.5 a C# 2008

423

KAPITOLA 10 Bohatě vybavené datové ovládací prvkyV 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. Se-zná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í se-znamu 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í prv-ky 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 si-tuace, kdy je to vhodné kvůli zpětné kompatibilitě. Následuje přehled všech datových ovládacích prvků ASP.NET.

• 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 posky-tuje 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í.

Kapitola 10.indd 423Kapitola 10.indd 423 15.9.2008 10:12:4015.9.2008 10:12:40

Page 44: ASP.NET 3.5 a C# 2008

Kapitola 10 – Bohatě vybavené datové ovládací prvky424

... 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 GridViewJestliž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á kom-patibilita, 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šech-ny 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 424Kapitola 10.indd 424 15.9.2008 10:12:4715.9.2008 10:12:47

Page 45: ASP.NET 3.5 a C# 2008

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. Nej-ví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 slou-pec 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ě hyper-textového odkazu.

ImageField Tento sloupec zobrazí obrázek z binárního pole (za předpokladu, že se dá úspěšně inter-pretovat 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ň kon-troly 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 Employee-ID 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 fal-se, 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 425Kapitola 10.indd 425 15.9.2008 10:12:4715.9.2008 10:12:47

Page 46: ASP.NET 3.5 a C# 2008

Kapitola 10 – Bohatě vybavené datové ovládací prvky426

TIP Sloupce se dají také skrýt programátorsky. Sloupce se skrývají pomocí kolekce Columns ovládacího prv-ku 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 automatic-ky 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 vlastnos-ti 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 tom-to sloupci zobrazit.

DataFormatString Tato vlastnost formátuje hodnoty pole (field). Hodí se například, když potře-bujete správně zobrazovat peněžní částky nebo datum. V předchozích ver-zí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 426Kapitola 10.indd 426 15.9.2008 10:12:4715.9.2008 10:12:47

Page 47: ASP.NET 3.5 a C# 2008

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 hod-nota 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

HeaderText

HeaderImageUrl

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áhla-ví 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ředvede-me v oddílu "Souhrny v GridView" poblíž konce kapitoly). Chcete-li v záhlaví zobrazit místo textu obrázek, nastavte vlastnost 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 progra-má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í zna-ky 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 "(hod-nota chybí)".

ConvertEmptyStringToNull Pokud je true, tak předtím, než bude potvrzena editace, budou nahrazeny všechny prázdné řetězce hodnotami null.

ControlStyle

HeaderStyle

FooterStyle

ItemStyle

Konfigurují vzhled pouze pro tento sloupec, překrývají styly řádku. O stylech se více informací dozvíte v průběhu kapitoly.

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 427Kapitola 10.indd 427 15.9.2008 10:12:4815.9.2008 10:12:48

Page 48: ASP.NET 3.5 a C# 2008

Kapitola 10 – Bohatě vybavené datové ovládací prvky428

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.

• 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í.

• Šablony. Jak plně dostat pod kontrolu vzhled, formátování a editaci tím, že si nadefinujete šablony.

Formátování a GridViewFormátování se skládá z několika vzájemně provázaných úloh. Nejprve musíte zajistit, aby se řádně prezen-tovaly hodnoty vyjadřující datum, peněžní částky a jiné číselné hodnoty. To zařídíte pomocí vlastnosti Da-taFormatString. 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 pro-stř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 428Kapitola 10.indd 428 15.9.2008 10:12:4815.9.2008 10:12:48

Page 49: ASP.NET 3.5 a C# 2008

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 hod-notu Auto, Vertical, nebo Both.

Formátování sloupců vázaných na dataKaž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 sym-bolem 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 429Kapitola 10.indd 429 15.9.2008 10:12:4815.9.2008 10:12:48

Page 50: ASP.NET 3.5 a C# 2008

Kapitola 10 – Bohatě vybavené datové ovládací prvky430

Typ Formátovací řetězec Ukázka

Pevný početdesetinný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 dispo-zici 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é datuma krátký čas

{0:f } dddd, MMMM dd, yyyy HH:mm aa (například: Sunday, January 30, 2005 10:00 AM).

Dlouhé datuma dlouhý čas

{0:F} dddd, MMMM dd, yyyy HH:mm:ss aa (například: Monday, Janu-ary 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ě.

StylyGridView 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 roz-hodli je zobrazovat (ShowHeader má hodnotu true).

Kapitola 10.indd 430Kapitola 10.indd 430 15.9.2008 10:12:4915.9.2008 10:12:49

Page 51: ASP.NET 3.5 a C# 2008

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áto-vá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 Border-Width), 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ě atri-butů 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 431Kapitola 10.indd 431 15.9.2008 10:12:4915.9.2008 10:12:49

Page 52: ASP.NET 3.5 a C# 2008

Kapitola 10 – Bohatě vybavené datové ovládací prvky432

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 432Kapitola 10.indd 432 15.9.2008 10:12:4915.9.2008 10:12:49

Page 53: ASP.NET 3.5 a C# 2008

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 su-dých řádků. Styly specifické pro sloupec jsou použity pro zvýraznění informací o sídle (City a Country) po-mocí 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 StudiuNení 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 sty-ly 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 433Kapitola 10.indd 433 15.9.2008 10:12:4915.9.2008 10:12:49

Page 54: ASP.NET 3.5 a C# 2008

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í navi-gační systém s minimálním úsilím. A nejlepší na tom je, že ASP.NET jasně odděluje data (informace o struk-tuř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ímiV mnohých webech se složitější úkoly člení do několika stránek. Pokud například chcete do internetového ob-chodu 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 po-skytli 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 753Kapitola 17.indd 753 15.9.2008 10:16:3315.9.2008 10:16:33

Page 55: ASP.NET 3.5 a C# 2008

Kapitola 17 – Navigace po webu754

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 vlast-nost 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 MultiViewMultiView 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 ekvivalent-ní 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 754Kapitola 17.indd 754 15.9.2008 10:16:3715.9.2008 10:16:37

Page 56: ASP.NET 3.5 a C# 2008

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). Jed-notlivé 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 755Kapitola 17.indd 755 15.9.2008 10:16:3815.9.2008 10:16:38

Page 57: ASP.NET 3.5 a C# 2008

Kapitola 17 – Navigace po webu756

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 do-stupná 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. Po-dobně jako některé bohatě vybavené datové ovládací prvky, rozpoznává i MultiView konkrétní názvy pří-

Kapitola 17.indd 756Kapitola 17.indd 756 15.9.2008 10:16:3815.9.2008 10:16:38

Page 58: ASP.NET 3.5 a C# 2008

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ři-dá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 (ře-tě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 Com-mandArgument ovládacího prvku tlačít-ka.

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áda-cí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 757Kapitola 17.indd 757 15.9.2008 10:16:3815.9.2008 10:16:38

Page 59: ASP.NET 3.5 a C# 2008

Kapitola 17 – Navigace po webu758

... 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 Mul-tiView 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 WizardOvlá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ři-způ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řed-cházející, pokud chce opravit nějaký údaj). Ovládací prvek Wizard ASP.NET dále podporuje nelineární navi-gaci, čí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 758Kapitola 17.indd 758 15.9.2008 10:16:3815.9.2008 10:16:38

Page 60: ASP.NET 3.5 a C# 2008

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. Ob-vykle 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ůvodceChcete-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ý ne-vratný 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 759Kapitola 17.indd 759 15.9.2008 10:16:3815.9.2008 10:16:38

Page 61: ASP.NET 3.5 a C# 2008

Kapitola 17 – Navigace po webu760

<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 760Kapitola 17.indd 760 15.9.2008 10:16:3915.9.2008 10:16:39

Page 62: ASP.NET 3.5 a C# 2008

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.Acti-veStepIndex 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 761Kapitola 17.indd 761 15.9.2008 10:16:3915.9.2008 10:16:39

Page 63: ASP.NET 3.5 a C# 2008

Kapitola 17 – Navigace po webu762

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ůvodcePokud 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 vlast-nost ActiveStepIndex).

CancelButtonClick Nastane, když se klikne na tlačítko Cancel. Toto tlačítko se standardně nezobra-zuje, 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 na-stavte vlastnost CancelDestinationPageUrl – pak se o přesměrování auto-maticky 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 (atomic-kou) 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žado-vané 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 762Kapitola 17.indd 762 15.9.2008 10:16:3915.9.2008 10:16:39

Page 64: ASP.NET 3.5 a C# 2008

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 Finish-ButtonClick. 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ředcho-zím krokem atd.

Styly a šablony průvodceNejvětší předností ovládacího prvku Wizard je nepochybně to, jak umožňuje přizpůsobovat vzhled. To zna-mená, ž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ůsobo-vat 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 763Kapitola 17.indd 763 15.9.2008 10:16:3915.9.2008 10:16:39

Page 65: ASP.NET 3.5 a C# 2008

Kapitola 17 – Navigace po webu764

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 na-stavena 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 na-stavena na Finish).

CancelButtonStyle Aplikuje se na stornovací tlačítko, je-li vlastnost Wizard.DisplayCan-celButton 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 764Kapitola 17.indd 764 15.9.2008 10:16:3915.9.2008 10:16:39

Page 66: ASP.NET 3.5 a C# 2008

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 ome-zeně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ět-ného volání klienta má ovšem do dokonalosti daleko. Rozhraní vypadá trochu neobratně, integrace do mode-lu 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é po-skytují několik funkcionalit, jež vám mohou pomoci s vytvářením ajaxových stránek. V této kapitole podrob-ně prozkoumáte ASP.NET AJAX a naučíte se, jak jej používat k vytvoření nové generace interaktivních dyna-mických webových stránek.

Úvod do ASP.NET AJAXASP.NET AJAX se skládá ze dvou klíčových částí – z části na straně klienta a z části na straně serveru. Klient-ská čá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 1405Kapitola 32.indd 1405 15.9.2008 10:18:2715.9.2008 10:18:27

Page 67: ASP.NET 3.5 a C# 2008

Kapitola 32 – ASP.NET AJAX1406

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ů spoje-ný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 Tool-kit 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ři-pomí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, kte-rou š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čko-vací standard založený na XML , který byl označován jako klientský skript (client script).

Kapitola 32.indd 1406Kapitola 32.indd 1406 15.9.2008 10:18:3915.9.2008 10:18:39

Page 68: ASP.NET 3.5 a C# 2008

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í serve-rové 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 funkciona-litá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 funkci-onalitami (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ál-ně 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 standar-dem – 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ís-tě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áh-nout soubory JavaScriptu samostatně z webu ASP.NET AJAX (http://ajax.asp.net/downloads/de-fault.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 kte-rý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 1407Kapitola 32.indd 1407 15.9.2008 10:18:3915.9.2008 10:18:39

Page 69: ASP.NET 3.5 a C# 2008

Kapitola 32 – ASP.NET AJAX1408

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.ScriptResourceHan-dler, 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 – ScriptManagerS 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 javascrip-tové 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, zahrnu-je 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 ScriptResour-ceHandler 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.notifyScript Loaded() na straně klienta. Pokud používáte soubor skriptu, který se poskytuje prostřednictvím webového zdroje, nebo sou-bor 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 stra-ně 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 Extensi-ons 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 1408Kapitola 32.indd 1408 15.9.2008 10:18:4015.9.2008 10:18:40

Page 70: ASP.NET 3.5 a C# 2008

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 Upda-tePanel 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 Script Manager 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 konfiguro-vat 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 ajaxo-vý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. Vy-plně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 1409Kapitola 32.indd 1409 15.9.2008 10:18:4015.9.2008 10:18:40

Page 71: ASP.NET 3.5 a C# 2008

Kapitola 32 – ASP.NET AJAX1410

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 rov-něž nastíníme několik možností jejího využití.

Webové služby v ASP.NET AJAXPř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 pro-cesu 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í webo-vý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 na-pří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 1410Kapitola 32.indd 1410 15.9.2008 10:18:4015.9.2008 10:18:40

Page 72: ASP.NET 3.5 a C# 2008

ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně 1411

Vytvoření webové službyAčkoliv se webové služby na stránkách ASP.NET AJAX používají speciálním způsobem, jsou definovány stej-ný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ásle-dují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 hosto-vat 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 Web-Service, 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 – Web-Service (nastavuje jmenný prostor XML, který se používá ve zprávách webové služby) a WebServiceBin-ding (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 povo-lila 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 1411Kapitola 32.indd 1411 15.9.2008 10:18:4015.9.2008 10:18:40

Page 73: ASP.NET 3.5 a C# 2008

Kapitola 32 – ASP.NET AJAX1412

POZNÁMKA Ve výchozím nastavení je atribut ScriptService okomentován. Abyste mohli vytvořit webo-vou 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é metodyNyní jste připraveni napsat kód pro vaši webovou službu. Každá webová služba obsahuje jednu nebo více me-tod, 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é hod-noty, 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 struktu-ry. 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 kli-enta 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 Array-List, 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 1412Kapitola 32.indd 1412 15.9.2008 10:18:4015.9.2008 10:18:40

Page 74: ASP.NET 3.5 a C# 2008

ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně 1413

Datový typ Popis

Sada dat a datová ta-bulka

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 (Data-Set) 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 ne-musí udržovat cookie relace. Ovšem u webové služby ASP.NET AJAX se volání webové služby vždy provede v kon-textu 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 1413Kapitola 32.indd 1413 15.9.2008 10:18:4115.9.2008 10:18:41

Page 75: ASP.NET 3.5 a C# 2008

Kapitola 32 – ASP.NET AJAX1414

"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 poskyt-nutí zpětného volání klienta. Zásadním rozdílem tohoto kódu je to, že nevrací jeden dlouhý řetězec s výsled-ky. 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é pro-mě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 1414Kapitola 32.indd 1414 15.9.2008 10:18:4115.9.2008 10:18:41

Page 76: ASP.NET 3.5 a C# 2008

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 samostat-ného souboru v adresáři App_Code.

Volání webové službyKdyž 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 Script-Manager. 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ál-ní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 Ja-vaScriptu, 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 1415Kapitola 32.indd 1415 15.9.2008 10:18:4115.9.2008 10:18:41

Page 77: ASP.NET 3.5 a C# 2008

Kapitola 32 – ASP.NET AJAX1416

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řednic-tví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 me-todou, 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.getEle-mentById() 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 1416Kapitola 32.indd 1416 15.9.2008 10:18:4115.9.2008 10:18:41