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