ASP.NET 4 a C# 2010, kniha 1

Page 1

E N C Y K L O P E D I E

Z O N E R

P R E S S

ASP.NET 4 a C# 2010 TVORBA DYNAMICKÝCH STRÁNEK PROFESIONÁLNĔ

KNIHA 1

Matthew MacDonald Adam Freeman Mario Szpuszta



ASP.NET 4 a C# 2010 tvorba dynamických stránek profesionálně, kniha 1

Matthew MacDonald, Adam Freeman, Mario Szpuszta


Pro ASP.NET in C# 2010, Fourth Edition Matthew MacDonald, Adam Freeman a Mario Szpuszta Original edition copyright © 2010 by Matthew MacDonald, Adam Freeman, and Mario Szpuszta. Czech edition copyright © 2011 by ZONER software, a.s. All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright the publisher. Copyright originálního vydání © 2010 Matthew MacDonald, Adam Freeman a Mario Szpuszta. Copyright českého vydání © 2011 ZONER software, a.s.. 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í držitele autorských práv.

ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně, kniha 1 Autor: Matthew MacDonald, Adam Freeman, Mario Szpuszta Copyright © ZONER software, a.s. Vydání první v roce 2011. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZR1003 ZONER software, a.s. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP: Miroslav Kučera, obálka: Lenka Křížová Zdrojové soubory ke knize: http://zonerpress.cz/download/aspnet4-a-c2010.zip

Bonusové kapitoly: http://www.zonerpress.cz/download/bonusove-kapitoly-aspnet.zip

Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, a.s Nové sady 18, 602 00 Brno tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz

ISBN 978-80-7413-131-8


5

Obsah O autorech

18

O odborných korektorech

18

Úvod

19

Rozdělení knihy

19

Komu je tato kniha určena?

21

Co potřebujete, abyste mohli pracovat s touto knihou?

21

Sdělte nám svůj názor

21

Zdrojové kódy

22

Bonusové kapitoly

22

Část I – Základy ASP.NET

23

Kapitola 1

25

Úvod do ASP.NET

Sedm pilířů ASP.NET

25

První pilíř: ASP.NET je integrováno s .NET Frameworkem

25

Druhý pilíř: ASP.NET se neinterpretuje, ale kompiluje

26

Třetí pilíř: ASP.NET je vícejazyčné

28

Čtvrtý pilíř: ASP.NET běží uvnitř společného runtime jazyků

30

Pátý pilíř: ASP.NET je objektově orientované

30

Šestý pilíř: ASP.NET podporuje všechny prohlížeče

33

Sedmý pilíř: ASP.NET se snadno nasazuje a konfiguruje

33

Evoluce ASP.NET

34

ASP.NET 1.0 a 1.1

34

ASP.NET 2.0

34

ASP.NET 3.5

35

ASP.NET 4

38

Silverlight

41

Shrnutí

Kapitola 2

41

Visual Studio

Úvod do Visual Studia

43 44

Weby a webové projekty

45

Vytvoření webu bez projektu

45

Navrhování webové stránky

50


6 Integrované vývojové rozhraní Visual Studia Průzkumník řešení

56 58

Okno dokumentu

60

Toolbox

60

Seznam chyb a seznam úkolů

61

Průzkumník serveru

62

Editor kódu

64

Přidání referencí na assembly

65

IntelliSense a osnova

68

Vylepšení ve Visual Studiu 2010 Model vytváření kódu

70 76

Jak se soubory kódu v pozadí připojují ke stránkám

78

Jak se připojují značky ovládacích prvků k proměnným stránky

79

Jak se připojují události k obsluhám událostí

81

Webové projekty

82

Vývoj založený na projektu

83

Vytvoření webového projektu

84

Migrace webu z předchozí verze Visual Studia

85

Ladění ve Visual Studiu

87

Ladění po krocích

88

Sledování proměnných

91

Pokročilé body přerušení

92

Web Development Helper

93

Shrnutí

95

Kapitola 3

Webové formuláře

Zpracování stránky HTML formuláře

97 98 98

Dynamická uživatelská rozhraní

100

Událostní model ASP.NET

101

Automatické odesílání na server

102

Stav zobrazení

104

Soulad s XHTML

108

ID ovládacích prvků na straně klienta

114

Etapy zpracování webového formuláře

117

Inicializace frameworku stránky

118

Inicializace uživatelského kódu

118


7 Validace

119

Zpracování událostí

119

Automatické vázání dat

120

Úklid

120

Ukázka toku zpracování stránky

120

Stránka jako kontejner ovládacích prvků

123

Zobrazení stromu ovládacích prvků

123

Záhlaví stránky

128

Dynamické vytváření ovládacích prvků

129

Třída Page

131

Objekty Session, Application a Cache

131

Objekt Request

132

Objekt Response

133

Objekt Server

137

Objekt User

139

Objekt Trace

139

Přístup ke kontextu HTTP v jiné třídě

145

Shrnutí

Kapitola 4

146

Serverové ovládací prvky

Typy serverových ovládacích prvků Hierarchie serverového ovládacího prvku Serverové ovládací prvky HTML Třída HtmlControl

147 147 149 150 151

Třída HtmlContainerControl

151

Třída HtmlInputControl

152

Třídy serverových ovládacích prvků HTML

152

Nastavování atributů stylu a jiných vlastností

154

Vytváření serverových ovládacích prvků programátorsky

155

Obsluha událostí na straně serveru

157

Webové ovládací prvky

160

Základní třída WebControl

161

Základní třídy webových ovládacích prvků

162

Jednotky

165

Výčtové hodnoty

165

Barvy

166

Písma

166


8 Focus

168

Výchozí tlačítko

169

Panely s rolováním

170

Obsluha událostí webových ovládacích prvků

171

Ovládací prvky pro seznamy

173

Ovládací prvky seznamů, z nichž lze vybírat

175

Ovládací prvek BulletedList

178

Ovládací prvky pro validaci vstupů

179

Validační ovládací prvky

180

Validační proces

181

Třída BaseValidator

182

Ovládací prvek RequiredFieldValidator

184

Ovládací prvek RangeValidator

184

Ovládací prvek CompareValidator

185

Ovládací prvek RegularExpressionValidator

185

Ovládací prvek CustomValidator

188

Ovládací prvek ValidationSummary

190

Programátorské využívání validátorů

191

Validační skupiny

192

Bohatě vybavené ovládací prvky ASP.NET Ovládací prvek AdRotator Ovládací prvek Calendar Shrnutí

Kapitola 5

194 195 197 199

Aplikace ASP.NET

Anatomie aplikace ASP.NET

201 201

Aplikační doména

202

Doba života aplikace

203

Aktualizace aplikací

204

Struktura adresáře aplikace

204

Aplikační soubor global.asax

205

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


9 <system.webServer>

218

<appSettings>

218

<connectionStrings>

220

Programátorské čtení a zápis konfiguračních nastavení

221

Nástroj WAT (Website Administration Tool)

223

Rozšiřování struktury konfiguračního souboru

225

Šifrování konfiguračních sekcí

229

Komponenty .NET Vytvoření komponenty

230 231

Test komponenty prostřednictvím adresáře App_Code

233

Test komponenty prostřednictvím adresáře Bin

234

Rozšiřování kanálu HTTP

236

Obslužné rutiny HTTP

236

Vytvoření vlastní obslužné rutiny HTTP

238

Konfigurace vlastní obslužné rutiny HTTP

239

Obslužné rutiny HTTP bez konfigurování

240

Vytvoření pokročilejší obslužné rutiny HTTP

241

Vytvoření obslužné rutiny HTTP pro obsah, který není HTML

243

HTTP Moduly

246

Vytvoření vlastního modulu HTTP

248

Shrnutí

Kapitola 6

250

Správa stavu

251

Správa stavu ASP.NET

252

Stav zobrazení

254

Ukázka práce se stavem zobrazení

255

Ukládání objektů do stavu zobrazení

257

Posouzení stavu zobrazení

259

Selektivní vypínání stavu zobrazení

260

Bezpečnost stavu zobrazení

262

Přenášení informací mezi stránkami

263

Dotazovací řetězec

264

Odesílání stránky na server přes jinou stránku

266

Cookies

273

Stav relace

274

Architektura relace

274

Práce se stavem relace

276


10 Konfigurování stavu relace

277

Zabezpečení stavu relace

284

Stav aplikace

285

Statické proměnné aplikace Shrnutí

289

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

287

Základy ADO.NET

Architektura ADO.NET Zprostředkovatelé dat ADO.NET

291 293 294 294

Standardizace v ADO.NET

296

Základní třídy ADO.NET

297

Třídy připojení

298

Připojovací řetězce

298

Testování připojení

301

Fond připojení

303

Třídy příkazů a čtenářů dat

305

Základní informace o třídách příkazů

305

Třídy čtenářů dat

306

Metoda ExecuteReader() a čtenář dat

307

Metoda ExecuteScalar()

313

Metoda ExecuteNonQuery()

314

Útoky injektáží SQL

314

Práce s parametrizovanými příkazy

317

Volání uložených procedur

319

Transakce

321

Transakce a aplikace ASP.NET

322

Úrovně izolace

327

Záchytné body

329

Kód nedogmatický vzhledem ke zprostředkovatelům

330

Vytvoření továrny na objekty

330

Vytváření objektů v továrně

332

Dotaz s kódem nedogmatickým vůči zprostředkovatelům Shrnutí

332 334


11 Kapitola 8

Datové komponenty a sada dat

Budování komponenty pro přístup k datům

335 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

349

Webové aplikace a sada dat

350

Integrace XML

351

Sada dat

351

Datové adaptéry

352

Plnění sady dat

354

Práce s více tabulkami najednou a relace

355

Vyhledávání konkrétních řádků

358

Použití sady dat ve vlastní třídě pro přístup k datům

359

Vázání dat

360

Datový pohled

361

Řazení s datovým pohledem

361

Filtrování s datovým pohledem

363

Pokročilé filtrování s relacemi

365

Vypočítané sloupce Shrnutí

Kapitola 9

366 368

Vázání dat

Základy vázání dat Jednoduché vázání dat

369 370 370

Další typy vázacích výrazů

373

Složené vázání dat

377

Ovládací prvky pro zdroje dat Životní cyklus stránky s vázáním dat Ovládací prvek SqlDataSource

385 385 386

Výběr záznamů

387

Parametrizované příkazy

390

Zpracování chyb

395

Aktualizace záznamů

396


12 Odstraňování záznamů

400

Vkládání záznamů

401

Nevýhody ovládacího prvku SqlDataSource

401

Ovládací prvek ObjectDataSource

402

Výběr záznamů

403

Aktualizace záznamů

408

Aktualizace pomocí datového objektu

409

Limity ovládacích prvků pro zdroje dat

413

Specifikace problému

413

Přidání dalších položek do seznamu

414

Zpracování dodatečných voleb s SqlDataSource

415

Zpracování dodatečných voleb s ObjectDataSource

416

Shrnutí

Kapitola 10

416

Bohatě vybavené datové ovládací prvky

417

Ovládací prvek GridView

418

Definice sloupců

418

Formátování GridView

422

Formátování sloupců vázaných na data

422

Styly

424

Formátování pouze některých hodnot

428

Výběr řádků v GridView

430

Výběr ve formuláři typu hlavní záznam-sdružené záznamy

431

Událost SelectedIndexChanged

433

Datový sloupec v podobě výběrových tlačítek Řazení a GridView

434 435

Řazení s SqlDataSource

435

Řazení s ObjectDataSource

436

Řazení a výběr

438

Složitější řazení

438

Stránkování a GridView

440

Automatické stránkování

440

Stránkování a výběr

442

Vlastní stránkování s ObjectDataSource

442

Přizpůsobení pruhu se stránkovacími ovládacími prvky Šablony a GridView Použití několika šablon

445 446 449


13 Editace šablon ve Visual Studiu

449

Vázání k metodě

450

Obsluha událostí v šabloně

451

Editace se šablonou

453

Klientská ID v šablonách

459

Ovládací prvek ListView

460

Skupiny v ListView

463

Stránkování

465

Ovládací prvky DetailsView a FormView

466

Ovládací prvek DetailsView

466

FormView

469

Pokročilé mřížky

471

Souhrny v GridView

471

Zobrazení rodič/potomek v jediné tabulce

473

Editace pole pomocí vyhledávací tabulky

475

Získávání obrázků z databáze

478

Detekce konfliktů při souběžném zpracování

484

Shrnutí

Kapitola 11

489

Cachování a asynchronní stránky

491

Cachování v ASP.NET

492

Cachování výstupu

492

Deklarativní cachování výstupu

493

Cachování a dotazovací řetězec

494

Cachování s konkrétními parametry dotazovacího řetězce

495

Vlastní technika cachování

496

Cachování s třídou HttpCachePolicy

497

Cachování fragmentu a nahrazení po uložení do cache

498

Profily cache

501

Konfigurace cache

502

Rozšiřitelnost cachování výstupu

502

Cachování dat

508

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

508

Jednoduchý test cache

511

Priority cache

512

Cachování s ovládacími prvky zdrojů dat

513

Závislosti cache

516


14 Závislosti na souboru a na prvku cache

517

Souhrnné závislosti

518

Zpětné volání při odstranění prvku z cache

519

Notifikace SQL do cache

521

Jak pracují notifikace

522

Zapnutí notifikací

523

Vytvoření závislosti cache

524

Vlastní závislosti cache Jednoduchá ukázka vlastní závislosti cache Vlastní závislost cache používající fronty zpráv Asynchronní stránky Vytvoření asynchronní stránky

525 525 526 529 530

Dotazy na data v asynchronní stránce

532

Zpracování chyb

534

Cachování v asynchronních úlohách

537

Vícenásobné asynchronní úlohy a časové limity Shrnutí

Kapitola 12

540 541

Soubory a proudy

543

Práce se systémem souborů

543

Třídy Directory a File

544

Třídy DirectoryInfo a FileInfo

547

Třída DriveInfo

549

Práce s atributy

550

Filtrování souborů se zástupnými symboly

552

Získávání informací o verzi souboru

553

Třída Path

554

Prohlížeč souborů

556

Čtení a zápis souborů pomocí proudů

561

Textové soubory

563

Binární soubory

565

Nahrávání souborů na server

566

Soubor zajištěný pro bezpečný simultánní přístup

568

Komprimace

573

Serializace

574

Shrnutí

577


15 Kapitola 13

LINQ

Základy LINQ

579 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é sady dat

596

Hodnoty Null

596

LINQ to Entities

596

Generování datového modelu

597

Třídy datového modelu

598

Relace entit

601

Dotazy na uložené procedury

602

Dotazy LINQ to Entities "pod kapotou"

604

Databázové operace

611

Vkládání

611

Aktualizace

614

Odstraňování

614

Souběžné zpracování

615

Zpracování konfliktů při souběžném zpracování Ovládací prvek EntityDataSource Zobrazování dat

616 621 621

Získávání dat spojených relacemi

625

Editace dat

626

Validace

627

Ovládací prvek QueryExtender

629

Filtr SearchExpression

629

Filtr RangeExpression

631

Filtr PropertyExpression

631

Filtr MethodExpression

632

Shrnutí

Kapitola 14

633

XML

635

Kdy je rozumné používat XML?

635

Úvod do XML

636


16 Přednosti XML

637

Správně strukturované XML

638

Jmenné prostory XML

639

Schémata XML

641

Zpracování XML založené na proudech

642

Zápis souborů XML

643

Čtení souborů XML

646

Zpracování XML v paměti

650

Třída XmlDocument

650

Třída XPathNavigator

654

Třída XDocument

656

Vyhledávání obsahu XML

662

Vyhledávání s XmlDocument

662

Prohledávání dokumentu XML s XPath

665

Prohledávání XDocument s LINQ

667

Validace souborů XML

669

Základní schéma

669

Validace s XmlDocument

670

Validace s XDocument

672

Transformace obsahu XML

672

Základní stylový předpis

673

Práce s XslCompiledTransform

674

Práce s ovládacím prvkem Xml

676

Transformace XML s LINQ to XML

676

Vázání dat XML

678

Vázání, které není hierarchické

679

Výrazy XPath

681

Vnořené mřížky

683

Hierarchické vázání s TreeView

685

Práce s XSLT

687

Vázání k obsahu XML z jiných zdrojů

689

Aktualizace XML prostřednictvím XmlDataSource XML a sada dat ADO.NET Převod sady dat do XML Přístup k sadě dat jako k XML Shrnutí

690 690 691 693 695


17

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

Uživatelské ovládací prvky

Základy uživatelského ovládacího prvku

697 699 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

713

Dynamicky načítané uživatelské ovládací prvky Frameworky portálů

714 715

Ukládání částí stránky do cache

718

Vlastnost VaryByControl

719

Sdílení ovládacích prvků ukládaných do cache Shrnutí

Kapitola 16

721 721

Motivy a vzory stránek

723

Kaskádové stylové předpisy (CSS)

723

Vytvoření stylového předpisu

724

Aplikování stylových pravidel Motivy

726 729

Složky motivu a skinové předpisy

730

Aplikování jednoduchého motivu

731

Zpracování konfliktů souvisejících s motivem

732

Vytvoření více skinů pro jeden ovládací prvek

733

Skiny se šablonami a obrázky

734

Aplikování stylového předpisu v motivu

737

Aplikování motivů prostřednictvím konfiguračního souboru

737

Aplikování motivů dynamicky

738

Standardizace layoutu webu

740

Základní informace o vzoru stránek

741

Jednoduchý vzor stránek

742

Jednoduchá obsahová stránka

744


18 Výchozí obsah

746

Vzory stránek a layout s tabulkami nebo s CSS

746

Vzory stránek a relativní cesty

749

Aplikování vzorů stránek prostřednictvím konfiguračního souboru

750

Pokročilé vzory stránek

751

Interakce s třídou vzoru stránek

751

Dynamické nastavení vzoru stránek

752

Vnořování vzorů stránek

753

Shrnutí

Kapitola 17

755

Navigace po webu

Stránky s více zobrazeními

757 758

Ovládací prvek MultiView

759

Ovládací prvek Wizard

763

Mapa webu

772

Definice mapy webu

772

Vázání k mapě webu

774

Navigační cesta

776

Zobrazení části mapy webu

778

Objekty mapy webu

782

Přidávání vlastních informací do mapy webu

783

Tvorba vlastního zprostředkovatele mapy webu

784

Personalizované mapy webu

791

Mapování a směrování URL

793

Mapování URL

793

Směrování URL

794

Ovládací prvek TreeView

796

Objekty TreeNode

797

Plnění uzlů na požádání

799

Styly TreeView

801

Ovládací prvek Menu

805

Styly pro ovládací prvek Menu

808

Šablony ovládacího prvku Menu

810

Shrnutí

812


19 Kapitola 18

Nasazování webů

Instalace a konfigurace IIS

813 813

Instalace IIS 7

814

Správa IIS 7

815

Jak na nasazení webu

817

Nasazení kopírováním souborů

818

Nasazení s nástrojem Web Deployment

822

Nasazení přes FTP Správa webu

832 838

Vytvoření nového webu

838

Vytváření virtuálních adresářů

839

Třída VirtualPathProvider

840

Fondy aplikací

844

Zahřívací kolo pro aplikace

847

Rozšíření integrovaného kanálu

848

Vytvoření obslužné rutiny

848

Nasazení obslužné rutiny

849

Konfigurace obslužné rutiny

849

Otestování obslužné rutiny

851

Shrnutí

Rejstřík

851

853


20

O autorech MATTHEW MACDONALD je autor, pedagog a Microsoft MVP. Přispívá do časopisů o programování a je autorem více než tuctu knih o programování .NET, například Pro Silverlight 3 in C# (Apress, 2009), Pro WPF in C# 2010 (Apress, 2010) a Beginning ASP.NET 4 in C# 2010 (Apress, 2010). V šerém dávnověku svého života studoval anglickou literaturu a teoretickou fyziku. V současnosti žije v Torontu se svou ženou a dcerou.

MARIO SZPUSZTA pracuje jako architekt ve skupině Developer and Platform Group společnosti Microsoft v Rakousku a pomáhá softwarovým architektům největších podniků a webovým zákazníkům se zaváděním nových technologií Microsoftu. Několik let se specializoval na vývoj bezpečného softwaru, webové služby a na integraci klientů a serverů Microsoft Office do zákaznických aplikací. Mario pravidelně přednáší na místních a mezinárodních konferencích, jako např. DevDays a TechEd Europe Developers. V posledních dvou letech byl držitelem technického obsahu TechEd Europe Developers.

ADAM FREEMAN je zkušený odborník v oblasti IT, který zastával vedoucí pozice v mnoha společnostech, naposledy jako CTO (chief technology officer) a COO (chief operating officer) v jisté bankovní společnosti s celosvětovou působností. Napsal několik knih o Javě a technologii .NET

O odborných korektorech Fabio Claudio Ferracchiati je plodný spisovatel se zaměřením na technologie. Fabio spolupracoval na více než tuctu knih o .NET, C#, Visual Basicu a ASP.NET. Je držitelem MCSD (Microsoft Certified Solution Developer) pro .NET a žije v Římě. Jeho blog naleznete na adrese http://www.ferracchiati.com. Todd Meister pracuje s technologiemi Microsoftu více než deset let. Jako technický redaktor se podílel na vydání více než padesáti knih tématicky sahajících od SQL Serveru až k .NET Frameworku. Se svou manželkou Kimberly a čtyřmi fantastickými dětmi žije v centrální Indianě.


21

Úvod Když se poprvé objevilo .NET, byla to malá lavina nových technologií. Najednou tu byl zcela nový způsob, jak psát webové aplikace (ASP.NET), zcela nový způsob, jak se připojovat k databázím (ADO.NET), nové, typově bezpečné jazyky (C# a VB .NET) a spravovaný runtime (CLR). Významnou novou technologií byly také formuláře Windows (Windows Forms), knihovna tříd pro budování aplikací Windows. Jak již bezpochyby víte, ASP.NET je nová generace technologií Microsoftu pro vytváření webových aplikací běžících na straně serveru. Je postavena na Microsoft .NET Frameworku, který je seskupením úzce souvisejících nových technologií, které přináší kompletní revoluci: od přístupu do databáze až po distribuované aplikace. ASP.NET je jednou z nejdůležitějších komponent .NET Frameworku – jedná se totiž o část, která vám umožní vyvíjet velmi výkonné webové aplikace. ASP.NET nemá problémy se získáním zájmu programátorů. Bez nadsázky můžeme říci, že ASP.NET je nejkompletnější platformou pro vývoj webu, která kdy byla sestavena. Převyšuje svého předchůdce ASP, které bylo navrženo jako "quick-and-dirty" sada nástrojů pro vkládání dynamického obsahu na běžné webové stránky. Oproti němu je ASP.NET 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 4. Pokud jste již programovali v předchozí verzi ASP.NET, můžete se zaměřit výhradně na nové funkce, mezi něž patří ASP.NET MVC (kapitola 32), ASP.NET Dynamic Data (kapitola 33) a Silverlight (kapitola 34). Všechny tyto kapitoly naleznete ve druhém dílu této knihy. 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ím 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, nappříklad s knihou Pro C# 2010 and .NET 4 Platform od Andrewa Troelsena (Apress, 2010).

Rozdělení knihy Vydavatelství Zoner Press v uplynulých letech vydalo několik knih popisujících problematiku ASP.NET a C#, například ASP.NET 3.5 a C# 2008 – tvorba dynamických stránek profesionálně, která vyšla v roce 2008, nebo ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně z roku 2006. Protože se ale jednalo o knihy, které se snažily pokud možno co nejvíce obsáhnout problematiku ASP.NET a C#, nepříznivě se to projevilo na velkém počtu stran těchto knih – který se blížil k číslu 1 600 – což znesnadňovalo jejich každodenní používání ve vývojářské praxi. Další vydání, tentokrát s názvem ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně proto bylo z praktických důvodů rozděleno do dvou samostatných knih (dílů). V knize 1, kterou právě držíte v ruce, se věnujeme základům ASP.NET, přístupu k datům a budování webů ASP.NET. Kniha 2 se pak věnuje pokročilejším záležitostem, jako je bezpečnost, pokročilé uživatelské rozhraní a nové technologie zahrnuté do ASP.NET (jako je ASP.NET MVC, Silverlight a ASP.NET Dynamic Data). Kniha 1 obsahuje tato témata:

Čá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, k nimž došlo v ASP.NET 4. V kapitole 2 se pustíte do zvládání svých "nezbytných prostředků k obživě" – zde jmenovitě Visual Studia 2010. 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áklady, podíváme se na to, jak ASP.NET zpracovává


22 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 kapitolách 7 a 8 si popíšeme základy ADO.NET a naučíme se navrhovat komponenty pro přístup k datům. V kapitolách 9 a 10 naleznete informace 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 vysoký výkon. Kapitoly 12, 13 a 14 vás přenesou mimo svět ADO. NET, protože si ukážeme, jak pracovat se soubory, s technologií LINQ a obsahem XML.

Část III – Budování webů ASP.NET. Třetí a poslední část knihy 1 se věnuje základních technikách a funkcionalitách určeným pro správu skupin 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 probereme motivy (které slouží pro automatickou stylizaci ovládacích prvků) a vzory stránek (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 nasazování aplikací a software webového serveru IIS.

Kniha 2 obsahuje tato témata:

Část IV – Bezpečnost. Kniha 2 bezprostředně navazuje na knihu 1. Začíná čtvrtou částí, kde se podíváte na bohatou sadu funkcionalit vztahujících se k zabezpečení ASP.NET. V kapitole 19 začneme s celkovým přehledem principů zabezpečení. Poté se společně podíváme na ověřování založené na formulářích (kapitola 20) a funkcionalitu členství, která s ní spolupracuje (kapitola 21). V kapitole 22 se budeme věnovat ověřování systému Windows a v kapitole 23 se naučíte, jak omezit ověřené 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 předem zhotovené řešení určené k ukládání informací specifických pro uživatele. S využitím informací z kapitoly 25 se naučíte šifrováním chrá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 zprostředkovatele členství.

Část V – Pokročilé uživatelské rozhraní. V této části si předvedeme, jakým způsobem lze rozšířit vaše webové stránky o různě pokročilé techniky. V kapitole 27 se podíváme na vlastní ovládací prvky. V kapitole 28 odbočíme k problematice GDI+ a ručně vytvářené grafiky. V kapitolách 29 a 30 budeme rozvažovat o tom, jak technikami JavaScriptu a Ajaxu učinit webové stránky dynamičtější (tím, že do nich včleníme takové efekty jako automatické dokončování textu a přetahování myší) a vstřícnější (tím, že budou reagovat na události na straně klienta a plynule aktualizovat webovou stránku). Nakonec v kapitole 31 detailně prozkoumáme funkcionalitu Web Parts ASP.NET, která vám jednoduchým způsobem umožní vytvářet webové portály.

Část VI – Nové směry. V této části se budeme zamýšlet nad několika nejvíce vzrušujícími inovacemi v moderním webovém vývoji. V kapitole 32 prozkoumáme ASP.NET MVC, což je nová alternativa ke klasickému modelu webových formulářů, která dává vývojářům kompletní kontrolu nad realizací HTML a nad strukturou URL. V kapitole 33 budete zvažovat ASP.NET Dynamic Data, což je perfektní řešení pro rychlé budování takových aplikací, které se točí okolo prohlížení a editování informací uložených v nějaké databázi. V poslední kapitole této knihy proniknete do kouzelného světa Silverlightu, což je plug-in Microsoftu do prohlížeče, který vám umožňuje rozšířit běžné webové stránky o bohatou grafiku, animace, zvuk a samozřejmě i video pro širokou paletu prohlížečů a operačních systémů.


23

Komu je tato kniha určena? Kniha je zamýšlena jako prvotní zdroj informací pro profesionální vývojáře, kteří mají slušné znalosti o webovém vývoji na straně serveru. Kniha neposkytuje vyčerpávající pohled na každou ingredienci nacházející se uvnitř .NET Frameworku – taková kniha by musela mít více než dvojnásobný počet stran. Proto se tato kniha raději zaměřuje na to, aby poskytla inteligentní úvod do ASP.NET pro profesionální programátory, kteří se nepotřebují zdržovat se základy. Průběžně se budete soustřeďovat na různá zákoutí .NET Frameworku, která potřebujete znát, abyste mohli budovat profesionální webové aplikace, mezi něž 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á. Nebudete se učit jen funkce ASP.NET, budete se také učit techniky ze skutečného světa, s jejichž pomocí budete moci převést svůj web na vyšší kvalitativní úroveň. Pozdější kapitoly knihy jsou zasvěcené břitkým tématům, jako jsou vlastní ovládací prvky, dynamická tvorba grafiky, pokročilá bezpečnost či vysoký výkon při přístupu k datům. Tohle všechno je potřebné pro vývoj profesionálních webových aplikací. Abyste mohli z této knihy vytěžit co nejvíce, měli byste se dobře vyznat v syntaxi jazyka C# a v pojmech objektově orientovaného programování. Nemusíte mít zkušenosti s předchozí verzí ASP.NET, protože veškeré potřebné věci se v této knize probírají. Pokud jste zkušenými programátory v jazycích Java nebo C++ bez jakýchkoliv zkušeností s .NET, měli byste raději začít s nějakou knihou, která se věnuje základům .NET, například "Pro C# 2010 and .NET 4 Platform" od Andrewa Troelsena (Apress, 2010).

Co potřebujete, abyste mohli pracovat s touto knihou? Chcete-li vyvíjet a testovat webové aplikace ASP.NET, potřebujete Visual Studio 2010. Přestože teoreticky se dá kód vytvářet ručně, je to nesmírně pracné, a to ani nemluvíme o vysoké pravděpodobnosti vzniku různých chyb. Tento ruční přístup se nikdy nepoužívá v profesionálních kruzích. Pokud také plánujete hostovat weby ASP.NET, musíte používat nějakou serverovou verzi Windows, např. Windows Server 2003 nebo Windows Server 2008. Rovněž si musíte nainstalovat IIS (Internet Information Services), což je software pro hostování webů. Webový server IIS, který se podrobněji popisuje v kapitole 18, je součástí operačního systému Windows. 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 a jiné funkce. Pro vyzkoušení těchto příkladů můžete používat libovolnou verzi SQL serveru, včetně SQL Server Express, která je součástí některých verzí Visual Studia (a volně ke stažení na stránkách http:// msdn.microsoft.com/express/database). Pokud budete používat nějaké jiné relační databáze, pravděpodobně se neobejdete bez drobných úprav kódu uvedeného v této knize.

Sdělte nám svůj názor Jako čtenáři této knihy se stáváte těmi nejdůležitějšími kritiky a komentátory. Vážíme si vašeho názoru a chtěli bychom vědět, co děláme správně, co bychom mohli dělat lépe, ve kterých oblastech bychom měli publikovat, a také bychom chtěli znát 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,


24 nebo e-mail. Pozorně zhodnotím vaše názory a poskytnu je autorovi a ostatním redaktorům, kteří pracovali na této knize. Prosím, vězte, že nemohu pomoci s technickými problémy, které se týkají obsahu knihy, a že díky velkému množství e-mailů, které dostávám, nemohu zaručit odpověď na každou zprávu. E-mail: miroslav.kucera@zoner.cz nebo knihy@zoner.cz. Adresa: ZonerPress, ZONER software, a.s, Miroslav Kučera, Nové sady 18, 602 00 Brno.

Zdrojové kódy Zdrojové soubory k této knize je možné stáhnout na této adrese (velikost 14 MB): http://zonerpress.cz/download/aspnet4-a-c2010.zip

Dále jsou k dispozici ke stažení dvě bonusové kapitoly (velikost 1.4 MB): http://www.zonerpress.cz/download/bonusove-kapitoly-aspnet.zip

Bonusové kapitoly K této knize jsou k dispozici dvě 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. POZNÁMKA Tyto bonusové kapitoly pocházejí z předchozích vydání této knihy. Informace z bonusových kapitol se ale vztahují i k ASP.NET 4, protože v něm se tyto funkce nezměnily.

Podívejte se, co v nich najdete:

Bonusová kapitola 1 (Zdroje a lokalizace). V této kapitole se popisuje, 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ří po třebují vytvořit webové stránky, které mají být k dispozici ve více jazykových variantách.

Bonusová kapitola 2 (Podpora návrhového režimu). V této kapitole se popisuje, jak můžete do svých vlastních ovládacích prvků přidat podporu návrhového režimu, aby se v prostředí Visual Studia přívětivě chovaly, samy zařizovaly serializaci svých vlastností a podporovaly pokročilé návrhářské funkce, jako jsou inteligentní značky.


43

KAPITOLA 2 Visual Studio S ASP.NET máte na výběr několik možností, jak vyvíjet webové aplikace. Máte-li neodolatelnou potřebu (a na množství práce nehledíte), můžete psát kód pro každou webovou stránku a třídu ručně v nějakém obyčejném textovém editoru. Ačkoliv takový přístup je až dojemně bezelstný, je dosti pracný a náchylný k chybám, pokud vytváříte cokoliv jiného než nějakou jednoduchou webovou stránku. Profesionální vývojáři ASP. NET se touto cestou vydávají jen výjimečně. Téměř všechny rozsáhlejší weby ASP.NET se budují pomocí Visual Studia. Je to profesionální vývojářský nástroj, který podporuje komplexní soustavu různých designérských nástrojů, včetně legendární sady nástrojů pro ladění, a také IntelliSense, jež při psaní kódu zachytává chyby a nabízí různá doporučení. Visual Studio také podporuje robustní model kódu v pozadí (code-behind), kdy se kód .NET, který píšete, odděluje od značek webové stránky. A aby bylo možné celé toto dílo korunovat, má Visual Studio zabudovaný vlastní webový server, který je určený pro testování, takže vytvořené weby je možné ladit snadno a bez různých zmatků. V této kapitole podnikneme projížďku po integrovaném vývojovém rozhraní (IDE) Visual Studia a ukážeme si dva způsoby, jak ve Visual Studiu vytvořit webovou aplikaci ASP.NET – buď jako základní web bez podpůrných souborů, nebo jako webový projekt. Dále se také seznámíme s modelem kódu, který se používá pro webové stránky ASP.NET, a s procesem kompilace, který se používá ve webových aplikacích ASP.NET. Nakonec se zběžně podíváte na Web Development Helper, což je ladicí nástroj založený na prohlížeči, který můžete využívat v součinnosti s Visual Studiem. CO JE NOVÉHO? Přestože se Visual Studio 2010 drží stejného základního modelu jako dřívější verze, prodělalo významný facelifting. A skutečně – Visual Studio 2010 bylo od základu přepsáno pomocí WPF (technologie Microsoftu pro uživatelská rozhraní založená na .NET), jehož výsledkem je čistší, modernější rozhraní. Většina změn spočívá v detailech, jako méně přeplácaná obrazovka a přímočařejší IntelliSense (viz sekci "Vylepšení Visual Studia 2010"). Ovšem vývojáři pracující s WPF nebo se Silverlightem (kapitola 34) konečně dostávají dlouho očekávaného návrháře, který umožňuje budovat uživatelská rozhraní tak, že přetahují a pouštějí ovládací prvky z Toolboxu (stejně jako v nějaké stránce ASP.NET).


44

Kapitola 2 – Visual Studio

Úvod do Visual Studia Psát a kompilovat kód ručně bývá těžkopádné a pracné. Proto IDE Visual Studia nabízí spoustu vysokoúrovňových funkcí, které zdaleka přesahují základní úroveň správy kódu. Mezi přednosti Visual Studia patří:

Integrovaný webový server. Abyste mohli hostovat nějakou webovou aplikaci ASP.NET, potřebujete webový server, jako je například IIS, který čeká na webové požadavky a obsluhuje odpovídající stránky. Příprava webového serveru je nicméně nepohodlná. Ovšem díky tomu, že je do Visual Studia integrován vývojový webový server, můžete spouštět weby přímo z prostředí vývojářského nástroje. Je to také lepší z hlediska bezpečnosti, protože víte, že žádný externí počítač nemůže spustit váš aktuálně testovaný web. Testovací server totiž akceptuje jen připojení z místního počítače.

Vývoj ve více jazycích. Visual Studio umožňuje psát kód v jednom nebo několika různých jazycích a přitom používat stále stejné rozhraní (IDE). Visual Studio také umožňuje vytvářet jednotlivé webové stránky v různých jazycích a zařadit je všechny do téže webové aplikace. Existují jen dvě následující omezení: v jedné webové stránce si musíte vystačit s jediným programovacím jazykem (protože jinak by vznikly očividné potíže s kompilací takového kódu) a musíte použít bezprojektový model webu (tj. ne webový projekt).

Píšete méně kódu. U většiny aplikací je potřeba vytvořit dost velké množství "vaty" v podobě kódu standardní povahy. Webové stránky ASP.NET nejsou v tomto ohledu žádnou výjimkou. Pokud například přidáte nějaký webový ovládací prvek, připojíte obsluhu událostí a přizpůsobíte formátování, je také potřeba nastavit řadu věcí v kódu stránky. Visual Studio ovšem automaticky nastaví tyto nezbytné podrobnosti za vás.

Intuitivní styl psaní kódu. Visual Studio standardně formátuje kód už v okamžiku, kdy jej vytváříte, automaticky jej odsazuje a používá různé barvy pro odlišení různých částí kódu, jako jsou třeba komentáře. Tyto zdánlivé drobnosti mají za následek, že je kód mnohem lépe čitelný a méně náchylný k chybám. Můžete si dokonce nakonfigurovat, jaké automatické formátování má Visual Studio používat, což je skvělé, pokud například preferujete jiný styl psaní složených závorek (jakým je například styl K&R, při kterém se otevírací složená závorka vkládá na řádek předchozí deklarace).

TIP Chcete-li se podívat, jaké formátovací volby máte k dispozici, zvolte Tools -> Options a přesvědčte se, že je zaškrtnuto políčko Show All Settings. Pak vyhledejte skupinu formátovacích nastavení Text Editor -> C#. Měli byste vidět několik voleb, které řídí způsob umisťování složených závorek.

Rychlejší vývoj. Mnohé ze schopností Visual Studia jsou zaměřeny tak, abyste dokázali udělat svou práci ještě rychleji. Funkce týkající se pohodlí umožňují vývojářům pracovat rychle a efektivně. Patří mezi ně IntelliSense (označuje chyby a doporučuje opravy), výkonné vyhledávání a nahrazování (dokáže vylovit klíčová slova nejen z jednoho souboru, ale i z celého projektu) či automatické převádění kódu na komentáře (takže snadno skryjete blok kódu) a zpět.

Ladění. Nástroje Visual Studia určené pro ladění jsou tím nejlepším způsobem, jak vystopovat mysteriózní chyby a diagnostikovat podivné chování. Svůj kód můžete vykonávat řádek po řádku, nastavovat inteligentní body přerušení (breakpoints), které si navíc můžete uschovat pro pozdější využití. Můžete si také prohlížet informace nacházející se v paměti počítače.


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

45

Visual Studio oplývá celou řadou dalších funkcí, které se v této kapitole vůbec nezmiňují – patří mezi ně například řízení projektů, integrované řízení zdrojového kódu, funkce pro refaktoraci kódu nebo bohatě vybavený model rozšiřitelnosti. Pokud navíc pracujete s Visual Studio Team Foundation Server 2010, získáte pokročilejší možnosti pro unit testy, týmovou spolupráci nebo pro podporu řízení verzí (je daleko mocnější než běžné jednodušší nástroje, jako je Visual SourceSafe). O Visual Studiu Team Foundation Server 2010 v této kapitole nehovoříme – další informace najdete na http://msdn.microsoft.com/teamsystem.

Weby a webové projekty Pro některé vývojáře může být trochu matoucí, že Visual Studio nabízí dva způsoby jak vytvořit webovou aplikaci, která je řízena technologií ASP.NET:

Vývoj založený na projektu. Když vytvoříte webový projekt, Visual Studio vygeneruje soubor projektu .csproj (za předpokladu, že kódujete v C#), kam zaznamená soubory, které máte v projektu, a kam také uloží několik nastavení pro potřeby ladění. Když pak spustíte webový projekt, Visual Studio zkompiluje veškerý váš kód do jediné assembly ještě předtím, než spustí webový prohlížeč.

Vývoj bez projektu. Alternativním přístupem je vytvořit prostý web bez projektového souboru. V takovém případě Visual Studio předpokládá, že každý soubor, který je v adresáři webu (a v jeho podadresářích), je součástí vaší webové aplikace. V tomto scénáři Visual Studio nepotřebuje předběžně kompilovat váš kód. ASP.NET zkompiluje váš web až tehdy, když poprvé požádáte o nějakou stránku. (Samozřejmě můžete použít tzv. předběžnou kompilaci, abyste u nasazené aplikace odstranili nadměrnou zátěž při prvním požadavku. Jak se to udělá, se vysvětluje v kapitole 18.)

První verze .NET Visual Studia používala model s projektem. Visual Studio 2005 odstranilo model s projektem a upřednostnilo vývoj bez projektu. Proti tomu však protestovala malá, ale významná skupina vývojářů. Když u Microsoftu zjistili, že skutečně existují specifické scénáře, v nichž se pracuje lépe, když se vyvíjejí s projektem, vydali doplněk, který se dal zdarma stáhnout a který do Visual Studia 2005 vrátil funkce pro vývoj s projektem. Ve Visual Studiu 2010 jsou podporovány obě alternativy. V této kapitole začnete vytvořením standardního webu bez projektu, protože je to jednodušší a přímočařejší přístup. Později se v této kapitole seznámíte se scénáři, které pracují lépe, když se vyvíjejí s projektem, a naučíte se vytvářet webové projekty.

Vytvoření webu bez projektu Protože se určitě ihned chcete pustit do konkrétní práce, zvolte File > New > Website. Visual Studio zobrazí dialog New Web Site (viz obrázek 2-1). Chcete-li vytvořit nový web, musíte nejprve zvolit vývojový jazyk (nalevo), verzi .NET (nahoře uprostřed), šablonu webu (uprostřed) a umístění (dole). Jakmile specifikujete všechny tyto podrobnosti, klikněte na tlačítko OK. Vytvoří se váš web. V příštích sekcích tyto podrobnosti trochu rozvineme.


46

Kapitola 2 – Visual Studio 1. Zvolte jazyk

2. Zvolte verzi .NET

3. Zvolte šablonu webu

4. Zvolte umístění

Obrázek 2-1. Okno New Web Site. SKRYTÝ SOUBOR ŘEŠENÍ Přestože vývoj bez projektu ulehčuje život, ze zákulisí pořád vykukují poslední pozůstatky systému Visual Studia, který byl založen na řešeních. Když vytvoříte webovou aplikaci, Visual Studio ve skutečnosti vytvoří soubory řešení (.sln a .suo) v nějakém adresáři specifickém pro uživatele, jako například c:\Users\[JménoUživatele]\Documents\Visual Studio 2010\Projects\[NázevSložkyWebu]. Soubory řešení poskytují několik funkcí specifických pro Visual Studio, které se přímo nevztahují k ASP.NET, jako jsou třeba nastavení týkající se ladění. Když například přidáte do kódu nějaké webové stránky bod přerušení (breakpoint) (bude to probráno později v sekci "Ladění ve Visual Studiu"), Visual Studio uloží tento bod přerušení do souboru .suo, takže bude k dispozici, až projekt otevřete někdy později. Obdobným způsobem Visual Studio sleduje aktuálně otevřené soubory, takže až se někdy později vrátíte do projektu, může vám zobrazit naposledy otevřené soubory. Tento přístup ke správě řešení je ale choulostivý – přesunete-li projekt z jednoho umístění na jiné, o všechny tyto informace přijdete. Protože však nejsou až tak důležité (dívejte se na ně jako na několik konkrétních nastavení projektu), jejich ztráta není žádnou tragédií. Všeobecné výhody tohoto systému bez projektů za tenhle kompromis stojí. Chcete-li trvalejší řešení, uložte soubory řešení explicitně do umístění, které sami zvolíte. Klikněte prostě v Průzkumníkovi řešení (Solution Explorer, reprezentuje vaše řešení) na horní položku. Pokud například otevřete složku s názvem MyWebSite, bude se horní položka jmenovat Solution 'MyWebSite'. Pak zvolte File -> Save [NázevŘešení] As. Tato technika se hodí, jestliže jste vytvořili řešení, v němž kombinujete několik aplikací (například nějaký web vytvořený bez projektu plus komponentu typu knihovna tříd) a chcete je editovat a ladit souběžně.


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

47

Vývojový jazyk Tímto jazykem identifikujete programovací jazyk .NET, v němž budete psát kód svého webu. Jazyk, který zvolíte, bude výchozím jazykem projektu. To znamená, že explicitně můžete přidat webové stránky Visual Basicu do webu napsaného v C# a naopak.

Verze .NET Frameworku Starší verze Visual Studia byly těsně svázané s konkrétními verzemi .NET. S Visual Studiem .NET jste vytvářeli aplikace .NET 1.0, s Visual Studiem .NET 2003 aplikace .NET 1.1 a s Visual Studiem 2005 aplikace .NET 2.0. Visual Studio 2008 toto omezení odstranilo tím, že bylo zacíleno na více verzí, a Visual Studio 2010 v tomto trendu pokračuje. Umožňuje vytvářet webové aplikace, které jsou navrženy tak, že se mohou provozovat s .NET 2.0, .NET 3.0, .NET 3.5 nebo .NET 4.0. Obvykle vybíráte nejnovější verzi, kterou podporuje váš webový server. Novější verze poskytují přístup k novějším funkcím a všechny příklady, které byly zařazeny do této knihy, jsou zacíleny na .NET 4. POZNÁMKA Nic vám samozřejmě nebrání, chcete-li si nainstalovat na webový server několik verzí .NET a nakonfigurovat několik virtuálních adresářů tak, aby používaly různé verze ASP.NET (popisuje se to v kapitole 18).

Aby se Visual Studio mohlo přesně zacílit na danou verzi, obsahuje pro každou verzi .NET tzv. referenční assembly (reference assemblies). Tyto assembly obsahují metadata všech typů, ale žádný kód požadovaný k jejich implementaci. To znamená, že Visual Studio 2010 může použít referenční assembly k tomu, aby přizpůsobilo na míru Intellisense a kontroly chyb tak, že nebudete moci používat ovládací prvky, třídy nebo členy, které nejsou dostupné v té verzi .NET, na kterou jste zacíleni. Pomocí těchto metadat také určuje, které ovládací prvky se mají objevit v Toolboxu, které členy se mají objevit v oknech Properties a Object Browser atd., aby zajistilo, že celé vývojové prostředí bude omezeno na verzi, kterou jste si zvolili. Verzi .NET, na kterou se chcete zacílit, můžete změnit i poté, co jste vytvořili web. Postupujte takto: 1. Zvolte Website > Start Options. 2. V seznamu nalevo zvolte kategorii Build. 3. V seznamu Target Framework zvolte verzi .NET, na kterou se chcete zacílit.

POZNÁMKA Ve webovém projektu je postup trochu jiný. V něm začnete tím, že v Průzkumníku řešení dvojitě kliknete na uzel Properties. Pak zvolte záložku Application, která obsahuje seznam Target Framework, v němž vyberete verzi .NET, na kterou se chcete zacílit.

Když změníte verzi .NET, Visual Studio poměrně značně upraví soubor web.config. Například soubor web.config pro aplikaci .NET 4 je stručný a přehledný, protože všechny potřebné podpůrné konstrukce jsou už připraveny v kořenovém souboru web.config počítače. Soubor web.config pro aplikaci .NET 3.5 ovšem zahrnuje pěknou porci "vaty", aby se explicitně zapnula podpora pro funkce Ajaxu a C# 3.5. Do obsahu souboru web.config se hlouběji zanoříte v kapitole 5.


Kapitola 2 – Visual Studio

48

Šablona Jakmile zvolíte jazyk (v seznamu nalevo), uvidíte seznam všech šablon, které Visual Studio poskytuje pro tento jazyk (ve velkém poli uprostřed). Šablona určuje, jaké soubory bude mít web na počátku. Visual Studio podporuje několik typů aplikací ASP.NET, ale všechny se kompilují a vykonávají stejně. Jediný rozdíl je v tom, jaké soubory Visual Studio standardně vytvoří na začátku. Pokud například vytvoříte WCF Service, Visual Studio vygeneruje web, který bude mít v sobě jen jedinou službu WCF (nikoliv webovou stránku ASP.NET). Následuje přehled dostupných šablon:

ASP.NET Web Site. Vytvoří plnohodnotný web ASP.NET, v němž už bude základní infrastruktura. Web bude obsahovat vzor stránek (master page), kde bude nadefinováno úhrnné rozvržení (se záhlavím, zápatím a pruhem nabídek), a rovnou použitelné stránky default.aspx a about.aspx. Web také bude obsahovat složku Accounts se stránkami pro registraci, pro přihlášení a pro změnu hesla a složku Scripts s knihovnou jQuery pro JavaScript na straně klienta.

ASP.NET Empty Web Site. Vytvoří téměř prázdný web. Bude obsahovat pouze očesaný konfigurační soubor web.config a nic jiného. Sem snadno doplníte další věci, jen co začnete kódovat.

TIP Jestliže je ASP.NET pro vás poměrně nové, začněte s volbou ASP.NET Empty Web Site. Až si přečtete ostatní kapitoly této knihy a naučíte se používat takové funkce, jako jsou vzory stránek a členství, budete lépe připraveni na to, abyste mohli skočit po hlavě do trochu spletitější šablony ASP.NET Web Site, pokud bude vyhovovat vašim potřebám.

ASP.NET Dynamic Data Entities Web Site. Vytvoří web ASP.NET, který používá funkci ASP.NET s názvem Dynamic Data, popisovanou v kapitole 33. Web je navržen tak, aby přistupoval k podkladové databázi pomocí modelu entit (Entity Model), zatímco podobně pojmenovaná šablona ASP.NET Dynamic Data LINQ to SQL Web Site používá starší přístup s LINQ to SQL.

WCF Service. Vytvoří službu WCF – knihovnu metod na straně serveru, které mohou volat vzdálení klienti (například aplikace Windows). Přestože v této knize model WCF podrobně neprobíráme, v kapitole 34 společně vytvoříme služby WCF pro poskytnutí funkcionality na straně serveru pro stránky Silverlightu.

ASP.NET Reports Web Site. Vytvoří web ASP.NET, který používá ovládací prvek ReportView a nástroj SQL Server Reporting Services (pro generování databázových reportů, které se mohou prohlížet a spravovat přes web). Obdobnou službu poskytuje i šablona ASP.NET s názvem Crystal Reports Web Site, používá však konkurenční software Crystal Reports.

Přestože většina vývojářů preferuje zahájit práce s šablonami ASP.NET Empty Web Site, nebo ASP.NET Web Site a hned začít kódovat, existují specializovanější šablony pro specifické typy webových aplikací. Chcete-li si je prohlédnout, klikněte v dialogu New Web Site zcela vlevo na záhlaví Online Templates. Bude chvilku trvat, než Visual Studio zkontaktuje webové servery Microsoftu. Jakmile se tak stane, přidá seznam podkategorií šablon, v každé z nich bude skupina hotových šablon. Vývojáři ASP.NET si například mohou stáhnout šablonu, chtějí-li vytvořit nějaký web DotNetNuke (který používá populární framework portálu DotNetNuke), nebo nějaký web ASP.NET MVC, který k autentizaci uživatelů používá OpenID.


335

KAPITOLA 8 Datové komponenty a sada dat V předchozí kapitole jste se poprvé podívali na ADO.NET a prozkoumali přístup k datům založený na připojení. Nyní nastal čas, abyste svůj kód pro přístup k datům vložili do aplikace s dobrým návrhem. V řádně zorganizované aplikaci se kód pro přístup k datům nikdy nevkládá přímo do stránek (do jejich souborů kódu v pozadí). Vkládá se do databázové komponenty určené k tomuto účelu. V této kapitole uvidíte, jak se vytvoří jednoduchá vlastní třída pro přístup k datům a jak se do ní přidávají oddělené metody pro jednotlivé činnosti, které potřebujete s daty dělat. Nejlepší na tom ale bude, že svou databázovou komponentu budete moci využívat všeobecně, protože nebude omezena jen na scénáře, v nichž se pracuje s kódem. V příští kapitole pak uvidíte, jak se vaše databázová komponenta zapojí do infrastruktury ASP.NET pro vázání dat. V této kapitole se budeme také zabývat odpojenými daty – tedy funkcemi ADO.NET, které se soustřeďují okolo pojmu sada dat (DataSet) a jež umožňují komunikovat s daty ještě dlouho poté, co jste ukončili připojení ke zdroji dat. Ve stránkách ASP.NET není povinné pracovat s objekty sady dat (DataSet). Nicméně vám poskytují mnohem větší flexibilitu při pohybu po datech, jejich filtrování a řazení – což jsou témata, která se probírají v této kapitole.

Budování komponenty pro přístup k datům V profesionálních aplikacích se databázový kód nevkládá přímo u klienta, ale zapouzdřuje se do třídy, která je vyhrazena pro tyto záležitosti. Pokud chce klient provést nějakou databázovou operaci, stačí vytvořit instanci této třídy a zavolat patřičnou metodu. Až budete vytvářet databázovou komponentu, měli byste dodržovat základní zásady uvedené v tomto oddílu. Tím zajistíte, že databázová komponenta bude dobře zapouzdřená a optimalizovaná, že se bude moci (pokud to bude potřeba) vykonávat v odděleném procesu, a že dokonce se bude moci použít i v konfiguraci složené z několika webových serverů, jejímž účelem je vyrovnávat zatížení.

Otevírejte a uzavírejte připojení rychle. Otevřete databázové připojení při každém volání metody a uzavřete je ještě předtím, než metoda skončí. Připojení


336

Kapitola 8 – Datové komponenty a sada dat by se nikdy nemělo ponechat otevřené mezi jednotlivými klientskými požadavky, přičemž klient by neměl mít žádnou kontrolu nad tím, jak se připojení získávají, nebo kdy se uvolňují. Pokud by klient měl tyto pravomoci, docházelo by k situacím, kdy se některé připojení neukončí tak rychle, jak je to možné, nebo že bude ponecháno omylem dlouho otevřené, což snižuje škálovatelnost systému.

Implementujte zpracování chyb. Pomocí zpracování chyb zajistěte, aby se připojení uzavírala i tehdy, když příkaz SQL vygeneruje nějakou výjimku. Uvědomte si, že počet možných připojení je omezený, a pokud je používáte zbytečně (byť jenom na několik sekund), může to mít opravdu značný dopad na celkový výkon.

Při návrhu aplikace dodržujte bezstavové praktiky. Všechny informace, které potřebuje nějaká metoda, předávejte v parametrech dané metody. Všechna získaná data pak vracejte prostřednictvím návratových hodnot. Vytvoříte-li třídu, která si bude udržovat nějaký stav, nemůžete ji snadno implementovat jako webovou službu nebo použít ve scénáři, kdy se vybalancovává zatížení. A dále: pokud je databázová komponenta hostována vně procesu, každé volání metody vytváří znatelnou zátěž. Také nezapomínejte, že pokud se vlastnosti nastavují opakovaným voláním metod, bude to trvat mnohem déle, než když se vyvolá jediná metoda se všemi těmito informacemi v podobě parametrů.

Klienti by neměli vydávat dotazy s příliš širokým záběrem. Každý dotaz by měl uvážlivě vybírat pouze ty sloupce, které jsou zapotřebí. Také byste měli vždy, když je to možné, omezovat výsledky pomocí klauzule WHERE. Pokud například získáváte záznamy objednávek, pravděpodobně půjde do dotazu vložit nějaké rozpětí od-do (nebo nějakou klauzuli SQL, jakou je třeba TOP 1000). Bez těchto bezpečnostních opatření může vaše aplikace z počátku pracovat uspokojivě, nicméně se bude postupně zpomalovat, jak databáze bude postupně narůstat a klienti budou provádět stále rozsáhlejší dotazy, které budou zatěžovat databázi i síť.

V dobré, přímočaře navržené databázové komponentě se používá separátní třída pro každou databázovou tabulku (nebo pro logicky provázanou skupinu tabulek). Všechny obvyklé činnosti při práci s databází, jako je vložení, odstranění nebo modifikace záznamu, se zabalují do oddělených bezstavových metod. A konečně – v každém volání databáze se používá nějaká uložená procedura, která je určena pro daný účel. Pečlivě vrstvený návrh ukazuje obrázek 8-1.

Obrázek 8-1. Vrstvený návrh s databázovou třídou. Jednoduchou databázovou komponentu předvádí následující příklad. Databázový kód se v něm nevkládá přímo do webové stránky, ale používá mnohem lepší návrhářský postup, protože odděluje kód do samostatné třídy, kterou lze používat na mnoha stránkách. Tato třída se dá (pokud je to potřeba) zkompilovat jako část oddělené komponenty. A kromě toho, připojovací řetězec se získává ze sekce <connectionStrings> souboru web.config, nepíše se explicitně do kódu. Databázová komponenta se ve skutečnosti skládá ze dvou tříd – ze třídy datového balíčku (data package class), která obaluje informace jediného záznamu (a jež je známa jako datová třída, data class), a ze třídy data-


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

337

bázových utilit, která provádí skutečné databázové operace pomocí kódu ADO.NET (a jež je známa jako třída přístupu k datům, data access class). V této kapitole se na komponentu, která obsahuje tyto dvě ingredience, odkazujeme jako na databázovou komponentu. V příštích oddílech se detailně seznámíte s velmi jednoduchou databázovou komponentou, která pracuje s jedinou tabulkou. POZNÁMKA Databázová komponenta ale nemusí nutně své akce vykonávat pomocí tříd ADO.NET. Například byste neměli přehlédnout možnosti LINQ to Entities (budeme je probírat v kapitole 13) a část prací zajistit prostřednictvím této technologie. Je ovšem žádoucí, abyste pro svou databázovou logiku vždy vytvořili separátní, bezstavovou komponentu, a to na základě zásad, které jsou popisovány v této kapitole.

Datová třída Aby se do databáze Northwind mohly informace snadněji vkládat i z ní vytahovat ven, bude rozumné, když vytvoříme třídu EmployeeDetails s údaji o zaměstnanci, která bude poskytovat všechny databázové sloupce jako veřejné vlastnosti. Kompletní kód této třídy vidíte zde: public class EmployeeDetails { private int employeeID; public int EmployeeID { get {return employeeID;} set {employeeID = value;} } private string firstName; public string FirstName { get {return firstName;} set {firstName = value;} } private string lastName; public string LastName { get {return lastName;} set {lastName = value;} } private string titleOfCourtesy; public string TitleOfCourtesy { get {return titleOfCourtesy;} set {titleOfCourtesy = value;} }


338

Kapitola 8 – Datové komponenty a sada dat

public EmployeeDetails(int employeeID, string firstName, string lastName, string titleOfCourtesy) { EmployeeID = employeeID; FirstName = firstName; LastName = lastName; TitleOfCourtesy = titleOfCourtesy; } }

Připomínáme, že do této třídy nejsou zařazeny všechny informace, které se nacházejí v tabulce Employees, protože chceme udržet náš příklad co nejstručnější. Když budujete datovou třídu, můžete se rozhodnout, že použijete automatické vlastnosti, což je funkcionalita jazyka C#, která vám umožňuje vytvořit obal vlastnosti a podkladovou privátní proměnnou prostřednictvím jediné konstrukce kódu, jak je to uvedeno zde: public int EmployeeID { get; set; }

Používáte-li automatické vlastnosti, vygeneruje se privátní proměnná automaticky v době kompilace, což znamená, že neznáte její název. V kódu musíte k této privátní proměnné vždy přistupovat prostřednictvím procedur vlastnosti. Kompilátor C# dále přidává kód, který získává a nastavuje privátní proměnnou pomocí stejné cesty, již byste použili, pokud byste tento kód napsali sami. Automatické proměnné sice vypadají podobně jako veřejné členské proměnné, ale důsledky používání automatických proměnných jsou diametrálně odlišné. Protože jsou automatické proměnné opravdové, plnohodnotné vlastnosti, můžete je později nahradit explicitní vlastností (potřebujete-li například přidat nějaký validační kód), aniž byste museli měnit veřejné rozhraní datové třídy nebo zasahovat do jiných tříd, které využívají datovou třídu. A obdobně – automatické vlastnosti mají veškerá metadata explicitních vlastností, takže v klíčových programovacích scénářích pracují jako vlastnosti. Na rozdíl od veřejných členských proměnných automatické vlastnosti podporují například techniky pro vázání dat (viz kapitolu 9).

Uložené procedury Než můžete začít programovat logiku přístupu k datům, musíte už mít připravenou sadu uložených procedur, jimiž se budou informace získávat, vkládat a aktualizovat. Následující databázový skript vytváří pět uložených procedur, které jsou k tomu zapotřebí: CREATE PROCEDURE InsertEmployee @EmployeeID

int OUTPUT,

@FirstName

varchar(10),

@LastName

varchar(20),

@TitleOfCourtesy varchar(25) AS INSERT INTO Employees (TitleOfCourtesy, LastName, FirstName, HireDate) VALUES (@TitleOfCourtesy, @LastName, @FirstName, GETDATE()); SET @EmployeeID = @@IDENTITY


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

339

GO CREATE PROCEDURE DeleteEmployee @EmployeeID

int

AS DELETE FROM Employees WHERE EmployeeID = @EmployeeID GO CREATE PROCEDURE UpdateEmployee @EmployeeID

int,

@TitleOfCourtesy varchar(25), @LastName

varchar(20),

@FirstName

varchar(10)

AS UPDATE Employees SET TitleOfCourtesy = @TitleOfCourtesy, LastName = @LastName, FirstName = @FirstName WHERE EmployeeID = @EmployeeID GO CREATE PROCEDURE GetAllEmployees AS SELECT EmployeeID, FirstName, LastName, TitleOfCourtesy FROM Employees GO CREATE PROCEDURE CountEmployees AS SELECT COUNT(EmployeeID) FROM Employees GO CREATE PROCEDURE GetEmployee @EmployeeID

int

AS SELECT EmployeeID, FirstName, LastName, TitleOfCourtesy FROM Employees WHERE EmployeeID = @EmployeeID GO

Třída přístupu k datům (databázové utility) Ještě potřebujete třídu databázových utilit, která bude provádět skutečné databázové operace. Tato třída bude využívat uložené procedury vypsané v předchozím oddílu. V našem příkladu jsme třídě databázových utilit přidělili název EmployeeDB. Zapouzdřuje veškerý kód pro přístup k datům a podrobnosti specifické pro danou databázi. Podívejte se na její osnovu:


340

Kapitola 8 – Datové komponenty a sada dat

public class EmployeeDB { private string connectionString; public EmployeeDB() { // Získá výchozí připojovací řetězec. connectionString = WebConfigurationManager.ConnectionStrings[ "Northwind"].ConnectionString; } public EmployeeDB(string connectionString) { // Nastaví specifikovaný připojovací řetězec. this.connectionString = connectionString; } public int InsertEmployee(EmployeeDetails emp) { ... } public void DeleteEmployee(int employeeID) { ... } public void UpdateEmployee(EmployeeDetails emp) { ... } public EmployeeDetails GetEmployee() { ... } public List<EmployeeDetails> GetEmployees() { ... } public int CountEmployees() { ... } }

POZNÁMKA Možná jste si všimli, že třída EmployeeDB používá metody instance, nikoliv statické metody. Je to kvůli tomu, že i když třída EmployeeDB neukládá žádný stav pocházející z databáze, ukládá připojovací řetězec jako privátní členskou proměnnou. Protože se jedná o instanční třídu, připojovací řetězec je možné získat pokaždé, když se ze třídy vytvoří objekt (instance), přičemž se to nemusí dělat pokaždé, když se volá nějaká metoda. Při tomto přístupu je kód trochu přehlednější a bude o něco rychlejší (nebudeme muset tolikrát číst ze souboru web.config). Celkový zisk z toho všeho je ovšem dosti malý, takže klidně můžete v databázových komponentách používat statické metody.

Ve všech metodách se používá stejný pečlivý přístup, kdy se výlučně spoléháme na uloženou proceduru, která bude jako jediná komunikovat s databází. Podívejte se na následující kód pro vložení záznamu. Předpokládá se v něm, že jste importovali jmenný prostor System.Data.SqlClient: public int InsertEmployee(EmployeeDetails emp) { SqlConnection con = new SqlConnection(connectionString);


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

341

SqlCommand cmd = new SqlCommand("InsertEmployee", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar, 10)); cmd.Parameters["@FirstName"].Value = emp.FirstName; cmd.Parameters.Add(new SqlParameter("@LastName", SqlDbType.NVarChar, 20)); cmd.Parameters["@LastName"].Value = emp.LastName; cmd.Parameters.Add(new SqlParameter("@TitleOfCourtesy",SqlDbType.NVarChar, 25)); cmd.Parameters["@TitleOfCourtesy"].Value = emp.TitleOfCourtesy; cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4)); cmd.Parameters["@EmployeeID"].Direction = ParameterDirection.Output; try { con.Open(); cmd.ExecuteNonQuery(); return (int)cmd.Parameters["@EmployeeID"].Value; } catch (SqlException err) { // Nahradí informace o chybě něčím méně konkrétním. // Zde také můžete chybu někam zaprotokolovat. throw new ApplicationException("Data error."); } finally { con.Close(); } }

Jak sami vidíte, metoda přijímá data v podobě datového objektu EmployeeDetails. Jakékoliv chyby budou zachyceny, takže citlivé interní podrobnosti o chybě nebudou vráceny do kódu webové stránky. Tím se zabraňuje tomu, aby webová stránka poskytovala takové informace, které by se daly případně zneužít jako exploity při útocích. Zde je také ideální místo pro volání vhodné metody z nějaké protokolovací komponenty, která by uložila kompletní podrobnosti o vzniklé chybě do protokolu událostí nebo do nějaké jiné databáze. Metody GetEmployee() a GetEmployees() vracejí data pomocí jediného objektu EmployeeDetails, respektive pomocí seznamu objektů EmployeeDetails: public EmployeeDetails GetEmployee(int employeeID) { SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("GetEmployee", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4)); cmd.Parameters["@EmployeeID"].Value = employeeID; try


Kapitola 8 – Datové komponenty a sada dat

342 {

con.Open(); SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow); // Zkontroluje, zda dotaz vrátil nějaký záznam. if (!reader.HasRows) return null; // Získá první řádek. reader.Read(); EmployeeDetails emp = new EmployeeDetails( (int)reader["EmployeeID"], (string)reader["FirstName"], (string)reader["LastName"], (string)reader["TitleOfCourtesy"]); reader.Close(); return emp; } catch (SqlException err) { throw new ApplicationException("Data error."); } finally { con.Close(); } } public List<EmployeeDetails> GetEmployees() { SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("GetAllEmployees", con); cmd.CommandType = CommandType.StoredProcedure; // Vytvoří kolekci pro záznamy zaměstnanců. List<EmployeeDetails> employees = new List<EmployeeDetails>(); try { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { EmployeeDetails emp = new EmployeeDetails( (int)reader["EmployeeID"], (string)reader["FirstName"], (string)reader["LastName"], (string)reader["TitleOfCourtesy"]); employees.Add(emp); } reader.Close(); return employees;


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

343

} catch (SqlException err) { throw new ApplicationException("Data error."); } finally { con.Close(); } }

Metoda UpdateEmployee() hraje speciální roli. Určuje strategii simultánního zpracování databázové komponenty (viz pozdější oddíl "Strategie simultánního zpracování"). Tady je její kód: public void UpdateEmployee(int EmployeeID, string firstName, string lastName, string titleOfCourtesy) { SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("UpdateEmployee", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar, 10)); cmd.Parameters["@FirstName"].Value = firstName; cmd.Parameters.Add(new SqlParameter("@LastName", SqlDbType.NVarChar, 20)); cmd.Parameters["@LastName"].Value = lastName; cmd.Parameters.Add(new SqlParameter("@TitleOfCourtesy", SqlDbType.NVarChar,25)); cmd.Parameters["@TitleOfCourtesy"].Value = titleOfCourtesy; cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4)); cmd.Parameters["@EmployeeID"].Value = EmployeeID; try { con.Open(); cmd.ExecuteNonQuery(); } catch (SqlException err) { throw new ApplicationException("Data error."); } finally { con.Close(); } }


344

Kapitola 8 – Datové komponenty a sada dat

Posledními dvěma ingrediencemi jsou metody DeleteEmployee() a CountEmployees(): public void DeleteEmployee(int employeeID) { SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("DeleteEmployee", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4)); cmd.Parameters["@EmployeeID"].Value = employeeID; try { con.Open(); cmd.ExecuteNonQuery(); } catch (SqlException err) { throw new ApplicationException("Data error."); } finally { con.Close(); } } public int CountEmployees() { SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("CountEmployees", con); cmd.CommandType = CommandType.StoredProcedure; try { con.Open(); return (int)cmd.ExecuteScalar(); } catch (SqlException err) { throw new ApplicationException("Data error."); } finally { con.Close(); } }


543

KAPITOLA 12 Soubory a proudy Většina webových aplikací se spoléhá především na databáze, když mají ukládat informace. Databáze jsou nepřekonatelné ve víceuživatelských situacích. Zpracovávají bez jakýchkoliv potíží simultánní scénáře, přičemž podporují cachování a nízkoúrovňové optimalizace disku, což zaručuje vynikající výkon. Stručně a jasně řečeno: RDBMS (Relational Database Management System) nabízí nejrobustnější a nejvýkonnější úložiště dat. Samozřejmě, většina vývojářů nevyhnutelně tu a tam čelí scénářům, kdy je potřeba přistupovat k datům z jiných umístění, například ze systému souborů. Jako běžně se vyskytující situaci můžeme uvést čtení informací, které vyprodukovala jiná aplikace, či rychlý zápis informací do rychle spíchnutého protokolu pro potřeby testování nebo vytvoření administrační stránky, která by administrátorům umožnila nahrávat soubory na server a prohlížet, co je momentálně na serveru umístěno. V této kapitole se dozvíte, jak se pracuje s třídami jmenného prostoru System.IO, chcete-li získávat informace o souborech, pracovat s cestami souborů jako s řetězci, zapisovat do souborů a číst je nebo serializovat objekty.

Práce se systémem souborů Na nejjednodušší úrovni se při přístupu k souborům získávají informace o tom, jaké existují soubory a adresáře, co v nich je, a provádějí se typické systémové operace se soubory (jako je kopírování souborů a vytváření adresářů). Při těchto úlohách neotvíráte soubory, a ani do nich nezapisujete (tyto činnosti probereme v kapitole později). .NET Framework poskytuje pro získávání informací o systému souborů několik základních tříd. Všechny jsou umístěny ve jmenném prostoru System.IO a není náhodou, že tyto třídy se používají vždy stejným způsobem, ať už se jedná o webové aplikace nebo desktopové aplikace. Patří sem tyto třídy:

Directory a File. Poskytují statické metody pro získávání informací o souborech a adresářích, které jsou viditelné z vašeho serveru.

DriveInfo, DirectoryInfo a FileInfo. Tyto třídy používají podobné instanční metody a vlastnosti pro získávání stejných informací.


544

Kapitola 12 – Soubory a proudy

Obě sady tříd poskytují obdobné metody a vlastnosti. Klíčovým rozdílem je to, že než můžete zavolat nějakou metodu z té druhé skupiny, musíte nejprve vytvořit objekt typu DirectoryInfo nebo FileInfo, zatímco statické metody tříd Directory a File jsou dostupné stále. Typicky jsou třídy Directory a File pohodlnější pro jednorázové úlohy. Oproti tomu, pokud potřebujete získávat několik druhů informací, je lepší, když si vytvoříte objekty typu DirectoryInfo nebo FileInfo. Pak se nebudete muset zdržovat uváděním názvu adresáře nebo souboru při každém volání metody. Také je to rychlejší, protože třídy DirectoryInfo a FileInfo provádějí vlastní testy bezpečnosti pouze jednou – když vytvoříte instanci objektu. Třídy Directory a File provádějí bezpečnostní kontroly při každém volání metody.

Třídy Directory a File Třídy Directory a File poskytují řadu užitečných metod. Jejich přehled předkládají tabulky 12-1 a 12-2. Připomínáme, že každá metoda přebírá stejný parametr: plně kvalifikovanou cestu identifikující adresář či soubor, nad kterým chcete vykonat danou operaci. Tabulka 12-1. Metody třídy Directory. Metoda

Popis

CreateDirectory()

Vytvoří nový adresář. Specifikujete-li nějaký adresář uvnitř jiného neexistujícího adresáře, ASP.NET důvtipně vytvoří všechny požadované adresáře.

Delete()

Odstraní odpovídající prázdný adresář. Chcete-li odstranit adresář spolu s jeho obsahem (podadresáři a soubory), přidejte nepovinný druhý parametr true.

Exists()

Vrací true nebo false, čímž indikuje, zdali zadaný adresář existuje nebo ne.

GetCreationTime()

Vrací objekt typu DateTime reprezentující časový okamžik, kdy byl adresář vytvořen, resp. kdy se k němu naposled přistoupilo, resp. kdy se do něho naposled zapisovalo. Každá metoda začínající na "Get" má odpovídající metodu začínající na "Set", které v této tabulce uvedené nejsou.

GetLastAccessTime() GetLastWriteTime()

GetDirectories() GetFiles()

Vrací pole řetězců, jeden pro každý podadresář, resp. soubor ve specifikovaném adresáři. Do metod se dá jako druhý parametr předat vyhledávací výraz (například výraz ASP*.*).

GetLogicalDrives()

Vrací pole řetězců, jeden pro každou jednotku definovanou na aktuálním počítači. Písmena jednotek se uvádějí ve tvaru c:\.

GetParent()

Provede rozklad předaného řetězce adresáře a vrátí rodičovský adresář. Můžete to udělat i sami tak, že vyhledáte znak \ (nebo obecněji pomocí Path. DirectorySeparatorChar), tato funkce však trochu ulehčuje život.

GetCurrentDirectory()

Umožňuje získat, resp. nastavit, aktuální adresář, což se hodí, potřebujete-li pracovat s relativními cestami, a nikoliv s úplnými cestami. Na tyto funkce byste se však obecně spoléhat neměli – používejte raději úplné cesty.

SetCurrentDirectory() Move()

Přebírá dva parametry: zdrojovou cestu a cílovou cestu. Adresář a veškerý jeho obsah se dá přesunout na jakoukoliv cestu, pokud se nachází na stejné jednotce.


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

545

Metoda

Popis

GetAccessControl()

Vrací objekt System.Security.AccessControl.DirectorySecurity. Pomocí tohoto objektu můžete prozkoumávat seznamy Windows pro řízení

SetAccessControl()

přístupu k adresáři (ACL, Access Control List), které se aplikují na daný adresář. Je dokonce možné je měnit programátorsky.

Tabulka 12-2. Metody třídy File. Metoda

Popis

Copy()

Přebírá dva parametry: plně kvalifikovaný název zdrojového souboru a plně kvalifikovaný název cílového souboru. Chcete-li povolit přepis existujícího souboru, použijte přetíženou variantu, která přebírá třetí logický parametr (nastavte jej na true).

Delete()

Odstraní specifikovaný soubor, ale nevygeneruje žádnou výjimku, když se soubor nenajde.

Exists()

Vrací true, nebo false, podle toho, zdali specifikovaný soubor existuje nebo ne.

GetAttributes()

Získá, resp. nastaví, výčtovou hodnotu, která může obsahovat libovolnou kombinaci hodnot z výčtu FileAttributes.

SetAttributes() GetCreationTime() GetLastAccessTime() GetLastWriteTime()

Vrací objekt typu DateTime, který reprezentuje časový okamžik, kdy byl soubor vytvořen, resp. kdy se k němu naposled přistoupilo, resp. kdy se do něho naposled zapisovalo. Každá metoda začínající na "Get" má odpovídající metodu začínající na "Set", které v této tabulce uvedené nejsou.

Move()

Přebírá dva parametry: plně kvalifikovaný název zdrojového souboru a plně kvalifikovaný název cílového souboru. Soubor můžete přesunout i na jinou jednotku a při přesunu ho zároveň přejmenovat (nebo ho přejmenovat, aniž byste ho přesunuli jinam).

CreateText()

Vytvoří specifikovaný soubor a vrátí objekt typu FileStream, s jehož pomocí pak můžete do souboru zapisovat. CreateText() dělá totéž, ale vrací objekt typu StreamWriter obalující proud.

Open()

Open() otevře soubor (za předpokladu, že existuje). OpenText() a OpenRead() otevřou soubor pouze pro čtení a vracejí FileStream, resp. StreamReader. OpenWrite() otevře soubor pouze pro zápis a vrátí FileStream.

OpenWrite() OpenRead() OpenText() ReadAllText() ReadLines() ReadBytes()

Přečte celý soubor a vrátí jeho obsah jako jediný řetězec, nebo pole řetězců (jeden řetězec pro každý řádek), nebo jako pole bajtů. Tyto metody volejte pouze na velmi malé soubory. U větších souborů používejte proudy a čtěte je po úsecích, abyste snížili nároky na paměť.


546

Kapitola 12 – Soubory a proudy

Metoda

Popis

WriteAllText()

Zapíše celý soubor najednou pomocí dodaného řetězce, pole řetězců (jeden pro každý řádek), nebo pole bajtů. Jestliže už soubor existuje, přepíše se.

WriteLines() WriteBytes() GetAccessControl() SetAccessControl()

Vrací, resp. nastavuje, objekt System.Security.AccessControl.FileSecurity. Pomocí tohoto objektu můžete prozkoumávat seznamy Windows pro řízení přístupu k adresáři (ACL, Access Control List), které se aplikují na daný adresář. Je dokonce možné je měnit programátorsky.

TIP Jedinou věc, kterou třída File postrádá (a již poskytuje třída FileInfo), je možnost získat velikost zadaného souboru.

Metody tříd File a Directory jsou zcela intuitivní. Například – následujícím kódem si můžete dynamicky vypsat seznam názvů všech souborů v aktuálním adresáři: string directoryName = @"c:\Temp"; // Získá seznam souborů a zobrazí ho na stránce. string[] fileList = Directory.GetFiles(directoryName); foreach (string file in fileList) { lstFiles.Items.Add(file); }

V tomto příkladu je před řetězcem s cestou adresáře c:\Temp uveden znak zavináč (@). Tím se C# říká, aby interpretoval řetězec přesně tak, jak je napsaný. Kdyby tam zavináč nebyl, předpokládal by C#, že znak oddělovače pro úrovně adresářů (\) vyjadřuje začátek speciální posloupnosti znaků (tedy to, že účelem znaku je předznačit následující znak). Jinou volbou je použít přímo předznačenou posloupnost \\, kterou C# pochopí jako jediný znak obrácené lomítko. V takovém případě byste cestu zapsali ve tvaru c:\\Temp. Protože je seznam souborů prostě seznamem obyčejných řetězců, dá se snadno svázat s nějakým ovládacím prvkem seznamu, takže dospějeme k efektivnější syntaxi pro zobrazení souborů na stránce: string directoryName = @"c:\Temp"; lstFiles.DataSource = Directory.GetFiles(directoryName); lstFiles.DataBind();

POZNÁMKA Aby výše uvedený kód mohl fungovat, musí mít účet, pod kterým běží zpracovatelský proces ASP.NET, přidělená patřičná oprávnění k adresáři, s nímž chcete pracovat. Jinak se při pokusu webové stránky přistoupit k systému souborů vygeneruje výjimka SecurityException. Oprávnění daného adresáře můžete upravit tak, že na něm kliknete pravým tlačítkem myši, vyberete Vlastnosti (Properties) a kliknete na záložku Zabezpečení (Security). Obvykle by to mělo probíhat hladce, pokud testujete aplikaci s integrovaným webovým serverem Visual Studia, který běží pod vaším uživatelským účtem. Snadno se ovšem můžete dostat do potíží, až svůj web nasadíte. V takovém případě bude potřeba, abyste udělili patřičná oprávnění skupině IIS_USRS (nebo modifikovat účet, který bude používat váš web). Další informace naleznete v kapitole 18.


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

547

Třídy DirectoryInfo a FileInfo Ve třídách DirectoryInfo a FileInfo se zrcadlí funkcionalita tříd Directory a File. Kromě toho usnadňují procházky po adresářích a souborech. Například můžete snadno získat objekty FileInfo souborů v nějakém adresáři reprezentovaném objektem DirectoryInfo. Připomínáme, že třídy Directory a File vystavují pouze metody. Třídy DirectoryInfo a FileInfo poskytují metody i vlastnosti. Například třída File má samostatné metody GetAttributes() a SetAttributes(), kdežto třída FileInfo vystavuje vlastnost Attributes, kterou lze číst i nastavovat. Jinou příjemnou věcí tříd DirectoryInfo a FileInfo je to, že sdílejí společnou sadu vlastností a metod, protože jsou obě odvozeny ze společné základní třídy FileSystemInfo. Jejich společné členy viz tabulka 12-3. Tabulka 12-3. Členy tříd DirectoryInfo a FileInfo. Člen Attributes

Popis Umožňuje získat nebo nastavit atributy pomocí kombinace hodnot z výčtu FileAttributes.

CreationTime LastAccessTime

Umožňuje získat nebo nastavit čas vytvoření, čas posledního přístupu, resp. čas poslední modifikace pomocí objektu typu DateTime.

LastWriteTime Exists

Vrací true nebo false podle toho, zdali soubor, resp. adresář, existuje. Jinak řečeno: můžete vytvářet objekty FileInfo a DirectoryInfo, jimž neodpovídá žádný skutečný fyzický adresář, resp. soubor. V takovém případě samozřejmě nebudete moci používat vlastnosti jako CreationTime, nebo metody jako je MoveTo().

FullName

FullName vrací řetězec reprezentující plně kvalifikovaný název adresáře nebo souboru, Name název adresáře nebo souboru (s příponou), Extension samotnou příponu ná-

Name Extension

zvu adresáře nebo souboru.

Delete()

Odstraní soubor nebo adresář, pokud existuje. Odstraňujete-li adresář, musí být prázdný, nebo musíte specifikovat nepovinný parametr nastavený na true.

Refresh()

Aktualizuje objekt, takže bude synchronizován se všemi změnami v systému souborů, k nimž mezitím došlo (když byl například ručně změněn nějaký atribut souboru z Průzkumníka Windows).

Create()

Vytvoří uvedený adresář nebo soubor.

MoveTo()

Zkopíruje adresář a jeho obsah, nebo soubor. U objektu DirectoryInfo specifikujete novou cestu, u objektu FileInfo cestu a název souboru.

Třídy FileInfo a DirectoryInfo mají kromě toho několik jedinečných členů, které jsou uvedeny v tabulkách 12-4 a 12-5. Tabulka 12-4. Jedinečné členy třídy DirectoryInfo. Člen

Popis

Parent

Vracejí objekt DirectoryInfo reprezentující rodičovský, resp. kořenový adresář.

Root


548

Kapitola 12 – Soubory a proudy

Člen

Popis

CreateSubdirectory()

Vytvoří adresář s uvedeným názvem v adresáři, který je reprezentovaném objektem DirectoryInfo. Vrátí také nový objekt DirectoryInfo reprezentující podadresář.

GetDirectories()

Vrátí pole objektů DirectoryInfo, které reprezentují všechny adresáře obsažené v adresáři, pro který se metoda volá.

GetFiles()

Vrátí pole objektů FileInfo, které reprezentují všechny soubory obsažené v adresáři, pro který se metoda volá.

Table 12-5. Jedinečné členy třídy FileInfo. Člen

Popis

Directory

Vrací objekt DirectoryInfo reprezentující rodičovský adresář.

DirectoryName

Vrací řetězec názvu rodičovského adresáře.

Length

Vrací dlouhé celé číslo (typ long, 64bitové) vyjadřující velikost souboru v bajtech.

CopyTo()

Zkopíruje soubor na novou cestu a pod novým názvem, obojí uvedete jako parametr. Vrátí také nový objekt FileInfo reprezentující nový (resp. zkopírovaný) soubor. Můžete také specifikovat nepovinný parametr s hodnotou true, čímž povolíte přepis.

Create()

Vytvoří specifikovaný soubor a vrátí objekt FileStream, s jehož pomocí pak můžete do souboru zapisovat. CreateText() dělá totéž, ale vrací objekt StreamWriter obalující proud.

CreateText() Open() OpenRead() OpenText()

Otevře soubor (za předpokladu, že existuje). OpenRead() a OpenText() otevřou soubor pouze ke čtení a vrátí FileStream, resp. StreamReader. OpenWrite() otevře soubor pouze pro zápis a vrátí FileStream.

OpenWrite()

Když vytváříte objekt DirectoryInfo nebo FileInfo, specifikujte v konstruktoru úplnou cestu, jak to vidíte zde: DirectoryInfo myDirectory = new DirectoryInfo(@"c:\Temp"); FileInfo myFile = new FileInfo(@"c:\Temp\readme.txt");

Když vytváříte nový objekt DirectoryInfo nebo FileInfo, obdržíte výjimku, pokud cesta není formálně správná (například tehdy, když obsahuje nepovolené znaky). Zadaná cesta ale nemusí odpovídat skutečnému fyzickému adresáři nebo souboru. Pokud si nejste jisti, můžete pomocí Exists zkontrolovat, zdali adresář nebo soubor opravdu existují. Jestliže soubor nebo adresář neexistuje, můžete ho vytvořit metodou Create(). Ukázka: // Definuje nový adresář a soubor. DirectoryInfo myDirectory = new DirectoryInfo(@"c:\Temp\Test"); FileInfo myFile = new FileInfo(@"c:\Temp\Test\readme.txt");


ASP.NET 4 a C# 2010 – tvorba dynamických stránek profesionálně

549

// Nyní je vytvoří. Na pořadí zde záleží. // Nemůžete vytvořit soubor v adresáři, který ještě neexistuje. myDirectory.Create(); FileStream stream = myFile.Create(); stream.Close();

Objekty FileInfo a DirectoryInfo získají informace ze systému souborů, když se jich poprvé dotážete na nějakou vlastnost. Při dalším používání už nekontrolují nové informace. To může vést k různým nekonzistencím, jestliže se soubor mezitím změnil. Pokud víte (nebo máte podezření), že se informace o daném objektu ze systému souborů změnila, zavolejte metodu Refresh(), abyste získali nejčerstvější informace. Třída DirectoryInfo neposkytuje žádnou vlastnost, s níž by se dala zjistit celková velikost adresáře. Můžete ovšem velmi snadno spočítat celkovou velikost všech souborů v konkrétním adresáři. Jednoduše sečtěte jednotlivé hodnoty FileInfo.Length. Než se do toho pustíte, rozmyslete si, zdali chcete do celkového součtu zahrnout také podadresáře. Následující metoda umožňuje použít oba přístupy: private static long GetDirectorySize(DirectoryInfo directory, bool includeSubdirectories) { long totalSize = 0; // Přičítá velikosti jednotlivých souborů. FileInfo[] files = directory.GetFiles(); foreach (FileInfo file in files) { totalSize += file.Length; } // Jestliže se to požaduje, přičte i velikosti podadresářů. if (includeSubdirectories) { DirectoryInfo[] dirs = directory.GetDirectories(); foreach (DirectoryInfo dir in dirs) { totalSize += CalculateDirectorySize(dir, true); } } return totalSize; }

Potřebujete-li získat informace o volném místu na nějaké jednotce, obraťte se na třídu DriveInfo.

Třída DriveInfo Třída DriveInfo umožňuje získávat informace o diskových jednotkách počítače. Několik takových informací vás může hodně zajímat – DriveInfo se typicky využívá pro zjištění, kolik je volného a kolik zabraného místa na dané jednotce. Členy třídy DriveInfo jsou vypsány v tabulce 12-6. Na rozdíl od tříd FileInfo a DirectoryInfo zde není k dispozici žádná třída Drive, která by poskytovala instanční verze těchto metod.


Matthew MacDonald, Adam Freeman, Mario Szpuszta

ASP.NET 4 a C# 2010 TVORBA DYNAMICKÝCH STRÁNEK PROFESIONÁLNĚ

KNIHA 1

ASP.NET je výkonná technologie Microsoftu určená pro vytváření webových aplikací běžících na straně serveru. Prostřednictvím této rozsáhlé publikace, která byla z praktických důvodů rozdělena do dvou samostatných knih, se můžete naučit všechno, co potřebujete ke zvládnutí ASP.NET 4 a C# 2010. Pokud jste již někdy předtím programovali v předchozí verzi ASP.NET, můžete se zaměřit pouze na některé (pro vás důležité) části nebo na nové funkce, například ASP.NET MVC, Silverlight či ASP.NET Dynamic Data, které jsou obsahem KNIHY 2. Pokud jste nikdy v ASP.NET neprogramovali, KNIHA 1 vám nabízí vhodné tempo výuky umožňující v krátkém čase projít všechny základní věci, které potřebujete znát v každodenní vývojářské praxi. Publikace, na které se podíleli tři zkušení autoři (Matthew MacDonald, Adam Freeman a Mario Szpuszta), obsahuje spoustu praktických příkladů a technik z reálného světa.

ZONER software, a.s. významný producent softwaru v oblasti digitální fotogra¿e, poþítaþové gra¿ky a multimédií, poskytovatel internetových služeb, souvisejících s prezentací na internetu a e-komercí, a nakladatelství odborné literatury.

ASP.NET 4 a C# 2010, kniha 1 zahrnuje následující témata: x Základy ASP.NET (úvod do ASP.NET, Visual Studio, webové formuláře, serverové ovládací prvky, aplikace ASP.NET, správa stavu). x Přístup k datům (základy ADO.NET, datové komponenty a sada dat, vázání dat, bohatě vybavené datové ovládací prvky, cachování a asynchronní stránky, soubory a proudy, LINQ, XML). x Budování webů ASP.NET (uživatelské ovládací prvky, motivy a vzory stránek, navigace po webu, nasazování webů). ASP.NET 4 a C# 2010, kniha 2 těsně navazuje na knihu 1 a popisuje: x Bezpečnost (bezpečnostní model ASP.NET, ověřování založené na formulářích, členství, ověřování systému Windows, autorizace a role, profily, kryptografie, vlastní zprostředkovatelé členství). x Pokročilé uživatelské rozhraní (vlastní serverové ovládací prvky, grafiky, GDI+ a grafy, JavaScript a techniky Ajaxu, portály s webovými částmi, ASP.NET AJAX). x Nové směry (MCV, systém dynamických dat ASP.NET, Silverlight). Zdrojové soubory ke stažení: http://zonerpress.cz/download/aspnet4-a-c2010.zip

www.zoner.cz

Bonusové kapitoly ke stažení: http://www.zonerpress.cz/download/bonusove-kapitoly-aspnet.zip

Z O N E R

P R E S S

Pod tímto logem vycházejí publikace určené pro každého vážného zájemce o práci s počítačem. Od ryze praktických příruček a průvodců až po komplexní publikace o všem, co potřebuje grafik, webdesignér, vývojář či programátor při každodenní práci. Na slevy, které můžete získat, a vydavatelský plán, v němž vedle knih domácích odborníků najdete celou řadu titulů světově uznávaných autorů, se informujte na adrese vydavatelství.

Zoner Press tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz ZONER software, a.s., Nové sady 18, 602 00 Brno

© Foto: Lenka Křížová

E N C Y K L O P E D I E

DOPORUČENÁ CENA: 890 Kč KATALOGOVÉ ČÍSLO: ZR1003

ISBN 978-80-7413-131-8

9 7 8 8 0 7 4 1 3 1 3 1 8


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.