You are on page 1of 102

1

Nguyn Ngc Bnh Phng - L Trn Nht Qunh


Thi Kim Phng - L Ngc Sn - Trn Th Qun - Nguyn Hong Thanh Nhn

Nguyn Ngc Bnh Phng - L Trn Nht Qunh


Thi Kim Phng - L Ngc Sn - Trn Th Qun - Nguyn Hong Thanh Nhn
Chu trch nhim xut bn: Hong Ch Dng
Bin tp: Nguyn Vn Nam
Thit k ba: V Xun Cng
Ch bn & Sa bn in: Nguyn Ngc Bnh Phng

Sch t Vit DVPUB


a ch: 225 Nguyn Tri Phng, Qun 5, TP. H Ch Minh
in thoi: (08) 2 652 039 - E-mail: datviet@dvpub.com.vn
Website: http://dvpub.com.vn (hay http://dvpub.vn)

Nguyn Ngc Bnh Phng - L Trn Nht Qunh


Thi Kim Phng - L Ngc Sn - Trn Th Qun - Nguyn Hong Thanh Nhn

TP HAI
http://dvpub.com.vn/dv/details.aspx?itemid=371
http://codeprovn.com/forums/viewtopic.php?p=283

NH XUT BN HNG C

LI NI U

c gii php lp trnh ASP.NET 2.0 l quyn sch hon ho cho nhng ai

mun tm hiu nhanh cc tnh nng v cng c mi trong phin bn


2.0 ca ASP.NET. Bn c th c mt quyn sch vit theo li truyn

thng, v mt nhiu thi gian ngh xem phi lm g vit mt phn mm


cho ra tr. Nhng nu s dng quyn sch ny, bn c th hiu v th
nghim cc d n v cng thit thc ch trong mt thi gian ngn.
ASP.NET 2.0 l mt cng ngh nng, l s k tc v ci tin mnh so vi
phin bn 1.1, nh vo mt s tnh nng hp dn nhm n vic trang b cho
nh pht trin web cc cng c cn cho phn ln cc d n. Cc cng c ny
bao gm cc iu kim ng nhp mi, cho php nh pht trin nhanh chng
ko v th mt b cc iu kim ln b mt thit k, thit lp mt vi thuc
tnh, v c ngay mt h thng bo mt. Mt tnh nng mi khc l nhng ci
tin cho giao din ngi dng lc thit k nhm kt cc iu kim d liu.
Cc iu kim hp hp dn khc cng tn ti, nhng khng phi l mc tiu
ca sch ny. Chng ta ch dng li mt s thay i c kin lp trong
ASP.NET 2.0, bao gm kin trc ca cc website, tc ca cc yu cu trang,
vic qun l thng tin c trng thi, v hiu qu pht trin ton din. Nu bn
chn ASP.NET 2.0, t n lc lp trnh ca bn s d dng hn rt nhiu.

Sch ny l tng cho bt k lp trnh vin no c kinh nghim vi .NET


v mun tm hiu cng ngh mi. Bt k ai c kinh nghim vi .NET 1.1
hoc tng hin thc cc gii php quy m ton phn s l ng vin hon
ho lnh hi tt c cc t liu trong quyn sch ny. Bn s c nhng hiu
bit tng qut v cch lm vic ca mt c s d liu c bn, cng vi
nhng kinh nghim trong vic pht trin phn mm truy xut mt i
tng c s d liu, chng hn mt th tc tn tr.
Li tip cn hay nht i vi ngi c l tm ra mt chng m mnh quan
tm v nhy n . Khng mt kin thc no b mt khi c theo li cm
hng nh th. iu ny c ngha y l mt sch hng dn hu ch v cng
l mt sch tra cu nhanh nhm o su m lnh v hc tht nhanh.

Cc chng hon ton c lp v l nhng bn hin thc khc nhau vi


nhiu tnh nng trng lp. Mt s chng c th lp li mt khi nim cho
mt quy trnh no kh rm r, trong khi mt s chng c th lch
hng khi cc tnh nng v li s dng nht qun nhm cung cp mt li
tip cn bnh thng cho nhng i hi c trng ca website. Trong mt s
trng hp cn mt s l gii y v mt ti c tho lun, bn s
nhn thy c mt chng trc m t ti ny mt cch rt chi tit.
Sch ny bao gm 12 d n v bn c th s dng ngay ch vi mt t ci
t. Mi d n u c cc ch dn ci t m ngun vo my cc b. Mc
tiu ca chng v m lnh d n i km l gip bn hiu v nhanh chng
hiu chnh d n ci tin hay hin thc mt s tnh nng. Qua nhng bi
hc c lp i lp li, bn s bit nhiu hn v li thit k v to cc d n
trong phin bn 2.0 ca ASP.NET. Sch ny kho st mt s tin b vt bc
t phin bn 1.1, nhng khng mc chi tit. Hu ht m lnh v t liu
c cn o vi mc ch l gii cc khi nim trong phin bn 2.0 mt
cch trn vn.
Chng ti xin chn thnh cm n cc bn Thi Thanh Phong, inh Phan Ch
Tm, Nguyn Quang Nam, v V Kinh Lun c nhng ng gp qu bu
cho quyn sch; cm n Nh xut bn Hng c v Nh sch t Vit
to iu kin cho quyn sch ny n vi bn c.
Mc d chng ti rt c gng trong qu trnh bin son, nhng thiu st l
iu kh trnh khi. Rt mong nhn c kin ng gp v nhn xt ca
cc bn ln ti bn sau c hon thin hn.
Trn trng
CC TC GI

MT S CH DN

Cu trc ca sch
Quyn sch ny c thit k ging nh mt ti liu tham kho cho cc d
n m ngun m. Hu ht lp trnh vin khng cn hp th mi thng tin v
mt ch c th theo kiu truyn thng; m nhiu khi lp trnh vin tm
thy cu tr li trong m lnh, ri mi c ni dung hay t liu km theo .
Quyn sch ny nhm n vic tha mn khuynh hng , cc ch v
cc khi nim c truyn t t cn bn n nng cao, xuyn sut 12 d n
tng ng vi 12 chng sau:
TP MT
Chng 1. ONLINE DIARY
Chng 2. FILE SHARE
Chng 3. CHAT SERVER
Chng 4. SURVEY ENGINE
Chng 5. BLOG
Chng 6. PHOTO ALBUM
TP HAI
Chng 7. CMS
Chng 8. CUSTOMER SUPPORT
Chng 9. WEBSHOP
Chng 10. APPOINTMENT BOOKING
Chng 11. GREETING CARD
Chng 12. BUGBASE

Cu trc ca mi chng tun theo khun mu chung sau:

9
9
9
9
9

S dng ng dng,
Thit k ng dng,
M lnh ng dng,
Ci t ng dng,
M rng ng dng.

Mi d n c thit k vi cc module, cc file lp, v cc iu kim c th


ti s dng. Cc lp v cc file quan trng s c nu v phn tch chi tit
mi chng.
Cc chng 4, 6, v 9 cp cc ch quen thuc v d tip cn; trong khi
cc chng 3, 10, v 12 cp cc ch nng cao, chc chn bn s hc
c nhiu th t . Kt thc cc bi hc, bn s c th t to cho mnh
mt website, hin thc c ch bo mt vi mt kin trc c t chc, s dng
cc iu kim kt d liu mi v hiu qu hn, c ch kt d liu da vo
i tng, v nhiu tnh nng khc na.

Quy c v font ch
Quyn sch ny s dng cc quy c v font ch nh sau:

9
9

Font TahomaDng cho tn ring, tn file v th mc, ng dn,


nhn, lin kt, v i khi nhn mnh.
Font Lucida Sans TypewriterDng cho ni dung file; cc phn t c
s d liu (nh bng, khung nhn, th tc tn tr, truy vn, trng,
kiu d liu); cc on chng trnh cng cc phn t m lnh (nh
khng gian tn, lp, kiu, hm, th tc, phng thc, thuc tnh, c
tnh, tham s, bin, gi tr, i tng, th hin, s kin, th XML v th
HTML).

Yu cu v h thng
c th chy c nhng ng dng c trnh by trong quyn sch ny,
bn s cn nhng phn mm sau y:

9
9
9
9
9

Microsoft .NET Framework 2.0;


Microsoft Visual Studio 2005 hay Visual Web Developer 2005 Express Edition;
Windows 2000 Professional/Server SP4, Windows XP Professional SP2, Windows
Server 2003 SP1, Windows Vista (Home Premium/Business/Ultimate), hay
Windows Longhorn Server;
Microsoft SQL Server 2005 Express Edition (hay bn y );
Microsoft Internet Information Services (IIS).

Yu cu ti thiu v phn cng l b vi x l 600 MHz, RAM 192 MB. Bn


cng cn khong 5 GB dung lng a cng cn trng ci t Visual Studio
2005 v th vin MSDN. Nhng gi tr ny l mc ti thiu, qu trnh pht
trin s d dng hn trn mt h thng vi b vi x l cao, dung lng RAM
ln v a cng cn trng nhiu.

Bn s c hng dn ci t Microsoft Internet Information Services 7.0


v Visual Studio 2005 Professional Edition trong ph lc A, Mt s vn
lin quan n IIS7 v VS2005.

S dng CD-ROM nh km
CD-ROM nh km theo sch cha ton b m ngun, cng nh gi ci t cho
cc ng dng c trnh by trong quyn sch ny.

Th mc gc ca CD-ROM gm ba th mc:

9
9
9
9
9

WebsitesCha ton b m ngun ca cc ng dng,


PrecompiledWebsitesCha cc ng dng c bin dch,
WebSetupProjectsCha cc d n ci t ng dng,
AJAXCha cc thnh phn c gii thiu trong ph lc C.
AppendixDCha website minh ha cc k thut c gii thiu trong

ph lc D.
Ba th mc u c cu trc ging nhau, gm su th mc con ng vi su
ng dng c trnh by trong tp hai ny:

9
9
9
9
9
9

CMSH thng qun l ni dung,


CustomerSupportH thng h tr khch hng,
WebShopCa hng trc tuyn,
AppointmentBookingH thng ng k trc tuyn,
GreetingCardThit k thip trc tuyn,
BugBaseH thng theo di li.

Bn c hai ty chn khi ci t mt ng dng:

9
9

Nu mun ci t ng dng bng gi ci t, chy file


WebSetupProjects\xyz\Debug\xyz.msi (xyz l tn ng dng). Nh th, ng
dng s c ci t vo Internet Information Services (IIS).
Nu mun ci t ng dng bng tay, chp th mc Websites\xyz\ vo
a cng. Nh th, bn c th m v chnh sa ng dng bng Visual
Studio 2005 (hay Visual Web Developer).

Bn s c ch dn c hai ty chn ci t ny ti mi chng. Bn khng


cn chp th mc PrecompiledWebsites v WebSetupProjects vo a cng, v bn
s bit cch to hai th mc ny trong ph lc A, Mt s vn lin quan
n IIS7 v VS2005.

Nu khng c c ni dung trong CD-ROM nh km, bn c th ti


v t http://codeprovn.com/forums/viewtopic.php?p=283 hoc trc tip lin
h vi Nh sch t Vit (225 Nguyn Tri Phng, Qun 5, TP. H
Ch Minh) nhn CD-ROM khc.

10

11

MC LC

LI NI U ........................................................................................................................ 5
MT S CH DN ................................................................................................................ 7
MC LC ............................................................................................................................ 11
Chng 7. CMS ................................................................................................................. 19
7.1 S dng CMS ........................................................................................................ 21
Xem ni dung ....................................................................................................... 21
Qun l ni dung .................................................................................................. 22
7.2 Thit k CMS ......................................................................................................... 24
7.2.1 Tng nghip v ........................................................................................... 24
7.2.2 Tng truy xut d liu ................................................................................. 26
7.2.3 Lp tr gip ................................................................................................ 28
7.3 M lnh CMS ......................................................................................................... 29
7.3.1 Cc file ti th mc gc .............................................................................. 29
Web.config.................................................................................................... 29
SiteMaster.master v AdminMaster.master................................................. 30
Login.aspx .................................................................................................... 33
7.3.2 Th mc Management................................................................................ 33
Qun l ch ............................................................................................. 34
Qun l ni dung .......................................................................................... 40

12

7.3.3 Hin th ni dung trn website .................................................................... 47


7.4 Ci t CMS........................................................................................................... 49
S dng gi ci t .............................................................................................. 49
Ci t bng tay ................................................................................................... 50
Thay i cc thit lp bo mt ............................................................................. 50
Chy th nghim CMS ........................................................................................ 52
7.5 M rng CMS ........................................................................................................ 52
7.6 Kt chng ............................................................................................................ 57
Chng 8. CUSTOMER SUPPORT.................................................................................. 59
8.1 S dng Customer Support................................................................................... 61
8.2 Thit k Customer Support.................................................................................... 64
8.2.1 Tng nghip v ........................................................................................... 64
Lp ContentBase ......................................................................................... 64
Lp Product.................................................................................................. 66
Lp Download .............................................................................................. 67
Lp Faq ........................................................................................................ 68
Lp Category................................................................................................ 69
8.2.2 Tng truy xut d liu ................................................................................. 70
Lp ProductDB............................................................................................. 70
Lp DownloadDB ......................................................................................... 71
Lp FaqDB ................................................................................................... 71
Lp CategoryDB........................................................................................... 72
M hnh d liu............................................................................................. 73
Cc th tc tn tr v cc hm do ngi dng nh ngha ......................... 75
8.2.3 Lp tr gip ................................................................................................ 75
8.3 M lnh Customer Support.................................................................................... 76
8.3.1 Cc file ti th mc gc .............................................................................. 76
Web.config.................................................................................................... 76
Global.asax................................................................................................... 76
Default.aspx.................................................................................................. 76
Cc trang master .......................................................................................... 77
Cc file v th mc khc.............................................................................. 78
8.3.2 Product Locator........................................................................................... 79
8.3.3 Download List.............................................................................................. 83
8.3.4 FAQ ............................................................................................................. 89
8.3.5 Customer Support CMS.............................................................................. 94
Trang qun l chng loi .............................................................................. 94
Cc trang lit k............................................................................................ 95
Cc trang to v cp nht ............................................................................ 95
8.4 Ci t Customer Support ..................................................................................... 96
S dng gi ci t .............................................................................................. 96

13

Ci t bng tay ................................................................................................... 97


S dng Customer Support ................................................................................. 97
8.5 M rng Customer Support................................................................................... 99
8.6 Kt chng .......................................................................................................... 101
Chng 9. WEBSHOP .................................................................................................... 104
9.1 S dng WebShop .............................................................................................. 107
Duyt danh mc sn phm v t hng vi WebShop..................................... 107
Qun l danh mc sn phm ca WebShop ..................................................... 111
9.2 Thit k WebShop ............................................................................................... 113
9.2.1 Tng nghip v ......................................................................................... 113
Lp Product................................................................................................ 113
Lp OrderedProduct .................................................................................. 114
Lp ShoppingCart ...................................................................................... 115
Lp ShopManager ..................................................................................... 117
Lp Customer............................................................................................. 118
9.2.2 Tng truy xut d liu ............................................................................... 120
M hnh d liu........................................................................................... 120
Lp ShopManagerDB ................................................................................ 123
9.2.3 Cc lp tr gip ........................................................................................ 124
9.3 M lnh WebShop ............................................................................................... 125
9.3.1 Cc file ti th mc gc ............................................................................ 125
Global.asax................................................................................................. 125
Web.config.................................................................................................. 125
MasterPage.master .................................................................................... 127
Default.aspx................................................................................................ 128
Login.aspx .................................................................................................. 128
UserDetails.aspx ........................................................................................ 129
9.3.2 Th mc Shop .......................................................................................... 129
Hin th sn phm ...................................................................................... 130
Thm mt sn phm vo gi hng............................................................. 132
Xem gi hng ............................................................................................. 133
Thay i cc mc trong gi hng ............................................................... 134
Hon tt n t hng ............................................................................... 137
9.3.3 Th mc Management.............................................................................. 141
9.4 Ci t WebShop................................................................................................. 142
S dng gi ci t ............................................................................................ 142
Ci t bng tay ................................................................................................. 143
Hiu chnh cc thit lp bo mt........................................................................ 143
Thay i cc thit lp e-mail .............................................................................. 144
Qun l sn phm .............................................................................................. 145
9.5 M rng WebShop .............................................................................................. 145

14

9.6 Kt chng .......................................................................................................... 149


Chng 10. APPOINTMENT BOOKING ........................................................................ 150
10.1 S dng Appointment Booking ......................................................................... 152
10.1.1 Qun tr Appointment Booking................................................................ 152
10.1.2 Lp bn ng k vi Appointment Booking............................................ 155
To ti khon.............................................................................................. 155
Trnh kim tra tnh sn sng ...................................................................... 156
Trnh thut s lp bn ng k.................................................................... 157
10.2 Thit k Appointment Booking .......................................................................... 157
10.2.1 Tng nghip v ....................................................................................... 158
Lp BookingObject..................................................................................... 158
Lp BookingObjectManager ...................................................................... 159
Lp Appointment ........................................................................................ 160
Lp AppointmentManager.......................................................................... 161
Kiu lit k Weekdays ................................................................................ 162
10.2.2 Tng truy xut d liu ............................................................................. 163
Lp BookingObjectManagerDB ................................................................. 163
Lp AppointmentManagerDB .................................................................... 163
M hnh d liu........................................................................................... 164
10.2.3 Cc lp tr gip ...................................................................................... 165
Lp AppConfiguration ................................................................................ 165
Lp Helpers................................................................................................ 166
10.3 M lnh Appointment Booking .......................................................................... 166
10.3.1 Mt s file quan trng ............................................................................. 166
Cc file ti th mc gc.............................................................................. 167
Cc file v th mc khc............................................................................ 167
10.3.2 Trnh kim tra tnh sn sng ................................................................... 168
10.3.3 Trnh thut s lp bn ng k ................................................................ 175
10.3.4 Trang to ti khon ................................................................................. 179
10.3.5 Phn qun tr........................................................................................... 181
Lu thng tin cu hnh ............................................................................... 182
Qun l cc i tng ng k .................................................................. 183
Xem cc bn ng k................................................................................. 184
10.4 Ci t Appointment Booking ............................................................................ 188
S dng gi ci t ............................................................................................ 188
Ci t bng tay ................................................................................................. 189
Cu hnh ng dng ............................................................................................ 189
10.5 M rng Appointment Booking.......................................................................... 189
tng thit k ................................................................................................. 190
Hiu chnh c s d liu.................................................................................... 190
Hiu chnh tng nghip v v tng truy xut d liu ......................................... 192

15

Hiu chnh giao din ngi dng....................................................................... 193


10.6 Kt chng ........................................................................................................ 195
Chng 11. GREETING CARD....................................................................................... 196
11.1 S dng Greeting Card ..................................................................................... 198
11.2 Thit k Greeting Card ...................................................................................... 201
11.2.1 Toolkit...................................................................................................... 203
Lp Imaging ............................................................................................... 203
Lp UploadHandler .................................................................................... 205
11.2.2 Cc lp tr gip ...................................................................................... 207
Lp FileHandlingEventArgs ....................................................................... 207
Lp AppConfiguration ................................................................................ 207
11.3 M lnh Greeting Card ...................................................................................... 208
11.3.1 Trang ch ................................................................................................ 208
11.3.2 Upload v i kch thc hnh................................................................ 212
Upload file................................................................................................... 212
i kch thc hnh.................................................................................... 214
11.3.3 Xoay v lt hnh ...................................................................................... 217
11.3.4 Ct xn hnh............................................................................................ 218
11.3.5 Thm text vo hnh ................................................................................. 223
11.3.6 Gi hnh qua e-mail ................................................................................ 227
11.4 Ci t Greeting Card........................................................................................ 229
S dng gi ci t ............................................................................................ 229
Ci t bng tay ................................................................................................. 230
Cu hnh ng dng ............................................................................................ 230
11.5 M rng Greeting Card ..................................................................................... 232
11.5.1 Thm bng vo text ........................................................................... 233
11.5.2 Thm logo vo hnh ................................................................................ 234
11.6 Kt chng ........................................................................................................ 236
Chng 12. BUGBASE ................................................................................................... 238
12.1 S dng BugBase ............................................................................................. 240
12.2 Thit k BugBase .............................................................................................. 245
12.2.1 Tng nghip v ....................................................................................... 246
Lp Bug ...................................................................................................... 246
Lp BugManager........................................................................................ 247
Lp BugComparer...................................................................................... 249
Lp CommentManager .............................................................................. 249
Lp ListManager ........................................................................................ 249
Lp MemberManager................................................................................. 251
Lp NameValue ......................................................................................... 251
Lp SearchCriteria ..................................................................................... 252

16

12.2.2 Tng truy xut d liu ............................................................................. 253


Lp BugManagerDB .................................................................................. 256
Lp CommentManagerDB ......................................................................... 257
Lp ListManagerDB ................................................................................... 258
Lp MemberManagerDB............................................................................ 259
12.3 M lnh BugBase .............................................................................................. 260
12.3.1 Mt s file quan trng ............................................................................. 260
Web.config.................................................................................................. 260
MasterPage.master .................................................................................... 262
Global.asax................................................................................................. 262
Web.sitemap............................................................................................... 263
12.3.2 Lp mt li............................................................................................... 263
12.3.3 Tm kim v xem cc li ......................................................................... 272
12.3.4 Cc file v th mc khc ........................................................................ 280
12.4 Ci t BugBase................................................................................................ 282
S dng gi ci t ............................................................................................ 282
Ci t bng tay ................................................................................................. 283
Chy th nghim BugBase................................................................................ 283
12.5 M rng BugBase.............................................................................................. 284
12.6 Kt chng ........................................................................................................ 287
PH LC A. MT S VN LIN QUAN N IIS7 V VS2005 ............................. 288
A.1 Ci t IIS7 v VS2005....................................................................................... 288
Ci t Internet Information Services 7.0 .......................................................... 289
Ci t Visual Studio 2005 Professional v th vin MSDN............................. 290
A.2 Cc cng c cu hnh cho ASP.NET 2.0 ............................................................ 298
Web Site Administration Tool............................................................................. 298
Cc tnh nng ASP.NET ca IIS7...................................................................... 299
A.3 To gi ci t website ....................................................................................... 301
Bin dch ng dng ............................................................................................ 302
To d n ci t ............................................................................................... 304
Ci t v s dng ng dng ............................................................................ 307
PH LC B. MT S VN LIN QUAN N SQL SERVER 2005 ........................ 312
B.1 Ci t SQL Server 2005 Developer .................................................................. 312
B.2 nh file MDF vo SQL Server 2005 Developer................................................. 322
B.3 To bn d phng v khi phc c s d liu................................................... 329
B.4 To kch bn SQL................................................................................................ 332
PH LC C. GII THIU MICROSOFT ASP.NET AJAX............................................... 337
C.1 Tng quan v cng ngh AJAX .......................................................................... 337
C.2 Microsoft ASP.NET AJAX 1.0 ............................................................................. 339
ASP.NET AJAX Extensions 1.0 ......................................................................... 340

17

ASP.NET AJAX Offline Documentation............................................................. 342


ASP.NET AJAX Control Toolkit ......................................................................... 343
ASP.NET AJAX Futures .................................................................................... 348
ASP.NET AJAX 1.0 Samples............................................................................. 351
PH LC D. MT S K THUT THIT YU ............................................................... 356
D.1 S dng HTML Editor ......................................................................................... 357
FreeTextBox....................................................................................................... 357
FCKeditor ........................................................................................................... 359
D.2 Nhng b g ting Vit AVIM.............................................................................. 361
D.3 m lt truy cp v s ngi online ................................................................ 362
D.4 Xy dng chc nng gi mail lin h................................................................. 363
D.5 V biu vi Dundas Chart.............................................................................. 364
D.6 Nhng ti liu PDF .............................................................................................. 366
D.7 Ly tin t website khc thng qua RSS ............................................................. 367
D.8 Tch hp Google Search vo website ................................................................ 369
D.9 Ly a ch IP ca client ...................................................................................... 371
LI KT ........................................................................................................................... 372
THUT NG .................................................................................................................... 373
MT S TI NGUYN TRC TUYN ............................................................................ 377
TI LIU THAM KHO ................................................................................................... 378
SCH CNG TC GI .................................................................................................... 378

18

19

Chng 7. CMS

20

Nhng tng ging nh nhng v sao, bn s khng th tay


khng m vi ti v sao, m phi ging nh mt thy th trn mt
bin qunh qu, bn phi la chn mt cun sch ch nam v thc
hin ng theo cun sch , bn s thc hin c nhng
tng v nm c s phn ca mnh.
Carl Schurz

21
Chng 7. CMS

u ht cc website hin nay u vn hnh theo c s d liu, c ngha l chng ly


ni dung t c s d liu ch khng phi t cc file HTML tnh. Mc d iu ny cho
bn cc kh nng tuyt vi trong vic trnh by ni dung, nhng cng gp phi mt
vn trong vic cp nht ni dung . Vi cc website HTML tnh, bn c th thit k v to
cc file offline, sau s dng FTP hay cc cng c mng truyn thng khc a cc file
ca bn ln server. Tuy nhin, vi mt website da vo c s d liu, iu ny l khng c.
Bi v website phi duy tr s thc thi, bn khng th ghi c s d liu c vi thng tin
mi. Cng bi v website thu thp thng tin lc thc thi (chng hn nh cc khung nhn trang,
nhng lt ng nhp ca ngi dng,), bn c th mt thng tin khi upload mt c s
d liu mi vi ni dung mi.
Cch ph bin nht gii quyt vn ny l s dng mt h thng qun l ni dung trc
tuyn (Content Management SystemCMS). Mt h thng nh th cho php bn ng nhp vo
site, sau qun l ni dung ngay ti v tr m n c lu tr v s dng: web server.
Trong chng ny, bn s tm hiu cch xy dng mt CMS tng qut, cho php bn qun l
ni dung v cc ch m ni dung ny thuc v. Bn c th s dng website ny ng
thng tin v cu lc b cu lng ca bn, cc n phNm ca cng ty bn, hoc bt k ch
no khc m bn mun chia s vi mi ngi. Website demo ca chng ny s qun l cc
ch lin quan n tin hc.
Chng ny bt u bng vic lt nhanh qua website CMS. Bn s bit cch to cc ch
mi (s xut hin trn trnh n ca webiste) v cch nhp ni dung vo c s d liu. Phn
Thit k CMS gii thch cch thit k CMS, cc trang v cc lp c lin quan. Phn M lnh
CMS xem xt m lnh trong site v l gii cch hot ng ca n. Hai phn cui trnh by
cch ci t CMS v c nhng ci tin cho n.

7.1

S dng CMS

Website c minh ha trong chng ny gm hai phn quan trng: phn front-end (cng
khai) v phn qun l ni dung (c bo v). Phn front-end hin th nhng mc ni dung
(content item) thuc loi tin tc, bi vit, v cu hi thng gp. Cc mc ni dung ny c th
c qun l bng h thng qun l ni dung, chnh l phn th hai ca website. Chng ny
tp trung ch yu vo phn th hai, nhng cng trnh by cch hin th thng tin t CMS ra bn
ngoi.

Xem ni dung
N u website CMS c ci t thnh cng (tham kho phn Ci t CMS trong chng ny
hiu r hn), bn c th duyt website theo a ch http://localhost/CMS. Bn s thy mn
hnh nh trong hnh 7-1.
Trnh n chnh (cc th ln u mn hnh) cha cc mc tnh v ng. Trang ch, Qun tr,
v ng nhp l cc mc c nh. Mc Trang ch lun a bn v trang ch v mc ng nhp
cho php bn ng nhp vo website. Mc Qun tr cho php bn truy xut phn qun l ni
dung. Ba mc cn li l cc loi ni dung (content type), c ly t c s d liu. Khi nhp
vo mt loi ni dung, chng hn nh Bi vit, bn s thy mt trnh n con xut hin nh
hnh 7-2.

22
Chng 7. CMS

Hnh 7-1

Hnh 7-2

Trnh n con hin th cc ch bn trong loi ni dung c chn. Khi nhp chn mt ch
trong trnh n con, chng hn nh Khoa hc my tnh, bn s thy danh sch cc mc ni
dung (xem hnh 7-3) thuc ch .

Hnh 7-3

Khi bn nhp vo lin kt Xem tip bn di mt mc ni dung, trang chi tit s xut hin, cho
bn xem ton b mc ni dung.

Qun l ni dung
qun l cc mc ni dung trong h thng (cng nh cc loi ni dung v cc ch ), bn
cn phi ng nhp. N u ci t ng dng (xem phn Ci t CMS), bn c th ng nhp
vi tn ngi dng l Administrator v mt khNu l Admin123# (ch mt khNu c phn bit
hoa-thng).

23
Chng 7. CMS

Sau khi ng nhp, bn s thy trnh n chnh xut hin vi cc lin kt cho php qun l
loi ni dung, ch , v ni dung. Vic qun l loi ni dung v ch kh d dng. Bn c
th to mi v cp nht cc mc hin c. Bn cng c th gn li mt ch vo mt loi ni
dung khc bng cch hiu chnh ch v chn loi ni dung mi t danh sch th xung.
Bn c th qun l ni dung ca website bng cch nhp mc Qun l ni dung trn trnh n
bn tri (xem hnh 7-4). Bn s thy danh sch tt c mc ni dung hin c, c lc bi loi
ni dung. chn mt loi khc, bn hy chn mt mc t danh sch th xung. thay i
mt mc ni dung, bn hy nhp nt Sa trong danh sch. N u nhp nt To ni dung mi, bn
s c a n trang AddEditContent.aspx (hnh 7-4). Trang ny c s dng thm mi v
hiu chnh cc mc ni dung hin c.

Hnh 7-4

N goi Tiu , Gii thiu, v Ni dung ca mc ni dung, bn cng c th ch nh Loi ni dung v


Ch . N gay khi bn chn mt loi ni dung mi, trang ny c lm ti v danh sch ch
c cp nht vi cc ch thuc loi ni dung va chn. FCKeditor c s dng cho cc
trng Gii thiu v Ni dung. Cch s dng trnh son tho ny c gii thch trong phn sau.
N u bn khng nh du vo hp Hin?, mc ni dung ny s khng hin th trn webiste. Tuy
vy, n khng b xa khi c s d liu, sau ny bn c th kch hot li.
Vic qun l ni dung v cc ch trong CMS kh d dng. Bn thit k v hin thc ca CMS
cng kh d hiu. Trong phn tip theo, bn s tm hiu bn thit k ca ng dng. Phn ny
m t tng nghip v v tng truy xut d liu, trnh by bn thit k c s d liu v cc th
tc tn tr dng truy xut d liu.

24
Chng 7. CMS

7.2

Thit k CMS

Hu ht cc trang trong CMS da vo cc iu kim SqlDataSource a d liu vo/ra c s


d liu. Cc iu kim ngun d liu mi ny (cng vi GridView v FormView) cho php bn
to cc trang vn hnh theo c s d liu m khng mt nhiu thi gian, khng c hoc c t
m lnh. Tuy nhin, cc iu kim ny mc phi mt vi vn . Th nht, chng thch hp
cho nhng trng hp n gin. V d, trang cho php bn to hay thay i cc ch trong
phn qun tr kh thch hp SqlDataSource kt hp vi mt GridView (cho danh sch cc
ch ) v mt FormView ( chn mc mi) v cu trc d liu kh n gin. Tuy nhin, vi
cc trang phc tp hn, nh trang AddEditContent.aspx c hai danh sch th xung c kt vi
nhau, mi th tr nn kh khn hn mt cht.
Vn th hai vi cc iu kim SqlDataSource l chng thng nhng cc cu lnh SQL trc
tip trong phn nh du ca trang. iu ny ph v quy tc thit k a tng bi v bn buc
phi cp nht nhiu trang trong website mi khi c mt thay i trong cu trc c s d liu.
Bt chp nhng bt li ny, vic s dng iu kim SqlDataSource c th l cch tt pht
trin nhanh cc website tng i nh, t thay i cu trc c s d liu. cho bn thy
cch s dng chng v cch chng hot ng, chng c s dng cho hu ht cc truy xut
d liu trong CMS, ngoi tr trang AddEditContent.aspx. Thay v lm vic vi iu kim
SqlDataSource, CMS s dng mt s lp v phng thc ty bin a thng tin vo/ra c s
d liu.
gim thiu nh hng ca cc cu lnh SQL trn ton b trang, cc th tc tn tr c s
dng trong tt c iu kim SqlDataSource. Thay v lu tr cu lnh INSERT hay UPDATE trong
phn ASPX ca trang, gi y bn ch lu tr tn ca mt th tc trong c s d liu. Mi khi
c s thay i trong cu trc c s d liu hay cc truy vn, ci cn c cp nht l cc th
tc tn tr.
Trong cc chng sau (chng 9 v chng 12), bn s s dng cc iu kim
ObjectDataSource tun theo kin trc ba tng. Vic s dng cc iu kim SqlDataSource
trong cc trang khin tng nghip v v tng truy xut d liu rt gn nh. Phn tip theo tho
lun lp duy nht trong tng nghip v. Phn theo sau na m t c s d liu v cc lp
trong tng truy xut d liu.

7.2.1 Tng nghip v


N h cp lc u, khng c iu kim SqlDataSource no c s dng to v cp
nht cc mc ni dung trong bng Content. Hai danh sch th xung gm cc loi ni dung v
cc ch c lin quan vi nhau khin m lnh rt kh hiu v kh bo tr. Thay vo , mt
lp rt n ginlp Contentc thit k biu din mt mc ni dung trong c s d
liu. Lp ny c mt s thuc tnh nh Title, IntroText, v CategoryId; v c hai phng
thc dng a mc ni dung vo/ra c s d liu. Bn c th tm thy nh ngha ca lp
Content trong file Content.vb thuc th mc App_Code\BusinessLogic ca website. Hnh 7-5 m t
bn thit k ca lp Content.
Bng sau lit k by thuc tnh cng khai ca lp:
Thuc tnh

Kiu d liu

M t

25
Chng 7. CMS
BodyText

String

Thuc tnh BodyText cha ton b vn bn ca mc ni


dung v ch c hin th trn trang chi tit.

CategoryId

Integer

Cho bit mc ni dung ny thuc ch no.

ContentTypeId

Integer

Cho bit mc ni dung ny thuc loi ni dung no.

Id

Integer

y l ID duy nht ca mc ni dung v c gn t


ng bi c s d liu khi mt mc ni dung mi
c chn vo.

IntroText

String

Thuc tnh ny cha vn bn gii thiu mc ni dung.


Vn bn gii thiu ny c hin th, c th vi mt
nh dng khc, trn trang lit k ni dung v ti u
trang chi tit ni dung.

Title

String

y l tiu ca mc ni dung khi n xut hin trn


trang lit k ni dung v trang chi tit ni dung.

Visible

Boolean

Xc nh mc ni dung ny c th c nhn thy


trong phn cng khai ca website hay khng.

Hnh 7-5

N goi by thuc tnh ny, lp Content c bn phng thc: hai phng thc khi dng,
phng thc Save, v phng thc GetItem. Cc phng thc ny c m t trong bng sau:
Phng thc

Kiu tr v

M t

Public Sub New()

Khng

Phng thc khi dng mc nh ca


lp Content. Khi to mt th hin mi
vi tt c thuc tnh c gn bng cc
gi tr mc nh.

26
Chng 7. CMS
Public Sub New
(ByVal id As
Integer)

Khng

Phng thc khi dng np chng ny


khi to mt th hin mi ca lp
Content vi tt c thuc tnh c gn
bng cc gi tr mc nh, ngoi tr Id
c ly t id c truyn cho phng
thc khi dng. Phng thc ny c
s dng to li cc mc ni dung
hin c khi cp nht chng trong phn
qun tr.

Public Sub Save()

Khng

Lu mt mc ni dung mi hay c
vo c s d liu bng cch gi phng
thc Save trong lp ContentDB (s c
tho lun sau).

Public Shared
Function GetItem
(ByVal id As
Integer) As Content

Mt th hin ca lp
Content hoc Nothing khi
khng tm thy mc ni
dung.

Ly mt mc ni dung t c s d liu
bng cch gi GetItem trong lp
ContentDB.

7.2.2 Tng truy xut d liu


Bi hu ht cc trang trong website s dng iu kim SqlDataSource cho vic truy xut d
liu, bn ch cn mt lp trong tng truy xut d liu: lp ContentDB (xem hnh 7-6), lp ny
m nhim vic ly v lu mt mc ni dung trong c s d liu.

Hnh 7-6

Do lp ContentDB ch trng ra cc thnh vin chia s nn n khng c phng thc khi dng
cng khai. N cng khng c cc thuc tnh cng khai, nhng c hai phng thc cng khai,
c m t trong bng sau:
Phng thc

Kiu tr v

M t

Public Shared Sub Save


(ByVal contentItem As
Content)

Khng

Lu mt mc ni dung
mi hay c vo c s
d liu.

Public Shared Function


GetItem(ByVal id As
Integer) AS Content

Mt th hin ca lp Content
hoc Nothing khi khng tm thy
mc ni dung.

Ly mt mc ni dung t
c s d liu.

27
Chng 7. CMS

N goi lp ny, tng truy xut d liu cn c c s d liu. C s d liu cho CMS gm ba
bng v mt s th tc tn tr chu trch nhim ly d liu t cc bng . Hnh 7-7 m t ba
bng ny v mi quan h gia chng.

Hnh 7-7

Bng Content l thc th chnh trong c s d liu, v n lu tr ni dung c hin th trn


website. Bng sau lit k tt c cc ct ca bng Content:
Tn ct

Kiu d liu

M t

Id

int

ID duy nht ca mi mc ni dung. ID ny c sinh t

ng bi c s d liu mi khi mt mNu tin mi c


chn vo.
Title

nvarchar(100)

Tiu ca mc ni dung. Tiu ny c hin th


trn trang lit k ni dung v trang chi tit ni dung.

IntroText

nvarchar(MAX)

c s dng cha vn bn gii thiu mc ni


dung, c hin th trn trang lit k ni dung v ti
u trang chi tit ni dung.

BodyText

nvarchar(MAX)

Ton b vn bn ca mc ni dung, khng bao gm


vn bn gii thiu. Vn bn ny c hin th trn
trang chi tit ni dung, ngay bn di vn bn gii
thiu.

ContentTypeId

int

Loi ni dung m mc ni dung ny thuc v.

28
Chng 7. CMS
CategoryId

int

Ch m mc ni dung ny thuc v.

CreateDateTime

datetime

N gy gi mc ni dung c thm vo.

UpdateDateTime

datetime

N gy gi mc ni dung c cp nht ln cui.

Visible

bit

Xc nh mc ni dung c th c nhn thy trong


phn cng khai ca website hay khng.

Mi mc ni dung c lin kt vi bng ContentType bi ContentTypeId. Quan h ny cho


php bn tm thy danh sch cc mc ni dung thuc mt loi ni dung no m khng phi
ch nh mt ch . N goi ID v Description, bng ContentType cn c cc ct SortOrder v
Visible. Ct SortOrder cho php bn iu khin th t ca cc mc trn trnh n chnh, v
ct Visible cho php bn Nn mt mc trn trnh n chnh.
Mt mc ni dung cng c lin kt vi mt ch trong bng Category bi CategoryId.
Bng Category tng t nh bng ContentType, nhng n c thm ContentTypeId, cho php
bn lin kt cc ch vi cc loi ni dung.
n gin ha vic bo tr website, cc cu lnh SQL c a vo cc th tc tn tr. iu
c ngha rng bn s khng tm thy cu lnh SELECT hay UPDATE hay cu lnh SQL no khc
trong m lnh. N u mun xem hoc thay i cc th tc tn tr trong c s d liu, bn hy
nhp vo nt Stored Procedures ca c s d liu Cms.mdf trong ca s Server Explorer (c th m
ca s ny bng t hp phm Ctrl+Alt+S trong Visual Studio 2005 hay Visual Web Developer). Cc
th tc tn tr ny s c tho lun trong cc phn sau.

Hnh 7-8

7.2.3 Lp tr gip
Lp cui cng trong th mc App_Code l AppConfiguration. Lp ny thuc v website hn l
thuc v tng nghip v hay tng truy xut d liu, do n c t trc tip trong th mc
App_Code. iu ny khng bt buc, cho nn bn c th chuyn n vo mt trong cc th mc
hin c, hoc to mt th mc mi nh Configuration hay Helpers ri t vo . Lp ny c
gi l AppConfiguration, khng phi l Configuration trnh xung t tn vi khng gian
tn ASP.NET System.Configuration. Lp AppConfiguration trng ra thuc tnh chia s
ConnectionString, v bn cht l mt v bc cho ConnectionString trong file Web.config. Cc

29
Chng 7. CMS

trang trong website c s dng iu kim SqlDataSource s s dng c php kt ca ring


chng trc tip ly thuc tnh ConnectionString t file Web.config. Tuy nhin, hai phng
thc trong tng truy xut d liu s dng lp AppConfiguration ly thng tin kt ni. Thay
v vit m lnh trc tip truy xut file Web.config, cc phng thc ny truy xut thuc tnh .
Bn s thy thuc tnh ny c s dng th no trong phn tip theo khi tho lun v m
lnh trong tng nghip v, tng truy xut d liu, v tng trnh by.

Hnh 7-9

7.3

M lnh CMS

Phn ny i vo tng trang quan trng ca website CMS. Trc tin, chng ta s xt mt s file
ti th mc gc. Sau l xt n cc file trong th mc Management (cho php bn qun l
ni dung trong c s d liu). Sau cng l xt n hai file m nhim vic hin th ni dung
trong phn cng khai ca website.

7.3.1 Cc file ti th mc gc
Th mc gc ca website CMS gm hai file master, mt file cu hnh, mt trang ng nhp,
trang mc nh, v hai file dng hin th ni dung trong c s d liu. Phn ny s tho
lun v cc file trn, ngoi tr hai file cui s c tho lun sau khi tho lun v th mc
Management.

Web.config
File cu hnh ton cc ny cha mt kha appSetting v mt connectionString. Kha
appSetting c s dng bi FCKeditor (HTML Editor ny s c tho lun sau), cn chui kt
ni c s dng bi cc trang v cc lp truy xut d liu trong ng dng.
Bn di nt <system.web>, bn s thy hai phn cu hnh cho Membership provider v Role
provider. CMS s dng cc provider ny cho php ngi dng ng nhp v truy xut th
mc Management. V website ny s dng c s d liu ty bin, khng phi aspnetdb.mdf mc
nh nh c nh ngha trong machine.config, nn bn cn cu hnh cho ng dng s dng c
s d liu ty bin. C hai nt

<membership>

<roleManager>

cng ging nh trong

machine.config, ch c c tnh name v connectionStringName ca nt <providers> cn c


thay i (bo cho ASP.NET s dng chui kt ni v c s d liu ty bin):
<providers>
<add name=SqlProvider type=System.Web.Security.SqlRoleProvider
connectionStringName=Cms />
</providers>

N gay bn di cc thit lp trn, bn s thy cc thit lp sau:


<authentication mode=Forms>
<forms loginUrl=~/Login.aspx />

30
Chng 7. CMS
</authentication>
<authorization>
<allow users=*/>
</authorization>
<pages theme=Cms>

N t <authentication> bo cho .NET s dng Forms Authentication. Mi khi yu cu mt trang


c bo v vi vai tr ngi dng nc danh, bn s c a n trang Login.aspx nm th
mc gc ca website. N t <authorization> cho php truy xut mi trang trong website i vi
mi ngi dng. Th mc Management b cm truy xut i vi nhng ngi dng khng
thuc vai tr Administrator bng th <location> (xem bn di).
N t <pages> bo cho ASP.NET s dng theme c nh ngha trong th mc App_Themes.
Website ny s dng mt theme rt n gin, ch vi mt file .skin nh ngha kiu dng ca
cc iu kim GridView c s dng trong site. File GridView.skin cha mt s nh ngha style
vi cc c tnh CssClass tr n cc class c nh ngha trong file Styles.css thuc th mc
CSS.
Phn cui cng trong file Web.config m bn cn xem l th <location>:
<location path=Management>
<system.web>
<authorization>
<allow roles=Administrator />
<deny users=*/>
</authorization>
</system.web>
</location>

on m ny bo cho ASP.NET cm truy xut th mc Management i vi nhng ngi dng


khng thuc vai tr Administrator. Khi truy xut mt trang thuc th mc , bn s c
a n trang Login.aspx.
Cc phn t cn li trong file Web.config l do Visual Studio 2005 (hay Visual Web Developer) sinh
ra khi bn to mt website ASP.NET 2.0 mi.

SiteMaster.master v AdminMaster.master
Hai file master ny xc nh cm quan ca tt c cc trang trong website. File SiteMaster.master
c s dng cho cc trang cng khai, trong khi file AdminMaster.master c s dng cho cc
trang trong th mc Management. Hai file ny c nhiu im chung, khc bit duy nht l trong
file AdminMaster.master c mt bng HTML v mt iu kim ngi dng hin th trnh n
con cho phn qun tr. Mc d ASP.NET 2.0 cho php bn s dng cc file master lng nhau,
nhng website CMS khng s dng tnh nng . y, file SiteMaster.master c to trc v
sau ni dung ca n c chp sang file AdminMaster.master.
N goi cc th HTML thng thng, SiteMaster.master cn s dng iu kim ngi dng
SiteMenu hin th trnh n chnh v trnh n con. iu kim SiteMenu (trong th mc
Controls) cha hai iu kim Repeater cho hai trnh n. Mi mc trong trnh n chnh v
trnh n con lin kt n trang ContentList v truyn cho n ID ca loi ni dung v ID ca ca
ch (nu c) thng qua chui truy vn. iu ny cho php trang ny, cng cc iu kim
ngi dng trong , bit loi ni dung v ch no hin ang c hin th. iu kim

31
Chng 7. CMS

cng cha hai iu kim SqlDataSource ly d liu t cc th tc tn tr trong c


s d liu. Hy xem ngun d liu cho trnh n con (hin th cc ch ):
SiteMenu

<asp:SqlDataSource ID=sdsSubMenu runat=server


ConnectionString=<%$ ConnectionStrings:Cms %>
ProviderName=System.Data.SqlClient SelectCommand=sprocCategorySelectlist
SelectCommandType=StoredProcedure >
... Cc tham s chn la s c trnh by sau
</asp:SqlDataSource>

M nh du ca iu kim ny cha mt s thng tin quan trng. Th nht, l c tnh


ConnectionString. gn chui kt ni thch hp lc thc thi, mt dng kt d liu mi c
p dng. C php biu thc <%$ %> c s dng kt cc c tnh vi cc chui kt ni, cc
ti nguyn, v cc thit lp ng dng trong file Web.config. Trong trng hp ny, mt chui
kt ni c tn l Cms c ly t file cu hnh ca ng dng.
Thng tin quan trng k tip l cc c tnh SelectCommand v SelectCommandType. Chng bo
cho .NET Framework thc thi th tc tn tr sprocCategorySelectlist trong c s d liu c
xc nh bi chui kt ni.
Th tc tn tr ny kh n gin: ly tt c cc ch thuc v mt loi ni dung no :
CREATE PROCEDURE sprocCategorySelectlist
@contentTypeId int
AS
SELECT
Category.Id,
Category.Description,
Category.ContentTypeId,
ContentType.Description AS ContentTypeDescription,
Category.SortOrder
FROM
Category INNER JOIN
ContentType ON Category.ContentTypeId = ContentType.Id
WHERE
(Category.ContentTypeId = @contentTypeId)
AND Category.Visible = 1
ORDER BY
SortOrder
RETURN

N goi cc trng ca bng Category, phn m t loi ni dung cng c thu ly, vi b danh
l ContentTypeDescription. M t ny c s dng trong phn qun tr ca website, hin
tn loi ni dung m ch thuc v. Th tc tn tr ny nhn ID ca loi ni dung lm tham
s. Trong m lnh cho SqlDataSource, tham s ny c thit lp nh sau:
<SelectParameters>
<asp:QueryStringParameter Name=contentTypeId
QueryStringField=ContentTypeId Type=Int32 />
</SelectParameters>

Vi on m trn, mt i tng Parameter c nh ngha ly gi tr t mt


QueryStringField c tn l ContentTypeId. Khi SqlDataSource chuNn b ly d liu t c s d
liu, n s ly gi tr t chui truy vn ri lu vo tham s ny em truyn cho th tc tn
tr.
Bng vic s dng chui truy vn lm tham s, iu kim
ch thuc loi ni dung hin ang c yu cu.

SqlDataSource

s lun thu ly cc

32
Chng 7. CMS

iu kim ly cc mc cho trnh n chnh cng thc hin tng t nh vy. Tuy nhin, v
iu kim ny cn tr v tt c loi ni dung, nn khng c tham s la chn no.
Khi quan st mt trang c s dng iu kim SiteMenu, bn s thy nh hnh 7-10.
Tt c cc mc trnh n nm gia Trang ch v Qun tr ly d liu t bng ContentType, trong
khi cc trnh n con ly d liu t bng Categories. Bn cng c th thy rng, trong lin kt
cho trnh n con, c ContentTypeId v CategoryId u c truyn cho trang ContentList. iu
cui cng bn cn trong hnh 7-10 l mt trnh n chnh v mt trnh n con (Bi vit v
Vn th) xut hin vi mu hoc kiu font khc. iu ny c thc hin bi m lnh thuc s
kin Load trong file code-behind ca iu kim ngi dng.

Hnh 7-10

Khi hai iu kim Repeater cho cc trnh n ly d liu t cc iu kim SqlDataSource,


chng pht sinh s kin ItemDataBound i vi mi mc c thm vo b lp. S kin ny l
ni l tng chn trc cc mc trnh n bi v bn c th truy xut n chui truy vn
ang nm gi ID ca loi ni dung v ch c chn, v n mc sp c hin th. on
m sau trnh by cch in m mt trnh n con khi n c chn:
Protected Sub repSubMenu_ItemDataBound(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) _
Handles repSubMenu.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or _
e.Item.ItemType = ListItemType.AlternatingItem Then
Dim myDataRowView As DataRowView = DirectCast(e.Item.DataItem, DataRowView)
If Convert.ToInt32(myDataRowView(Id)) = _
Convert.ToInt32(Request.QueryString.Get(CategoryId)) Then
Dim lnkSubmenu As HyperLink = _
DirectCast(e.Item.FindControl(lnkSubmenu), HyperLink)
lnkSubmenu.CssClass = Selected
End If
End If
End Sub

on m trn kim tra ItemType ca mc hin ang c kt d liu. Khi mt Item hoc
Alternating c to, m lnh thu ly DataItem, trong trng hp ny l mt DataRowView.
Sau , DirectCast c s dng p i tng DataItem thnh mt DataRowView. S dng
DirectCast cng tng t nh Ctype nhng n thc thi nhanh hn mt cht. N hc im ca
DirectCast l n ch c th p cc i tng cng kiu, bn khng th s dng n p mt
i tng thnh kiu khc cao hn hoc thp hn trong phn cp k tha. Tuy nhin, trong
trng hp ny, chng c vn g do DataItem l mt DataRowView nn bn c th s dng
DirectCast mt cch an ton.

33
Chng 7. CMS

Mt khi c i tng DataRowView, bn c th thu ly ct ID ca n, y l ID ca ch


ang c thm vo Repeater. N u ID ca ch trng vi ID ca ch hin hnh (c
xc nh bng cch xt chui truy vn CategoryId), m lnh s ly mt tham chiu n siu
lin kt trong trnh n lnkSubmenu bng cch s dng DirectCast mt ln na. Cui cng,
CssClass ca siu lin kt c thit lp l Selected. Hnh vi ca lp Selected (trong trng
hp ny l kiu font in m) c nh ngha trong file Core.css:
#SubMenu a.Selected
{
font-weight: bold;
}

on m trn s dng kiu font m cho tt c cc th


dng lp Selected (khi mc trnh n con c chn).

<a>

thuc th

div #SubMenu

v c s

Cc mc trnh n Trang ch, Qun tr, v ng nhp khng vn hnh theo c s d liu, do
bn khng th chn trc chng trong s kin ItemDataBound. Thay vo , trong Page_Load
ca iu kim SiteMenu, bn kim tra thuc tnh AppRelativeCurrentExecutionFilePath ca
lp HttpRequest. Bng php so snh chui, bn bit c c cn chn trc mt trong cc
mc trnh n tnh hay khng:
If Request.AppRelativeCurrentExecutionFilePath.ToLower() = ~/default.aspx Then
liHome.Attributes(class) = Selected
End If

on m trn s dng lp Selected cho mc trnh n tnh Trang ch khi trang c yu cu


hin hnh l ~/default.aspx (trang ch ca website CMS). Cch tng t c s dng chn
trc cho hai mc trnh n cn li.

Login.aspx
Trang ny cho php bn ng nhp vo website v t ng xut hin mi khi bn truy xut
mt trong cc trang thuc th mc Management vi vai tr mt ngi dng cha c xc
thc. Trang ny tn dng th mnh ca b khung bo mt ASP.NET 2.0 (c cung cp bi cc
provider Membership v Role). N hng g trang ny cn l mt iu kim <asp:Login>:
<asp:Login ID="Login1" runat="server"
TitleText="ng nhp" LoginButtonText="ng nhp"
UserNameLabelText="Tn ng nhp:" PasswordLabelText="Mt khu:"
RememberMeText="Ghi nh cho ln ng nhp k tip" >
</asp:Login>

Mc d iu kim ny ch vi mt th nh du, n vn mang y chc nng. Mc ch


ca CMS khng bt buc bt k ty chnh trc quan no, nhng nu mun, bn c th p dng
mt s thay i hnh dng v hnh vi cho iu kim ny thng qua Visual Studio 2005 IDE (hay
Visual Web Developer IDE). y, iu kim ny c Vit ha mt s nhn.
Hai file cui cng nm trong th mc gc, ContentList.aspx v ContentDetail.aspx, s c tho
lun sau phn Th mc Management.

7.3.2 Th mc Management
Tt c cc file trong th mc Management c s dng cho vic bo tr cc loi ni dung, cc
ch , v ni dung c hin th trong phn cng khai ca website. Th mc ny c nm
file: trang ch mc nh ca phn qun tr, mt trang qun l cc loi ni dung, mt trang

34
Chng 7. CMS

qun l cc ch , v hai trang qun l cc mc ni dung. Trang ch chng lm g


ngoi vic hin th vn bn tnh v trnh n qun tr, cc trang khc ng quan tm hn nn
chng s c gii thch chi tit hn. Do qun l loi ni dung cng tng t nh qun l ch
nn chng ta b qua trang ContentTypes, ch tho lun trang Categories. Mi khi nim c
s dng trong trang Categories cng c s dng trong trang ContentTypes.

Qun l ch
N h bn bit, cc ch c hin th dng mc trnh n mi khi bn chn mt loi
ni dung. Mi ch c gn vi mt loi ni dung c th bi ContentTypeId ca n.
iu khin th t xut hin ca cc mc trn trnh n con, Category c ct SortOrder.
N hm cho php bn qun l cc ch hin c v to ch mi trn cng mt trang,
Categories.aspx c chia lm hai phn bi cc iu kim <asp:Panel>. Panel th nht l
pnlList, gm mt GridView hin th cc ch hin c. Mt danh sch th xung pha trn
GridView cho php bn lc cc ch thuc mt loi ni dung c th. Panel th hai l pnlNew,
c s dng thm cc ch mi. Panel ny gm mt iu kim FormView kt hp vi
mt SqlDataSource. Ti mt thi im, ch mt trong hai panel c nhn thy. Chng ta s
xt panel pnlList trc, sau xt n cch thm ch mi vi cc iu kim trong panel
pnlNew.
N goi mt vi iu kim tnh cho cc thng bo, pnlList c hai iu kim quan trng: mt
danh sch th xung (lstContentType) v mt GridView (gvCategories). iu kim danh sch
th xung lit k cc loi ni dung hin c trong website, GridView hin th cc ch thuc
loi ni dung c chn trong danh sch th xung.
Khi trang ny np, danh sch th xung ly d liu t mt SqlDataSource c tn l
sdsContentTypes. C danh sch th xung v ngun d liu u c m nh du rt n gin:
<asp:DropDownList ID=lstContentTypes runat=server
DataSourceID=sdsContentTypes
DataTextField=Description DataValueField=Id AutoPostBack=true>
</asp:DropDownList>

c gn l sdsContentTypes bit s ly d liu t u. DataTextField v


c gn l hai ct trong DataSet do SqlDataSource tr v. AutoPostBack c
gn l True m bo trang ny s c np li mi khi bn chn mt loi ni dung mi t
danh sch th xung.
DataSourceID

DataValueField

SqlDataSource ly d liu bng cch gi th tc tn tr sprocContentTypeSelectList. iu ny


c thc hin vi m nh du sau:
<asp:SqlDataSource ID=sdsContentTypes runat=server
ConnectionString=<%$ ConnectionStrings:Cms %>
SelectCommand=sprocContentTypeSelectList
SelectCommandType=StoredProcedure>
</asp:SqlDataSource>

M nh du ny cng ging nh m bn thy trc y khi ly cc mc trnh n t c s


d liu. Th tc tn tr c s dng bi ngun d liu rt n gin; nhng g n lm l yu
cu danh sch cc loi ni dung hin c:
CREATE PROCEDURE sprocContentTypeSelectList
AS
SELECT
Id, Description, SortOrder

35
Chng 7. CMS
FROM
ContentType
WHERE
Visible = 1
ORDER BY
SortOrder

Tip theo l xt n GridView. Cng nh danh sch th xung,


SqlDataSource thng qua thuc tnh DataSourceID:

GridView

c kt vi mt

<asp:GridView ID=gvCategories runat=server AutoGenerateColumns=False


DataKeyNames=Id DataSourceID=sdsCategories AllowPaging=True
AllowSorting=True>
... ni dung bn trong ca iu kim nm y
</asp:GridView>

Thuc tnh DataKeyNames c gn l Id (ID ca ch trong c s d liu) bo cho


GridView bit kha chnh ca bng l g. N goi ra, AllowPaging v AllowSorting c gn l
True. Theo cch ny, vic qun l d liu trong GridView tr nn d dng hn bi v bn c th
sp xp theo ct v xem d liu trong cc trang nh hn thay v phi cun mt danh sch di.
bit d liu g cn c hin th trong
trong phn qun tr (hnh 7-11).

GridView,

hy xem trang ny khi n c hin th

Hnh 7-11

Pha trn GridView chnh l danh sch th xung c tho lun trc y. Trong GridView,
bn thy cc ct hin th ID ca ch , m t ch , loi ni dung m n thuc v, th t sp
xp, hai nt chnh sa v xa ch . Khi bn nhp vo nt Sa, GridView chuyn sang ch
chnh sa v hin th cc iu kim c th chnh sa cho m t, loi ni dung, v th t sp
xp nh hnh 7-12.

Hnh 7-12

36
Chng 7. CMS

hin th cc mc c ch ch c v ch chnh sa, GridView bao gm mt s iu


kim BoundField, TemplateField, v CommandField. C rt nhiu m lnh lp i lp li, chng ta
ch xt mt s. Trc tin, xt ct ID:
<asp:BoundField DataField=Id HeaderText=ID
ReadOnly=True SortExpression=Id />

ny c kt vi ct Id trong c s d liu thng qua c tnh DataField. c tnh


c gn l True m bo khng th chnh sa ct ny khi GridView ch
chnh sa. V c s d liu t ng gn ID mi cho ch , khng c g cho php ngi dng
thay i gi tr ny. Bng vic gn SortExpression l Id, bn t c hai vic. Th nht,
HeaderText ca ct ny chuyn t mt nhn n gin thnh mt siu lin kt. Th hai, khi ct
ny c nhp vo, d liu s c sp theo ct m c tnh SortExpression ch nh.
BoundField
ReadOnly

Vi ct m t, mt TemplateField c s dng hin th mt nhn ch ch c v mt


textbox ch chnh sa. m bo trng ny khng b b trng, textbox c mc ni
vi mt iu kim RequiredFieldValidator.
Ct cho loi ni dung th phc tp hn mt cht, bi v n hin th mt danh sch th xung
ch chnh sa. M nh du cho ct ny nh sau:
<asp:TemplateField HeaderText=Content Type>
<ItemTemplate>
<asp:Label ID=Label1 runat=server
Text=<%# Bind(ContentTypeDescription) %>>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID=DropDownList1 runat=server
DataSourceID=sdsContentTypes DataTextField=Description
DataValueField=Id SelectedValue=<%# Bind(ContentTypeId) %>>
</asp:DropDownList>
</EditItemTemplate>
<ItemStyle Width=175px />
</asp:TemplateField>

Cng nh ct m t, TemplateField c s dng cho ct loi ni dung. ch ch c


(c nh ngha bi ItemTemplate), mt Label hin th vn bn c kt vi ct
ContentTypeDescription.
cha mt <asp:DropDownList> vi DataSourceID c gn l
y chnh l SqlDataSource c s dng hin th danh sch th xung
u trang. chn ng mc trong danh sch khi GridView ch chnh sa, v ly v
ng gi tr khi lu, SelectedValue ca iu kim c gn l <%# Bind(ContentTypeId) %>.
EditItemTemplate
sdsContentTypes.

Phn t <ItemStyle> trong TemplateField c s dng thit lp chiu rng ca ct ch


ch c v ch chnh sa.
Ct SortOrder cng tng t nh ct ContentType. Khc bit duy nht l ct ny khng s
dng ngun d liu, cc mc trong danh sch th xung c vit m cng.
Ct cui cng m bn cn xt l ct cha cc nt Sa v Xa. M nh du cho ct ny cng
kh n gin:
<asp:CommandField ShowDeleteButton=True
ShowEditButton=True ButtonType=Button
DeleteText=Xa EditText=Sa
CancelText=Hy b UpdateText=Cp nht>

37
Chng 7. CMS
<ItemStyle Width=150px />
</asp:CommandField>

iu kim CommandField c hai thuc tnh ShowDeleteButton v ShowEditButton u c gn


True. Khi bn nhp nt Sa, iu kim ny chuyn sang ch chnh sa, nt Xa tm thi
bin mt, v nt Sa c thay th bng nt Cp nht v nt Hy b. Khi bn thay i d liu v
nhp nt Cp nht, GridView kch hot UpdateCommand ca SqlDataSource. Khi bn nhp nt Xa,
n kch hot DeleteCommand ca SqlDataSource. thy cch lm vic ny, hy xem iu kim
SqlDataSource m GridView s dng:
<asp:SqlDataSource ID=sdsCategories runat=server
ConnectionString=<%$ ConnectionStrings:Cms %>
DeleteCommand=sprocCategoryDeleteSingleItem
DeleteCommandType=StoredProcedure
InsertCommand=sprocCategoryInsertUpdateSingleItem
InsertCommandType=StoredProcedure
SelectCommand=sprocCategorySelectlist
SelectCommandType=StoredProcedure
UpdateCommand=sprocCategoryInsertUpdateSingleItem
UpdateCommandType=StoredProcedure>
... cc tham s c nh ngha ti y
</asp:SqlDataSource>

N goi chui kt ni, SqlDataSource nh ngha mt s c tnh Command v CommandType. Vi


mi hnh ng: ly, thm, cp nht, xa d liu; iu kim ny c mt cu lnh tr n th
tc tn tr tng ng. Vi mi cu lnh ny, CommandType c gn l StoredProcedure.
l phn nh ngha cc tham s cho th tc tn tr. Phn t
nh ngha cc tham s c truyn cho th tc tn tr ly danh sch cc
ch . N h rng danh sch ny c lc theo loi ni dung c ch nh bi danh sch th
xung u trang:
Bn trong th

SqlDataSource

<SelectParameters>

<SelectParameters>
<asp:ControlParameter ControlID=lstContentTypes
Name=contentTypeId PropertyName=SelectedValue
Type=Int32 DefaultValue=-1 />
</SelectParameters>

Tham s duy nht l mt tham s kiu ControlParameter. Khi ngun d liu chuNn b ly d
liu t c s d liu, n s xt iu kim lstContentTypes, ly SelectedValue ca n, v
truyn cho th tc tn tr.
cho php cp nht d liu, ngun d liu nh ngha UpdateParameters nh sau:
<UpdateParameters>
<asp:Parameter Name=returnValue Type=Int32 Direction=ReturnValue />
<asp:Parameter Name=id Type=Int32 />
<asp:Parameter Name=description Type=String />
<asp:Parameter Name=contentTypeId Type=Int32 />
<asp:Parameter Name=sortOrder Type=Int32 />
</UpdateParameters>

Vi mi tham s ca th tc tn tr, mt i tng Parameter tng ng c nh ngha.


rng, khng cn gn cc tham s ny vo cc iu kim. Thay vo , GridView s dng
Bind kt cc iu kim ca n vi cc tham s ca ngun d liu theo tn. Do , biu thc
Bind cho loi ni dung ch chnh sa kt trc tip n tham s ny theo tn.

38
Chng 7. CMS

Tham s

c s dng ly gi tr tr v t th tc tn tr. Khi s dng


Configure Data Source trong Smart Tag ca ngun d liu, bn khng th thm tham s ny. Tuy
nhin, bn c th trc tip g tham s ny trong Source View, hoc nhp vo du ba chm (xem
hnh 7-13) sau UpdateQuery (hay cc truy vn khc) ti ca s Properties ca iu kim ngun
d liu trong Design View.

Hnh 7-13

Hnh 7-14

returnValue

39
Chng 7. CMS

N u bn nhp vo du ba chm, Command and Parameter Editor s hin ra nh hnh 7-14, cho
php bn sp xp li, xa, to mi hoc thay i cc tham s hin c. thay i Direction cho
mt tham s, bn cn nhp vo lin kt Show advanced properties, sau chn mt ty chn t
danh sch Direction.
Gi y bn c mi th thao tc d liu. Tuy nhin, c hai iu cn xem xt. Th nht
l cch th l cc mNu tin trng nhau. Th hai l cch chn ch mi. Chng ta s gii quyt
vn th nht trc.
Mi ch trong mt loi ni dung c th phi c mt m t duy nht ( khng xy ra
chuyn hai mc trnh n c cng tn). Th tc tn tr chn v cp nht ch th l vic
ny bng cch xt xem c mt ch cng tn hay cha trc khi chn hay cp nht:
IF NOT EXISTS (SELECT Id FROM Category
WHERE Description = @description AND ContentTypeId = @contentTypeId)
BEGIN
-- chn ch mi ti y
END
ELSE
BEGIN
SET @returnValue = -1 -- mu tin tn ti
END

Ch khi kim tra IF NOT EXISTS tr v True th mc ni dung mi s c chn. N gc li, th


tc tn tr tr v -1 cho SqlDataSource thng qua tham s returnValue. Trong code-behind
ca trang Categories, gi tr tr v ny s c kim tra. N u n khc -1 tc l tc v chn hay
cp nht thnh cng. N gc li, mt thng bo li c hin th cho ngi dng, cho bit tc
v khng thnh cng. N i tham s ny c kim tra l bn trong s kin Inserted v Updated
ca ngun d liu:
Protected Sub sdsCategories_AfterInsertOrUpdate(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs) _
Handles sdsCategories.Inserted, sdsCategories.Updated
Dim id As Integer = Convert.ToInt32(e.Command.Parameters(@returnValue).Value)
If id = -1 Then
lblErrorMessage.Text = tn ti ch vi m t ny. & _
Nhng thay i ca bn s khng c p dng.<br />
lblErrorMessage.Visible = True
End If
End Sub

Ch danh sch c phn cch bi du phNy trong mnh Handles, iu ny cho php bn
kt mt phng thc th l s kin vi nhiu s kin ca cc iu kim ging hoc khc
nhau.
Bi v GridView khng h tr chn d liu, iu kim FormView c s dng ngi dng
c th chn mt ch mi. Tng t nh cch thit lp GridView, FormView gm mt
InsertItemTemplate vi cc iu kim cung cp gi tr cho iu kim SqlDataSource vic
chn c din ra. InsertItemTemplate cha mt textbox cho ct m t, mt
RequiredFieldValidator, v hai danh sch th xung cho ct loi ni dung v ct th t sp
xp. thy FormView ny, nhp nt To ch mi trn trang Categories. Phng thc
btnNew_Click trong code-behind s pht sinh, lm Nn panel pnlList v hin panel pnlNew, cho
php bn chn ch mi.

40
Chng 7. CMS

Cng ging nh GridView, FormView c kt vi ngun d liu sdsCategories, nhng lc ny


n s dng InsertCommand gi d liu do ngi dng nhp n th tc tn tr chn ch
mi. Khi bn nhp nt Lu, cc gi tr m bn nhp vo FormView s c gi n
SqlDataSource v c chuyn vo c s d liu. Cng nh vi GridView, phng thc
sdsCategories_AfterInsertOrUpdate c s dng xc nh c mt ch cng tn hay
cha.
Bn nh ngha din mo ca website bi vic qun l cc mc trong trnh n chnh v
trnh n con, y l lc xt n vic to ni dung thc t cho website. Phn tip theo s kho
st hai trang qun l cc mc ni dung, l ContentList.aspx v AddEditContent.aspx.

Qun l ni dung
Khi nhp chn mc Qun l ni dung trn trnh n qun tr, bn c a n trang
ContentList.aspx lit k cc mc ni dung hin c trong c s d liu. phn bit ni dung
ang tn ti v ni dung b xa, trang ny c mt danh sch th xung gm hai mc: Tch
cc v b xa. Mi khi bn chn mt mc mi t danh sch th xung , trang ny s c
lm ti v hin th danh sch cc mc ni dung ang tn ti hoc b xa. Trang ny cng
c mt SqlDataSource vi SelectCommand v DeleteCommand c gn l cc th tc tn tr cho
php bn ly danh sch cc mc ni dung hoc xa mt mc ni dung.
GridView c s dng trong trang ny cng tng t nh GridView c s dng hin th
cc ch . Tuy vy, c hai im khc bit quan trng v s c xem xt ngay sau y. Th
nht, GridView ny khng th chnh sa c, cho nn bn s khng thy cc TemplateField
cng vi mt EditItemTemplate.

im th hai l cch thit lp cc nt dng xa v chnh sa cc mc ni dung hin c.


Vi trang Categories, bn s dng mt CommandField vi ShowDeleteButton v
ShowEditButton u c gn l True. N hng vi trang ContentList, mi nt thuc mt ct
ring:
<asp:ButtonField ButtonType=Button CommandName=Edit Text=Sa>
<ItemStyle Width=75px />
</asp:ButtonField>
<asp:CommandField ButtonType=Button ShowDeleteButton=True DeleteText="Xa">
<ItemStyle Width=75px />
</asp:CommandField>

N t Xa c sinh bi mt CommandField vi ShowDeleteButton c gn l True. Khi bn nhp


nt Xa, GridView kch hot DeleteCommand trn iu kim SqlDataSource tng ng xa
mc ni dung khi c s d liu. Cch lm vic ny ging ht xa ch .
Khi bn chnh sa mt mc ni dung, cc th s khc cht t. V mt mc ni dung cn c
mt s trng khc ngoi cc textbox mc nh v cc iu kim th xung, khng nn chn
cch chnh sa mc ni dung ngay trong khung li (inline). Thay vo , khi bn nhp nt
Sa, RowCommand ca iu kim GridView c kch hot v a bn n trang
AddEditContent.aspx, cho php bn nhp ni dung vi cc iu kim phc tp. Trang ny s
c xt sau. M lnh chuyn bn n trang ny nh sau:
Protected Sub gvContent_RowCommand(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) _
Handles gvContent.RowCommand
Select Case e.CommandName.ToLower()
Case edit

41
Chng 7. CMS
Dim recordIndex As Integer
Dim recordId As Integer
recordIndex = Convert.ToInt32(e.CommandArgument)
recordId = Convert.ToInt32(gvContent.DataKeys(recordIndex).Value)
Response.Redirect(AddEditContent.aspx?Id= & recordId.ToString())
End Select
End Sub
ButtonField cho nt Sa c CommandName c gn l Edit. Bn trong s kin RowCommand, tn
lnh c ly t thuc tnh CommandName ca GridViewCommandEventArgs. N u tn lnh l Edit,
bn bit rng nt Sa c nhp. Sau , bn c th s dng CommandArgument ly c
index ca dng c nhp chn trong khung li (bt u t 0). N u bn nhp mc th ba th
CommandArgument s c gi tr l 2. Tip theo, bn c th s dng index ny ly kha ca
mc ni dung. Tp hp DataKeys ca GridView tr v kha chnh ca mc ni dung trong c s
d liu, y chnh l ci bn cn bi v trang AddEditContent.aspx yu cu ID ca mt mc ni
dung. Khi c kha ny, bn c th to mt URL vi ID c ni vo chui truy vn v a
ngi dng n trang .

l mt iu kim tuyt vi, cho php bn nhp d liu vo c s d liu vi rt t m


lnh. Tuy nhin, n ch ph hp cho nhng trng hp truy xut d liu n gin, ging nh
trang Categories trong th mc Management. Mt trong nhng tr ngi ln nht ca iu kim
ny l bn cn phi nh ngha cc template khc nhau cho thao tc chn v cp nht d liu.
Vi cc trang phc tp, cn nhiu iu kim, vic thit lp mt form nh th c th tr nn
di dng v d xy ra li.
FormView

trnh nhng vn ny, mt cch tip cn khc c thc hin vi trang


Thay v da vo cc iu kim ni ti a d liu vo/ra c s d liu, lp
Content (biu din mt mc ni dung trong c s d liu) v ContentDB (m nhim vic giao
tip vi c s d liu) c s dng. Bn trong trang, bn s dng cc lp ny ly mt
mc ni dung t c s d liu, v s dng cc iu kim thng thng nh textbox, danh
sch th xung. thy cch lm vic ny, hy xem phn m nh du ca trang
AddEditContent.aspx.
AddEditContent.

cui trang, bn s thy hai iu kim SqlDataSource dng hin th cc loi ni dung v
cc ch hin c trong mt danh sch th xung. N gun d liu cho cc ch l
sdsCategories, c kt vi danh sch cc loi ni dung bng mt SelectParameter. iu ny
m bo rng: mi khi bn chn mt loi ni dung mi t danh sch th xung, trang ny s
c lm ti v hin th danh sch cc ch thuc loi ni dung . Hai danh sch th
xung ny c DataSourceID c gn l iu kim SqlDataSource tng ng, cc thuc tnh
DataTextField v DataValueField tr n cc ct trong DataSet m ngun d liu tr v.
Chng c g mi trong trang ny! N hng cc iu kim khc trong trang nhn d liu bng
cch no? hiu cch lm vic ny, bn hy m file code-behind ca AddEditContent.aspx v
quan st s kin Page_Load:
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
If Request.QueryString.Get(Id) IsNot Nothing Then
contentId = Convert.ToInt32(Request.QueryString.Get(Id))
End If
If Not Page.IsPostBack And contentId > 0 Then
Dim myContentItem As Content = Content.GetItem(contentId)

42
Chng 7. CMS
If myContentItem IsNot Nothing Then
Me.Title = Chnh sa & myContentItem.Title
txtTitle.Text = myContentItem.Title
txtIntroText.Value = myContentItem.IntroText
txtBodyText.Value = myContentItem.BodyText
chkVisible.Checked = myContentItem.Visible
lstContentTypes.DataBind()
lstContentTypes.SelectedValue = myContentItem.ContentTypeId.ToString()
lstCategories.DataBind()
lstCategories.SelectedValue = myContentItem.CategoryId.ToString()
End If
End If
End Sub

Trong phng thc ny, m lnh thu ly contentId t chui truy vn (nu c). N u khng c
chui truy vn (c ngha l mt mc mi s c chn vo), khi If tip theo s khng thc
thi. Tuy nhin, nu c chui truy vn, mt s hnh ng s c thc hin. u tin, phng
thc GetItem ca lp Content c gi. Phng thc ny nhn ID ca mc ni dung trong c
s d liu v tr v mt i tng Content. Chng ta s kho st i tng Content v lp
ContentDB tng ng ca n sau khi tho lun xong phng thc Page_Load. Mt khi c
mt i tng Content hp l, bn c th s dng cc thuc tnh cng khai ca n nh Title,
IntroText, v BodyText gn cho cc gi tr khi to ca cc iu kim v tiu trang. Cc
iu kim txtIntroText v txtBodyText thc cht l cc FCKeditor. Chng ta s kho st
FCKeditor trong phn sau.
Khng ging nh cc iu kim text, cc iu kim danh sch th xung i hi mt cht t
duy. Danh sch ch c kt vi danh sch loi ni dung, do n lun hin th cc ch
thuc loi ni dung ang c chn. iu ny c ngha: bn phi d liu vo danh sch
loi ni dung v chn trc mt loi ni dung trc khi lm vic vi cc ch . M lnh
trong phng thc Page_Load thc hin iu ny nh sau:
lstContentTypes.DataBind()
lstContentTypes.SelectedValue = myContentItem.ContentTypeId.ToString()

u tin, phng thc DataBind ca iu kim lstContentTypes c gi. iu kim


SqlDataSource tng ng c kch hot ly cc loi ni dung t c s d liu. Dng m
th hai thit lp SelectedValue ca iu kim lstContentTypes l ContentTypeId ca mc ni
dung.
Hai dng tip theo thu ly cc mc cho danh sch th xung th hai (hin th cc ch hin
c):
lstCategories.DataBind()
lstCategories.SelectedValue = myContentItem.CategoryId.ToString()

Khi DataBind ca danh sch ch c gi, SqlDataSource tng ng c kch hot. N h


cp lc u, iu kim ny c mt SelectParameter ng vi gi tr c chn trong
danh sch loi ni dung. V trc li gi DataBind, bn gn SelectedValue , nn by gi
ngun d liu s ly ng cc ch thuc loi ni dung c chn. Khi cc ch
c thm vo danh sch th xung, dng cui cng gn SelectedValue ca danh sch l
CategoryId ca i tng Content.
Gi y, bn bit cch hin th nhng d liu ca i tng Content trong cc iu kim khc
nhau, nhng c l bn thc mc v cch to mc ni dung. N h bn thy trong phn Thit

43
Chng 7. CMS

k CMS, lp Content c mt s thuc tnh cng khai v mt phng thc chia s GetItem
(nhn ID ca mt mc ni dung v tr v mt th hin ca lp Content). N hng g phng
thc GetItem trong tng nghip v thc hin l y nhim cho mt phng thc cng tn trong
lp ContentDB:
Public Shared Function GetItem(ByVal id As Integer) As Content
Return ContentDB.GetItem(id)
End Function

n lt phng thc
cho m lnh gi:

GetItem

ca lp

ContentDB

ly mc ni dung t c s d liu v tr v

Public Shared Function GetItem(ByVal id As Integer) As Content


Dim theContentItem As Content = Nothing
Using myConnection As New SqlConnection(AppConfiguration.ConnectionString)
Dim myCommand As SqlCommand = New SqlCommand _
(sprocContentSelectSingleItem, myConnection)
myCommand.CommandType = CommandType.StoredProcedure
myCommand.Parameters.AddWithValue(@id, id)
myConnection.Open()
Using myReader As SqlDataReader = _
myCommand.ExecuteReader(CommandBehavior.CloseConnection)
If myReader.Read Then
theContentItem = _
New Content(myReader.GetInt32(myReader.GetOrdinal(Id)))
theContentItem.Title = _
myReader.GetString(myReader.GetOrdinal(Title))
theContentItem.IntroText = _
myReader.GetString(myReader.GetOrdinal(IntroText))
theContentItem.BodyText = _
myReader.GetString(myReader.GetOrdinal(BodyText))
theContentItem.ContentTypeId = _
myReader.GetInt32(myReader.GetOrdinal(ContentTypeId))
theContentItem.CategoryId = _
myReader.GetInt32(myReader.GetOrdinal(CategoryId))
theContentItem.Visible = _
myReader.GetBoolean(myReader.GetOrdinal(Visible))
End If
myReader.Close()
End Using
End Using
Return theContentItem
End Function

u tin, on m trn khai bo mt bin c kiu Content v gn l


thy mc ni dung trong c s d liu, gi tr ny s c tr v.

Nothing.

N u khng tm

Tip theo, mt th hin ca SqlConnection v SqlCommand c to. Cu lnh Using m bo


i tng kt ni t ng b hy khi khi m hon tt. Tn th tc tn tr m bn mun
thc thi c truyn cho phng thc khi dng ca i tng SqlCommand. CommandType ca
i tng SqlCommand c gn l StoredProcedure v mt tham s gi ID ca mc ni dung
c to.

44
Chng 7. CMS

Sau , kt ni c m v phng thc ExecuteReader ca i tng cu lnh pht sinh, tr


v mt SqlDataReader. N u phng thc Read() tr v True, tc l tm thy mt mNu tin, bn
c th to mt i tng Content mi v gn cho mi thuc tnh cng khai ca n gi tr thu
c t SqlDataReader. cch s dng cc phng thc GetOrdinal. V mt thit k, cc
phng thc Get* (nh GetInt32 v GetString ca SqlDataReader) nhn mt s nguyn (bt
u t 0) l index ca ct. iu c ngha: ly tiu ca mc ni dung, bn cn s dng
myReader.GetString(1). iu ny khin m lnh kh c, bi v bn s qun ct no c index
l g. May mn l SqlDataReader cng c phng thc GetOrdinal nhn tn ct v tr v v tr
ca n trong tp kt qu. iu ny khin m lnh d c v d bo tr hn:
myReader.GetString(myReader.GetOrdinal(Title)).
Mt khi tt c cc thuc tnh cng khai ca mc ni dung c thit lp,
c ng li v mc ni dung c tr v cho m lnh gi.

SqlDataReader

t hn bn c HTML Editor c s dng trong trang AddEditContent.aspx. Editor ny khng


phi ca .NET Framework, cng khng phi ca ASP.NET. l FCKeditor, mt d n m ngun
m, c pht trin bi Frederico Caldeira Knabben. Bn c th tm thy phin bn mi nht ca
FCKeditor ti www.fckeditor.com. V qu trnh ci t FCKeditor s c gii thiu trong phn Ci
t CMS nn phn ny ch tp trung vo cch s dng n.

Hnh 7-15

S dng FCKeditor cng n gin nh ci t n. i vi cc trang ASP.NET, nhng ngi to ra


editor ny pht trin mt .NET assembly (mt file .dll), v file ny phi c t trong th
mc Bin ca ng dng. Bn c th s dng DLL ny ty bin hp cng c ca Visual Studio
2005 (hay Visual Web Developer), nh th bn c th ko cc th hin ca editor ny t hp cng
c ln trang. ty bin hp cng c, bn hy m hp cng c (Ctrl+Alt+X), nhp phi vo
v chn Choose Items. Trong hp thoi Choose Toolbox Items, nhp Browse v chn file

45
Chng 7. CMS
FredCK.FCKeditorV2.dll trong th mc Bin ca ng dng (C:\Inetpub\wwwroot\CMS\Bin hay
C:\Websites\CMS\Bin). Editor ny s xut hin vi biu tng hnh bnh rng trong hp cng c.
Mi khi cn mt HTML Editor, bn hy ko mt th hin ca FCKeditor ln trang thay v mt

textbox chuNn.

Hnh 7-16

D dng lm vic vi editor ny, theo quan im ca c ngi lp trnh ln ngi s dng
cui. Cng ging nh mt iu kim .NET thng thng, n trng ra cc thuc tnh nh chiu
rng v chiu cao. Tuy nhin, khi lm vic vi editor ny, bn s nhn thy mt s im khc
bit ng bn lun. Th nht, n khng c thuc tnh Text nh textbox mc nh, thay vo
l thuc tnh Value. Trn thc t, cc thuc tnh ny c th c xem l nh nhau, trong
Value cho php bn gn v ly vn bn c nh dng theo HTML t iu kim ny.
Mt iu quan trng khc cn ch l cch FCKeditor lm vic vi cc iu kim validator.
Theo mc nh, cc iu kim validator c kch hot khi iu kim tng ng (trn form)
mt focus (chng hn khi bn s dng tab hoc nhn nt submit). Tuy nhin vi FCKeditor,
HTML c chp t editor vo mt trng Nn ri mi c xc nhn tnh hp l. Vic chp ny
cng din ra khi editor mt focus, nhng sau khi cc iu kim c xc nhn tnh hp l.
i vi ngi dng cui, mt thng ip bo rng trng dng cho editor l bt buc, nhng
thc t n c gi tr hp l. Cch nhanh nht khc phc iu ny l nhn nt submit mt
ln na. Hin nhin y khng phi l mt gii php hay cho mt ng dng thc s. Cch tt
nht l v hiu vic xc nhn tnh hp l pha client trong cc trang c s dng editor. K
thut ny c p dng cho trang AddEditContent.aspx bng cch gn c tnh CausesValidation
ca nt Lu l False. N h th, vic xc nhn tnh hp l s khng din ra ti client; nhng ti
server, mi iu kim vn c kim tra gi tr.
cch s dng thuc tnh ToolbarSet cp cho txtIntroText v txtBodyText cc b nt
khc nhau. Phn cu hnh cho FCKeditor (c lu trong file FCKeditor\fckconfig.js) cho php bn
nh ngha cc b thanh cng c. B thanh cng c Default cha tt c cc nt, trong khi Cms
v Basic th c hn ch. to mt b thanh cng c mi, hy chp b thanh cng c
Default, sau b i cc nt khng cn thit.
Bi v cc iu kim FCKeditor c th cha cc th HTML v m JavaScript, ASP.NET Framework
mc nh s chn cc gi tr ny, v nm bit l HttpRequestValidationException vi thng

46
Chng 7. CMS

ip A potentially dangerous Request.Form value was detected. khng cho li xut hin,
ValidateRequest c gn l False trong ch th page ca trang AddEditContent.aspx.
Phn cui cng ca trang AddEditContent.aspx m bn cn xem l lu mt mc ni dung vo c
s d liu. Khi bn in d liu cho trang v nhn nt Lu, on m sau (trong phng
thc th l s kin Click ca nt Lu) s pht sinh:
Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles btnSave.Click
Page.Validate()
If Page.IsValid Then
Dim myContentItem As Content
If Request.QueryString.Get(Id) IsNot String.Empty Then
myContentItem = _
New Content(Convert.ToInt32(Request.QueryString.Get(Id)))
Else
myContentItem = New Content()
End If
myContentItem.Title = txtTitle.Text
myContentItem.IntroText = txtIntroText.Value
myContentItem.BodyText = txtBodyText.Value
myContentItem.Visible = chkVisible.Checked
myContentItem.ContentTypeId = Convert.ToInt32(lstContentTypes.SelectedValue)
myContentItem.CategoryId = Convert.ToInt32(lstCategories.SelectedValue)
myContentItem.Save()
Response.Redirect(ContentList.aspx)
End If
End Sub

u tin, Page.Validate() c gi kim tra cc iu kim trong trang c gi tr hp l


hay cha. N u trang hp l, bn c th to mt th hin mi ca Content. iu ny c th
xy ra theo hai hng, ty vo bn chnh sa mt mc ni dung c hay to mt mc ni
dung mi. Trong bn thit k ca lp Content, ID ca lp Content l ch c m lnh gi
khng th thay i n trong vng i ca i tng. l l do mt phng thc khi dng
np chng ca lp Content c gi, phng thc ny nhn ID ca mc ni dung trong trng
hp bn cp nht mt mc ni dung c. N gc li, khi bn to mt mc ni dung mi, m
lnh ch vic gi phng thc khi dng mc nh ly mt th hin Content mi.
Sau , m lnh gn cho mi thuc tnh cng khai ca lp Content gi tr c ly t iu
kim tng ng. cch s dng .Value thay v .Text ly cc gi tr ca hai FCKeditor.
Khi tt c cc thuc tnh c thit lp, gi phng thc Save ca lp Content. Tng t
nh phng thc GetItem, phng thc ny gi phng thc Save ca lp ContentDB v truyn
chnh n vi t kha Me:
Public Sub Save()
ContentDB.Save(Me)
End Sub

Cng ging nh phng thc GetItem, Save thit lp mt SqlConnection v mt SqlCommand.


Sau , n a vo i tng SqlCommand cc tham s vi gi tr c ly t i tng
Content. Cui cng, ExecuteNonQuery c s dng gi cu lnh n c s d liu:
If contentItem.Id > 0 Then
myCommand.Parameters.AddWithValue(@id, contentItem.Id)
End If
myCommand.Parameters.AddWithValue(@title, contentItem.Title)

47
Chng 7. CMS
myCommand.Parameters.AddWithValue(@introText, contentItem.IntroText)
myCommand.Parameters.AddWithValue(@bodyText, contentItem.BodyText)
myCommand.Parameters.AddWithValue(@contentTypeId, contentItem.ContentTypeId)
myCommand.Parameters.AddWithValue(@categoryId, contentItem.CategoryId)
myCommand.Parameters.AddWithValue(@visible, contentItem.Visible)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()

Khi phng thc ny hon tt, quyn iu khin c tr v cho trang ASPX gi (chuyn
hng ngi dng v trang ContentList, ni mc ni dung c hin th).
N u c mt t kinh nghim lp trnh, bn c th nhn ra mt s vn vi m lnh truy xut
d liu bn trn. Trc tin l khng c th l li (khng s dng khi Try/Catch). y khng
phi l li lp trnh hay, v kh bit c ni no, khi no, v bng cch no cc li xut hin
trong website ca bn. Chng Blog (tp mt) c mt cch hay bt cc li xy ra lc thc
thi, to mt e-mail v chi tit li v gi cho ngi qun tr hoc ngi pht trin website.
Th hai, m lnh b l thuc nhiu vo SQL Server. Mc d vic pht trin cho mt loi c s
d liu l nhanh chng v d dng, nhng khng phi lc no cng l mt gii php tt.
Trong chng Blog (tp mt), bn bit c cch vit m lnh truy xut d liu lm vic vi
c SQL Server v Microsoft Access m khng c bt k hiu chnh no.
Vic thm mt ni dung mi v qun l cc mc ni dung hin c l bc cui cng trong
qu trnh qun l ni dung. By gi, chng ta xem xt cch trnh by ni dung trong phn
front-end ca website.

7.3.3 Hin th ni dung trn website


Vic hin th ni dung trong phn cng khai ca website c th l bi hai trang:
ContentList.aspx v ContentDetail.aspx. Trang th nht m nhn vic hin th danh sch cc mc
ni dung thuc loi ni dung v ch c yu cu. N ch hin th mt bn ngn ca mi
mc ni dung trong iu kim DataList, v c cc iu kim HyperLink dn bn n trang
chi tit. Sau , trang chi tit s hin th ton b mc ni dung.
Trang ContentList.aspx cha mt iu kim SqlDataSource vi hai tham s la chn: mt cho
loi ni dung v mt cho ch . C hai tham s ny c ly t chui truy vn (nu tn ti):
<asp:SqlDataSource ID=sdsContentList runat=server
ConnectionString=<%$ ConnectionStrings:Cms %>
SelectCommand=sprocContentSelectListByContentTypeAndCategoryId
SelectCommandType=StoredProcedure
CancelSelectOnNullParameter=False>
<SelectParameters>
<asp:QueryStringParameter Name=contentTypeId
QueryStringField=ContentTypeId Type=Int32 />
<asp:QueryStringParameter Name=categoryId
QueryStringField=CategoryId Type=Int32 DefaultValue= />
</SelectParameters>
</asp:SqlDataSource>

Trc khi ly d liu t c s d liu, ngun d liu ny ly cc gi tr cho loi ni dung v


ch t chui truy vn v gn chng cho cc tham s. Ch cch s dng c tnh
CancelSelectOnNullParameter trn iu kim SqlDataSource. Gi tr mc nh ca tham s ny
l True, c ngha iu kim s khng ly d liu t c s d liu nu tn ti mt tham s c
gi tr null. y khng phi l iu bn mun. Khi mt trong cc loi ni dung c nhp

48
Chng 7. CMS

chn, v cha c ch no c chn, bn mun hin th tt c cc mc ni dung thuc loi


ni dung chn, bt chp ch l g. Th tc tn tr trong c s d liu tr v tt c mc
ni dung ng vi mt loi ni dung no khi tham s CategoryId l null, cho nn bn phi
m bo m lnh vn truy xut th tc ngay khi khng c chui truy vn cho ch . Bn thc
hin iu ny bng cch gn CancelSelectOnNullParameter l False.
SqlDataSource

trn s c s dng bi DataList di y (gm mt


ca mc ni dung v lin kt Xem tip):

ItemTemplate

hin th

Title, IntroText

<asp:DataList ID=dlContent runat=server DataKeyField=Id


DataSourceID=sdsContentList>
<ItemTemplate>
<h2 class=ItemTitle><asp:Literal ID=lblTitle runat=server
Text=<%# Bind(Title) %>></asp:Literal></h2>
<div class=IntroText><asp:Literal ID=lblIntroText runat=server
Text=<%# Eval(IntroText) %>></asp:Literal></div><br />
<asp:HyperLink ID=hyperReadMore runat=server
NavigateUrl=<%# ~/ContentDetail.aspx?Id= &
Eval(Id) & &ContentTypeId= & Eval(ContentTypeId)& &CategoryId= &
Eval(CategoryId) %> Text=Xem tip...></asp:HyperLink><br /><br />
</ItemTemplate>
<SeparatorTemplate>
<hr />
</SeparatorTemplate>
</asp:DataList>

Cc mc ni dung trong danh sch c phn tch bng th <hr /> trong <SeparatorTemplate>.
Bn c th t bt c th g gia hai mc ni dung, bao gm hnh nh, banner, hay HTML.
Ch cch s dng Eval thay cho Bind kt d liu vo cc iu kim trong template. Bi
v bn cn hin th d liu ch-c, khng cn kt d liu hai chiu, s dng phng thc Eval
s nhanh hn.
N u yu cu trang ContentList trong trnh duyt, bn s thy mt danh sch gm cc mc ni
dung xut hin. Lin kt Xem tip di mi mc s dn bn n trang ni dung chi tit. Trang
ny c ba iu kim <asp:Literal> dng hin th ni dung t c s d liu:
<h1 class=ItemTitle><asp:Literal ID=litTitle runat=server></asp:Literal></h1>
<div class=IntroText><asp:Literal ID=litIntrotext
runat=server></asp:Literal></div>
<div class=BodyText><asp:Literal ID=litBodyText
runat=server></asp:Literal></div>

Cc iu kim Literal c bao bc bn trong cc phn t <h1> v <div>, cho nn d dng p


dng mt lp CSS thay i nh dng ca chng lc thc thi. File Styles.css c lp ItemTitle
vi kiu font m v ln, trong khi lp IntroText vi kiu font in nghing. Bn c th s
dng bt k CSS no bng cch thay i cc lp c nh ngha trong file Styles.css thuc th
mc CSS.
Ba iu kim Literal nhn gi tr t mt th hin ca lp Content bng phng thc GetItem.
Khi trang chi tit c np, on m sau c thc thi trong s kin Page_Load ca n:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
If Request.QueryString.Get(Id) IsNot Nothing Then
contentId = Convert.ToInt32(Request.QueryString.Get(Id))
Dim contentItem As Content = Content.GetItem(contentId)
If contentItem IsNot Nothing Then

49
Chng 7. CMS
Me.Title = contentItem.Title
litTitle.Text = contentItem.Title
litIntrotext.Text = contentItem.IntroText
litBodyText.Text = contentItem.BodyText
End If
End If
End Sub

Cng tng t nh trang AddEditContent.aspx, on m trn ly mt th hin mi ca lp


Content bng cch gi GetItem v truyn cho n ID ca mc ni dung (c ly t chui truy
vn). N u phng thc ny tr v mt th hin Content, thuc tnh Title ca trang v thuc
tnh Text ca ba iu kim Literal s nhn gi tr t thuc tnh Title, IntroText, v BodyText.
Cc iu kim Literal cng c th cha m HTML t FCKeditor (c s dng nh dng
mc ni dung trong phn qun tr).
CMS l im khi u gip bn lm quen vi cc website vn hnh theo c s d liu. C phn

trnh by v chc nng ca website u kh n gin, cho php bn tp trung vo nhng khi
nim v k thut quan trng, khng phi ui theo nhng thit k phc tp. Th nhng d
dng t c mt s tnh nng mi v nhng ci tin cho CMS, thm ch lm cho n hu ch
hn nhng g c.

7.4

Ci t CMS

Bn c th ci t CMS theo hai cch: s dng gi ci t hoc ci t bng tay.

9
9

Bn c th s dng gi ci t khi IIS c ci t trn my ca bn. Chy gi ci


t s to mt th mc o vi tn l CMS trong IIS. Th mc c to bi gi ci t
cha ton b m ngun ca CMS, bao gm c s d liu.
Bn c th chp ton b d n CMS t CD-ROM nh km vo a cng. Cch ny cho
bn chn v tr t file, nhng bn s phi cu hnh IIS bng tay, hoc duyt website
bn trong Visual Studio 2005 (hay Visual Web Developer).

C hai kiu ci t u gi nh rng .NET Framework 2.0 (bt buc i vi Visual Studio 2005 v
Visual Web Developer) c ci t. Cng gi nh rng bn ci t SQL Server 2005 Express
Edition vi tn th hin l SqlExpress. N u chn mt tn th hin khc, m bo rng bn s
dng tn trong chui kt ni cho CMS (trong file Web.config).

S dng gi ci t
N u bn mun ci t CMS nh mt website thc th trn mt my tnh hay my server, khng
c hiu chnh hay m rng g c, thc hin theo cc bc sau (s dng gi ci t):
Chy file WebSetupProjects\CMS\Debug\CMS.msi t CD-ROM nh km. Qu trnh ny ci
t nhng file cn thit vo th mc C:\Inetpub\wwwroot\CMS\. Ch rng, trong lc
ci t, c mt mn hnh yu cu bn xc nhn tn th mc o, bn hy gi nguyn
tn mc nh l CMS (xem hnh 7-17).
N hp Next ci t ng dng, v ng chng trnh ci t khi hon tt.

50
Chng 7. CMS

Hnh 7-17

Ci t bng tay
Chp th mc Websites\CMS\ t CD-ROM nh km vo a cng, chng hn C:\Websites\
CMS\.

M Visual Studio 2005 (hay Visual Web Developer). Chn File | Open Web Site v tm n th
mc C:\Websites\CMS\. Khi , ca s Solution Explorer cha tt c cc file ca d n.
Bc sau cng l cu hnh cc thit lp bo mt cho ng dng. Bc ny c tho
lun trong phn tip theo.

Thay i cc thit lp bo mt
Vic cui cng cn thc hin l kch hot quyn ghi cho th mc UserFiles (c s dng bi
FCKeditor v th mc App_Data). Bn s cn thay i cc thit lp bo mt cho ti khon m
web server s dng. N u bn s dng Developer Web Server i cng Visual Studio 2005 (hay Visual
Web Developer), ti khon ny l ti khon m bn s dng ng nhp vo my. N u bn
chy site bng IIS, ti khon ny l ASPNET trn Windows XP/2000 hoc l NETWORK SERVICE trn
Windows Server 2003/Vista. thay i cc thit lp bo mt, tun theo cc bc sau:
M Windows Explorer v tm th mc UserFiles ca ng dng. N u bn s dng gi ci
t, ng dn ny l C:\Inetpub\wwwroot\CMS\UserFiles (mc nh). N u bn ci t
bng tay v tun theo cc ch dn, ng dn ny l C:\Websites\CMS\UserFiles.
N hp phi vo th mc UserFiles v chn Properties. Trong hp thoi UserFiles Properties,
nhp th Security (xem hnh 7-18).

i vi Windows XP, nu khng thy th Security, bn hy ng hp thoi ny v chn


Tools | Folder Options trong Windows Explorer. Sau , chn th View, cun n cui danh
sch Advanced settings, b chn Use Simple File Sharing (Recommended) (xem hnh 7-19).
N hp OK ng hp thoi Folder Options ri m li hp thoi UserFiles Properties.

51
Chng 7. CMS

Hnh 7-18

Hnh 7-19

Ty vo h thng v cu hnh m bn c nhiu hay t ngi dng trong danh sch


Group or User Names. Thm ti khon ca bn, ti khon ASPNET, hay ti khon
NETWORK SERVICE, sau gn cho ti khon ny quyn Modify v Read.
N hp OK ng hp thoi UserFiles Security.
Lp li cc bc trn cho th mc App_Data.

52
Chng 7. CMS

Chy th nghim CMS


Lc ny y, ng dng sn sng thc thi. Duyt http://localhost/CMS (nu ci t bng gi ci
t) hoc nhn F5 trong Visual Studio 2005 (hay Visual Web Developer) chy ng dng. qun
l cc ch v mc ni dung trong phn qun tr, nhp th Qun tr. V th mc Management
c bo v bng mt thit lp trong file Web.config, bn cn phi ng nhp trc. Bn c th
ng nhp vi tn ngi dng l Administrator v mt khNu l Admin123#.

7.5

M rng CMS

Chng ny tp trung ch yu vo kha cnh c s d liu ca CMS, cc khi nim quan trng
lm nn tng ca CMS, khng chy theo nhng tnh nng hp dn v giao din bt mt. Tuy
nhin, bn c c c s vng chc xy dng, hin thc cc tnh nng p ng nhu cu
ca chnh bn hay khch hng. Vi cc khi nim v k thut c trnh by trong chng
ny, bn c th m rng CMS vi cc tnh nng ca ring mnh. Mt s m rng c th bao
gm:

9
9

Hin th thm thng tin cho mc ni dung. Thay v ch hin th tiu v phn
thn, bn c th hin th nhng thng tin nh ngy ng, ngy cp nht cui, v tc
gi ca mc ni dung.
Xp hng ni dung. Hy cho ngi dng xp hng mc ni dung theo quan im
ca h. Bn c th thu thp vic xp hng ca ngi dng bng mt iu kim ngi
dng n gin v hin th cc kt qu (chng hn dng biu ct) bng mt iu
kim ngi dng khc.
Phn hi ca ngi dng. Mt m rng thng thy cho mt website CMS l cho
php ngi dng phn hi v mt mc ni dung; v qua , mc ni dung c th
c nng gi tr, c hi nhng ngi khc c n s tng cao.

Mt tnh nng quan trng khc l b m (hit counter). S rt th v khi bit c c bao
nhiu ngi xem mc ni dung ca bn. iu ny gip bn nhn bit th no l mt bi
vit c a thch. N cng gy hng th cho khch, v cho thy mc ni dung c ng
c hay khng. Phn ny s trnh by cch hin thc b m.
C nhiu cch hin thc thc b m cho mi mc ni dung trong website ca bn. Trong
mi trng hp, bn cn c cch lu tr thng tin v ID ca mc ni dung v s lt xem mc
ni dung . V ton b CMS vn hnh theo c s d liu, nn thng tin ny cng nn c lu
trong c s d liu. Chng ta s cn mt bng vi tn l PageView, gm mt ct gi ID ca
mc ni dung v mt ct theo di s lt xem mc ni dung .
iu cn xem xt tip theo l thc hin thao tc m u. Ban u, dng nh th tc tn
tr sprocContentSelectSingleItem (thu ly mt mc ni dung t c s d liu) l ni thch
hp nht. Khi mc ni dung c thu ly t c s d liu, bn bit rng n s c hin th
trn website mt s dng. Tuy nhin, th tc tn tr ny cng c s dng ly mt mc
ni dung trong phn qun tr. iu ny c ngha mi khi bn mun chnh sa mt mc ni
dung, bn cng c th tng b m, dn n vic thng k ma.
Thc t, v tr tt nht theo di s lt xem l trong trang ContentDetail.aspx. Ti trang ny,
bn bit rng mc ni dung hin ang c yu cu nn d dng cp nht s lt xem trong

53
Chng 7. CMS

c s d liu. mi th tr nn d qun l, tt nht l to mt lp ring bit (ly tn l


Logging) vi mt phng thc cp nht c s d liu (LogContentItemRead). Vic s dng mt
lp ring bit th ny cho php bn thm nhng tnh nng khc nh theo di a ch IP ca
khch, ngy gi c yu cu,
hin thc lp ny v m lnh truy xut d liu ca n, bn tun theo cc bc sau:
Bn trong th mc BusinessLogic (thuc th mc App_Code gc website), to mt lp
mi vi tn l Logging.
Thm mt Shared Sub vi tn l LogContentItemRead nhn ID ca mt mc ni dung
(kiu Integer) v cho phng thc ny gi mt phng thc khc trong tng truy
xut d liu (c cng tn v cng ch k):
Public Shared Sub LogContentItemRead(ByVal contentId As Integer)
ContentDB.LogContentItemRead(contentId)
End Sub

Bn trong th mc DataAccess (cng thuc th mc App_Code), to mt lp mi vi tn


l LoggingDB. Ti u file, thm cu lnh Imports cho khng gian tn System.Data v
System.Data.SqlClient, sau to mt Sub c cng ch k nh trong tng nghip v:
Public Shared Sub LogContentItemRead(ByVal contentId As Integer)
End Sub

Bn trong

ny, vit m gi ID ca mc ni dung n th tc tn tr


Bn s cn to mt i tng kt ni v mt i
tng cu lnh, truyn mt tham s v ri s dng ExecuteNonQuery gi n n c
s d liu. Phn thn ca Sub ny nh sau:
Sub

sprocPageViewUpdateSingleItem.

Using myConnection As New SqlConnection(AppConfiguration.ConnectionString)


Dim myCommand As SqlCommand = New SqlCommand _
("sprocPageViewUpdateSingleItem", myConnection)
myCommand.CommandType = CommandType.StoredProcedure
myCommand.Parameters.AddWithValue("@contentId", contentId)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
End Using

M lnh cho tng nghip v v tng truy xut d liu xong, bc k tip l hiu
chnh c s d liu. M Server Explorer trong Visual Studio 2005 (hay Visual Web Developer)
v to mt bng mi (nhp phi vo nt Tables trong c s d liu ca bn v chn
Add New Table). Bng mi c cc ct sau:
Tn ct

Kiu d liu

Cho php null

Ghi ch

Id

int

khng

nh du ct ny l Identity bng cch


thit lp Identity Specification l True
trong phn Column Properties (xem hnh
7-20). Cng nh du ct ny l kha
chnh bng cch chn ct ri nhp
biu tng cha kha trn thanh cng
c.

54
Chng 7. CMS
ContentId

int

khng

Ct ny gi ID ca mc ni dung
ang c m.

PageViews

int

khng

Ct ny gi s lt xem mc ni
dung.

Hnh 7-20

Lu bng vi tn l PageView.
m bo ct ContentId ch c th gi ID ca cc mc trong bng Content, bn cn
to quan h gia hai bng ny. thc hin iu , nhp phi vo nt Database
Diagrams trong Server Explorer v chn Add New Diagram. N u y l lc u tin bn
thm vo c s d liu, Visual Studio 2005 (hay Visual Web Developer) s yu cu to mt
s bng v th tc bt buc. N hp Yes cc i tng ny c to.
Trong hp thoi Add Table, thm bng Content v bng PageView m bn va to.
Ko ct Id ca bng Content ln ct ContentId ca bng PageView. Mt hp thoi xut
hin cho php bn nh ngha hnh vi ca cc quan h. N hp OK hai ln to quan
h.

Hnh 7-21

55
Chng 7. CMS

Khi bn lu lc bng cch nhn Ctrl+S, quan h cng c lu vo c s d liu.


Ging nh mi m lnh truy xut d liu khc, bng PageView s c cp nht bng
mt th tc tn tr. N hp phi nt Stored Procedures v chn Add New Stored Procedure.
Thm on m sau chn mt mNu tin mi vo bng PageView lc mt mc ni
dung c yu cu ln u tin, v cp nht mNu tin trong tt c cc yu cu tip
theo. t tn th tc tn tr l sprocPageViewUpdateSingleItem:
CREATE PROCEDURE sprocPageViewUpdateSingleItem
@contentId int
AS
IF NOT EXISTS (SELECT 1 FROM PageView WHERE ContentId = @contentId)
BEGIN
INSERT INTO PageView (ContentId, PageViews) VALUES (@contentId, 1)
END
ELSE
BEGIN
UPDATE PageView SET PageViews = PageViews + 1
WHERE ContentId = @contentId
END

Bc cui cng trong qu trnh m s lt xem l hiu chnh trang ContentDetail.aspx


th mc gc ca website n cp nht bng PageView trong c s d liu. Trong
trang ny, ngay bn di dng m gn litBodyText, thm dng m sau:
litIntroText.Text = contentItem.IntroText
litBodyText.Text = contentItem.BodyText
Logging.LogContentItemRead(contentId)
End If

Lu tt c cc file m bn m, ri m website trong trnh duyt. Chn mt loi ni


dung v mt ch , ri chn mt mc ni dung. Lp li qu trnh ny cho mt s
mc ni dung khc trong website. Khi xem bng PageView trong c s d liu, bn s
thy cc mc ni dung m bn xem, cng s lt xem ca mi mc.
Bc k tip l hin th s lt xem trn mi trang chi tit mc ni dung. iu ny cn bn
thay i: th nht bn cn to thuc tnh PageView trong lp Content, sau thm thuc tnh
ny vo phng thc GetItem ca lp ContentDB. Thay i th ba l trong th tc tn tr ly
mc ni dung t c s d liu. Cui cng, bn cn hin th s lt xem trang trn trang chi
tit, nh th khch c th thy mc ph bin ca mt mc ni dung. Bn hy thc hin cc
bc sau:
M lp Content trong th mc BusinessLogic v thm mt trng ring kiu Integer
vi tn l _pageView u file. cui file, trc cc phng thc cng khai, thm
mt thuc tnh cng khai vi tn l PageView (thuc tnh ny s dng bin _pageView):
Public Property PageView() As Integer
Get
Return _pageView
End Get
Set(ByVal value As Integer)
_pageView = value
End Set
End Property

56
Chng 7. CMS

M file ContentDB.vb trong th mc DataAccess v trong phn lu cc gi tr t c s d


liu vo cc thuc tnh cng khai ca mc Content, thm mt dng lnh gn cho
thuc tnh PageView:
theContentItem.Visible = _
myReader.GetBoolean(myReader.GetOrdinal("Visible"))
If Not myReader.IsDBNull(myReader.GetOrdinal("PageViews")) Then
theContentItem.PageView = _
myReader.GetInt32(myReader.GetOrdinal("PageViews"))
End If
End If

M th tc tn tr sprocContentSelectSingelItem, thm ct PageView t bng


PageView vo danh sch SELECT (nh thm du phNy sau Content.Visible). Sau ,
hiu chnh mnh FROM sao cho n s dng LEFT OUTER JOIN lin kt bng Content
vi bng PageView. Vic s dng LEFT OUTER JOIN rt quan trng bi v ln u tin
mc ni dung c xem, cha c mNu tin tng ng trong bng PageView. S dng
INNER JOIN thng thng s khng tr v ton b mc ni dung. Vi LEFT OUTER JOIN,
mc ni dung s c tr v bt chp s hin din ca mNu tin trong bng PageView.
Th tc tn tr ny nh sau:
Content.Visible,
PageView.PageViews
FROM
Content
LEFT OUTER JOIN PageView ON Content.Id = PageView.ContentId
WHERE

K tip l hiu chnh trang ContentDetail.aspx. u tin, trong m nh du ca trang,


ngay bn di th <h1>, g li m t Trang ny c xem ln. Tip tc, ko mt
iu kim <asp:Literal> t hp cng c vo gia t xem v t ln. t tn cho
iu kim ny l litPageView. Bn c th ty nh dng text, chng hn bao quanh
n bng mt th <div>, thm cc th <br /> trc v sau n,
Chuyn sang phn code-behind ca trang ny v gn cho thuc tnh Text ca iu
kim Literal gi tr t thuc tnh PageView ca i tng Content, ging nh vi cc
thuc tnh khc. Tuy nhin, v thuc tnh PageView l mt s nguyn v thuc tnh
Text ca iu kim Literal l mt chui, bn cn phi chuyn PageView thnh chui:
litBodyText.Text = contentItem.BodyText
litPageView.Text = contentItem.PageView.ToString()
Logging.LogContentItemRead(contentId)

Cui cng, lu tt c cc file m bn m v duyt website bng cch nhn Ctrl+F5.


Chn mt loi ni dung v mt ch , ri m mt mc ni dung. Bn s thy s lt
xem mc ni dung ny. Lm ti trang mt vi ln trn trnh duyt, bn s thy s
lt xem ny tng ln, nh hnh 7-22.
Vi hiu chnh ny, bn c mt c ch hay theo di mc s dng (tnh ph bin) ca
cc mc ni dung trn website. Bn c th m rng hiu chnh ny bng vic thm mt trang
vo phn qun tr lit k tt c cc mc ni dung v s lt xem mi mc.

57
Chng 7. CMS

Hnh 7-22

7.6

Kt chng

Qua chng ny, bn bit cch thit k, xy dng, v s dng mt h thng qun l ni
dung. Vi h thng ny, bn d dng truy xut cc ni dung c ng, thm v cp nht
ni dung trc tuyn.
Phn u ca chng gii thiu v website CMS. Bn thy c cch website hin th cc loi
ni dung v cc ch trn trnh n chnh v trnh n con. Bn cng thy c cch
website hin th cc mc ni dung, v cch thay i cc mc ny trong trang qun tr.
Trong phn thit k CMS, bn thy c cch t chc website bng vic xem tng file trong
website, cc lp trong tng nghip v v tng truy xut d liu. Phn ny cng gii thch bn
thit k c s d liu cho website.
Tip theo l kho st phn bn trong ca cc trang v cc lp cu thnh nn CMS. Bn bit
c cch s dng cc iu kim SqlDataSource a d liu vo/ra c s d liu. Bn cng
bit c cch to mt lp ty bin truy xut d liu, nhm trnh cc rc ri vi iu kim
SqlDataSource. N goi cc trang, cc iu kim ngi dng, v cc lp cu thnh nn website,
bn cng bit cch nhng FCKeditor vo ng dng, nhm cho php ngi dng cui nh dng
ni dung ca h trong mt HTML Editor.
Hai phn cui trnh by cch ci t CMS v ch dn mt ci tin nh cho CMS, l m s
lt xem cc mc ni dung.

58
Chng 7. CMS

59

Chng 8. CUSTOMER SUPPORT

60

iu ti t nht con ngi c th lm l khng c gng, bit ci


mnh mun m khng hnh ng, phi mt nhiu nm chu ng
ni au thm kn v bn khon xem liu c ci g tr thnh
hin thc, v mi mi khng bao gi bit iu g.
David S. Viscott

61
Chng 8. Customer Support

ho d sn phNm ca bn hot ng rt tt, phn cng bn bn rt bn, hoc khch


hng rt hi lng v cng ty v sn phNm ca bn, th sm mun g ngi dng cng
cn thm thng tin v sn phNm v dch v ca bn. H c th mun xem c im
k thut v mt sn phNm, tm cc driver mi nht sn phNm c th lm vic vi mt h
iu hnh mi, hoc tm ra cc th thut hu ch bo dng n.
Customer Support c gii thiu trong chng ny l mt website cho php ngi dng nhanh

chng tm thy thng tin v cc sn phNm hay dch v do cng ty bn cung cp. Mc d
chng ny ly mt cng ty bn phn cng (Codepro Hardware, khng c tht) lm mu nhng
cc nguyn l bn thu c trong chng ny c th c p dng cho nhiu website khc c
s dng m hnh ni dung phn cp.
Bi v y l quyn sch bn v ASP.NET nn chng ny tp trung nhiu vo cc tnh nng
mi ca ASP.NET 2.0. Tuy nhin, khi Microsoft tung ra .NET Framework phin bn 2.0 vi ASP.NET
2.0, khng ch c cc cng c cho nh pht trin nh Visual Studio v Visual Web Developer Express
Edition, m cn c mt phin bn mi ca h qun tr c s d liu quan h, l SQL Server
2005. Phin bn SQL Server mi ny kt hp cht ch vi .NET Framework 2.0 v Visual Web
Developer, c rt nhiu tnh nng v ci tin mi. Bi v nhiu ng dng web s dng c s d
liu, thu hiu nng lc vn hnh ca b my c s d liu l mt vic quan trng. Do ,
trong chng ny bn s kho st mt tnh nng mi ca SQL Server, l Common Table
Expressions (khi tho lun tng truy xut d liu v cc th tc tn tr).

8.1

S dng Customer Support

Customer Support c gii thiu trong chng ny l website h tr khch hng ca cng ty
bn phn cng Codepro Hardware (khng c tht). Cng ty ny chuyn bn phn cng ca cc
nh sn xut ni ting nh BNH (Brand New Hardware), Eccentric Hardware Makers, v Rocks
Hardware. gim thiu chi ph cho b phn h tr, hu nh h thng h tr ca cng ty da
trn nn web.

Vi Customer Support, ngi dng c th duyt danh mc sn phNm vi Product Locator (b nh


v sn phNm) tm cc sn phNm v c im k thut ca chng. Product Locator s dng cc
danh sch th xung (xem hnh 8-1), cho php ngi dng i su vo cu trc phn cp chng
loi xc nh sn phNm m h mun xem chi tit.
N goi Product Locator, website cng c phn Download List (xem hnh 8-2). Vi c ch drilldown tng t nh trong Product Locator, ngi dng c th nhanh chng xc nh cc file lin
quan n sn phNm ca h. Download List bao gm cc file thng thng nh ti liu bo hnh
cho tt c cc sn phNm BNH, cc file driver cho mt sn phNm c th.
Phn cng khai th ba (xem hnh 8-3) l FAQ (danh sch cc cu hi thng gp). Cc cu hi
ny khng c phn loi nh sn phNm v download, nhng c th c tm kim vi mt
b my tm kim nh, h tr logic Boolean vi cc biu thc AND v OR.
Customer Support cng c mt CMS (xem hnh 8-4), nh qun tr ni dung s dng CMS ny
qun l sn phNm, download, v FAQ trong c s d liu.

62
Chng 8. Customer Support

Hnh 8-1

Hnh 8-2

63
Chng 8. Customer Support

Hnh 8-3

Hnh 8-4

Phn k tip s kho st bn thit k ca Customer Support. Bn s thy cc lp cu thnh tng


nghip v v tng truy xut d liu ca website v bit cch thit k c s d liu, cc th tc
tn tr v cc hm do ngi dng nh ngha.

64
Chng 8. Customer Support

Phn ny i su vo website v cho bn thy cch pht trin cc thnh phn ring l v chng
tng tc vi nhau nh th no.
V cui chng, bn s bit cch ci t Customer Support trn server bng gi ci t hay bng
tay, cng nh c nhng hng ci tin cho Customer Support.

8.2

Thit k Customer Support

Ging nh cc ng dng khc trong quyn sch ny, Customer Support da trn kin trc ba
tng. Tng trnh by bao gm cc trang ASPX v cc iu kim ngi dng ASCX trong th mc
gc v mt s th mc con ca website.
C tng nghip v v tng truy xut d liu u c lu trong th mc App_Code. d dng
xc nh m lnh nm ng tng, m lnh nghip v c lu trong th mc con BusinessLogic,
v m lnh truy xut d liu c lu trong th mc con DataAccess. Cc thuc tnh cu hnh
chung, c s dng bi cc tng khc, c lu trong file AppConfiguration.vb thuc th mc
App_Code.
Hu ht vic truy xut d liu c thc hin vi cc iu kim <asp:ObjectDataSource> trong
cc trang .aspx, chng lin h vi cc lp trong tng nghip v (thng qua cc phng thc
cng khai), ri li gi c chuyn hng n cc phng thc trong tng truy xut d liu.
Trong cc trang khc, chng hn nh cc trang InsertUpdate trong phn qun tr, m lnh trong
file code-behind trc tip th hin ha cc lp trong tng nghip v, khng cn n mt iu
kim ngun d liu no c.
Phn tip theo trnh by cc lp trong tng nghip v v l gii chng c s dng th no
v u. Trong phn sau na, bn s thy c bn thit k ca tng truy xut d liu v c
s d liu.

8.2.1 Tng nghip v


Tng nghip v ca Customer Support c nm lp, mi lp c s dng hin th thng tin
c phn loi trn website. Vi mi phn chnh ca website (Sn phm, Download, v FAQ),
bn s tm thy mt lp tng ng trong cc file c t tn theo tn lp. Do , bn s tm
thy lp Product trong file Product.vb, N goi ba lp ny cn c hai lp khc l Category v
ContentBase. Lp Category c s dng qun l cc chng loi hin c trong c s d liu
v ly thng tin v chng. ContentBase l lp cha ca Product v Download, s c tho lun
ngay sau y.

Lp ContentBase
v Download c nhiu im chung. Chng u c mt tiu v mt m t hin th
trn website. Chng cng c mt ID nhn dng duy nht mi mc. V sau cng, c hai u
c kt vi mt chng loi trong c s d liu. Khi bt tay thit k cc lp ny, bn c th
vit m cho lp Product trc, ri sao m ny vo lp Download. Tuy nhin, thit k kiu ny
c mt s tr ngi. Th nht, bn cn chp v dn m lnh t file Product vo file Download,
cho ra nhiu th tha thi. N hng quan trng hn, khi bn cn thay i m lnh, chng hn
nh mun i tn Category thnh CategoryId, bn phi thay i c hai ch!
Product

65
Chng 8. Customer Support

khc phc vn ny, lp ContentBase c a vo s dng. Lp ny trng ra cc thuc


tnh v cc phng thc m Product v Download (v cc loi ni dung trong tng lai) u c.
Lp ny ng vai tr l lp c s cc lp khc k tha. Lp con t ng ly tt c cc
thnh vin cng khai t lp c s. Hnh 8-5 cho thy lp ContentBase v hai lp con ca n.

Hnh 8-5

N goi cc thnh vin c k tha, cc lp con hin thc cc thuc tnh v phng thc cho
ring chng. Bn s bit chi tit trong phn sau khi tho lun cc lp tng ng.
N gay bn di tn lp trong hnh 8-5, bn thy dng ch MustInherit Class. iu ny c ngha
khng c th hin ha mt cch trc tip, m bn phi to mt th hin t mt
lp con k tha t ContentBase. y chnh l iu bn mun, bi v khng ch no trn site
cn n mt i tng Content n thun, ch nhng lp con (nh Product v Download) mi
cn c hin th trn site.
ContentBase

Cc thuc tnh cng khai ca lp ContentBase c ni s qua, bng sau lit k chng mt
ln na, cng vi kiu d liu v m t v chng:
Thuc tnh

Kiu d liu

M t

CategoryId

Integer

ID ca chng loi trong c s d liu m mc ni dung ny


thuc v. ID ny ch gi ID ca chng loi su nht trong
cu trc phn cp chng loi.

Description

String

M t (hay phn thn) ca mc ni dung.

Id

Integer

ID ca mc ni dung trong c s d liu.

Title

String

Tiu ca mc ni dung.

66
Chng 8. Customer Support

N goi cc thuc tnh ny, lp ContentBase cn nh ngha mt phng thc Save. Lp c s


ch nh ngha ch k ca phng thc v nh du n vi t kha MustOverride. Theo cch
ny, lp k tha t ContentBase phi hin thc phng thc Save. Bn s thy lp Product v
Download thc hin vic ny th no trong phn sau.

Lp Product
Lp u tin k tha t ContentBase l Product. Mt th hin ca lp Product biu din mt
sn phNm m khch hng c th mua. Trong Customer Support, lp Product c s dng
cung cp thm thng tin v sn phNm, nh cc c im k thut.
N goi cc thnh vin k tha t ContentBase, lp ny cn c cc thnh vin nh hnh 8-6.

Hnh 8-6

Lp Product c thm ba thuc tnh, c m t trong bng sau:


Thuc tnh

Kiu d liu

M t

ImageUrl

String

ng dn o n hnh sn phNm.

Keywords

String

Mt danh sch (c phn cch bi du phNy) gm cc t


kha m t sn phNm.

TagLine

String

Mt m t ngn v hp dn v sn phNm.

Phng thc Save c k tha t lp ContentBase. Lp Product cng c thm ba phng


thc (mt c np chng) v hai phng thc khi dng np chng. Bng sau lit k cc
phng thc ca lp Product. N goi hai phng thc khi dng (phng thc New), bng ny
cng lit k cc phng thc Get, Save, Delete, v hai phin bn np chng cho
GetProductList.
Phng thc

Kiu tr v

Public Sub New ()

khng

M t

Phng thc khi dng mc nh ca lp


Product.

67
Chng 8. Customer Support
Public Sub New (ByVal id
As Integer)

khng

Phng thc khi dng np chng nhn vo


ID ca sn phNm. Phin bn np chng ny
c s dng khi chnh sa cc sn phNm hin
c.

Public Shared Function


[Get] (ByVal id As
Integer) As Product

Product

Phng thc ny thu ly mt sn phNm t c


s d liu bng cch gi mt phng thc
cng tn trong lp ProductDB.

Public Overrides Sub Save


()

khng

Lu mt sn phNm vo c s d liu bng


cch gi vo lp ProductDB.

Public Shared Sub Delete


(ByVal id As Integer)

khng

Xa mt sn phNm khi c s d liu bng


cch gi vo lp ProductDB.

Public Shared Function


GetProductList () As
DataSet

DataSet

Tr v danh sch tt c cc sn phNm trong c


s d liu. Phng thc ny c s dng
trong phn qun tr.

Public Shared Function


GetProductList (ByVal
categoryId As Integer) As
DataSet

DataSet

Tr v danh sch cc sn phNm thuc mt


chng loi c th.

Ging nh lp Product, lp Download cng k tha t ContentBase, cho nn khng c g ngc


nhin khi lp Download c mt s phng thc ging nh lp Product. im ging nhau v
khc nhau ca lp Download c tho lun tip sau y.

Lp Download
Lp Download biu din cc file m khch hng c th ti v t Codepro Hardware Customer
Support. Cc file ny c phn loi theo mt cu trc phn cp ba mc d dng tm thy
file cn thit. Ging nh lp Product, lp Download k tha t
thuc tnh v phng thc ca ring n (xem hnh 8-7).

Hnh 8-7

ContentBase

v c thm mt s

68
Chng 8. Customer Support

Thuc tnh DownloadUrl l mt chui cha ng dn o n file m khch hng c th ti v.


N gi qun tr ni dung c th upload mt file trong phn qun tr, v ri ng dn ca n
c lu trong thuc tnh ny.
Ging nh lp Product, lp Download c cc phng thc Get, Save, Delete v hai phng thc
khi dng np chng. Tham kho phn Lp Product xem m t cho cc phng thc
ny.
N goi cc phng thc ny, lp Download cn c phng thc
ny tr v danh sch cc download dng DataSet.

GetDownloadList,

phng thc

Lp Faq
Lp Faq biu din mt cu hi thng gp, c hin th trn website v c lu trong c s
d liu h tr khch hng. Dng nh Faq cng l mt ng vin tt k tha t ContentBase,
nhng thc ra khng phi nh vy. Trc ht, Faq khng c CategoryId. Cng vy, Faq khng
c tiu , nhng li c hai thuc tnh Question v mt thuc tnh Answer. N hng khc bit
ny khin Faq kh c th k tha t ContentBase. Do , lp Faq c hin thc l mt lp
c lp, vi cc thnh vin c hin th trong hnh 8-8.

Hnh 8-8

Bng sau m t cc thuc tnh cng khai ca lp Faq:


Thuc tnh

Kiu d liu

M t

Answer

String

Tr li cho cu hi.

QuestionLong

String

Bn di hn v chi tit hn ca cu hi.

Id

Integer

ID ca mc ni dung trong c s d liu.

QuestionShort

String

Bn m t ngn ca cu hi, c s dng trong danh sch


cc FAQ.

Ging nh Product v Download, lp Faq c cc phng thc ly, lu, v xa cc FAQ t c


s d liu. N cng c hai phng thc np chng (c m t trong bng bn di) thu

69
Chng 8. Customer Support

ly danh sch cc FAQ t c s d liu. Mt c s dng ly cc cu hi da trn t tm


kim, v mt tr v danh sch tt c cc FAQ trong c s d liu.
Phng thc

Kiu tr v

M t

Public Shared Function


GetFaqList (ByVal searchTerm
As String) As DataSet

DataSet

Tr v danh sch cc FAQ da trn


searchTerm. T ny c th l Printer AND
850 T5

Public Shared Function


GetFaqList () As DataSet

DataSet

Tr v danh sch tt c cc FAQ hin c.


Phng thc ny c s dng trong
phn qun tr.

Lp

c thuc tnh CategoryId kt mt mc ni dung vi mt chng loi. Lp


c thit k lm vic vi cc chng loi .

ContentBase

Category

Lp Category
Lp Category (xem hnh 8-9) c s dng thu ly v to cc chng loi trong c s d
liu. Cc chng loi ny gip ngi dng nhanh chng xc nh c sn phNm hay file cn
tm trong phn cng khai ca website.

Hnh 8-9

Lp Category khng c thuc tnh cng khai hay thuc tnh ring no, ch trng ra cc phng
thc cng khai v chia s (ngoi phng thc khi dng ring) thu ly cc chng loi t c
s d liu v to cc chng loi mi. Bng sau m t ba phng thc ny:
Phng thc

Kiu tr v

M t

Public Shared Sub


CreateCategory (ByVal
description As String,
ByVal parentCategoryId
As Integer)

khng

To mt chng loi mi trong c s d liu.


parentCategoryId c truyn cho phng thc
ny phi cha ID ca mt chng loi hin c
trong c s d liu, hoc phi nh hn 1 to
mt chng loi mi gc.

Public Shared Function


GetCategoryPath (ByVal
categoryId As Integer)
As DataSet

DataSet

Tr v tt c cc chng loi cha ca chng loi


con cho trc. Phng thc ny hu ch khi cn
xc nh tt c cc chng loi cha ca mt sn
phNm hoc download (v ch c CategoryId ca
chng loi con su nht c lu li).

70
Chng 8. Customer Support
Public Shared Function
GetCategoryList (ByVal
parentCategoryId As
Integer) As DataSet

Tr v danh sch cc chng loi dng DataSet


gm ct ID v ct Description. Khi
parentCategoryId nh hn 1, cc chng loi gc
c tr v. N gc li, cc chng loi con ca
chng loi cha cho trc c tr v.

DataSet

Bn thy tt c cc lp cu thnh tng nghip v, y l lc xt cc lp v cc bng c s


d liu cu thnh tng truy xut d liu.

8.2.2 Tng truy xut d liu


Bi v nhiu lp trong tng nghip v lm vic vi d liu trong c s d liu, chng c g
ngc nhin khi a s cc lp c mt lp tng ng trong tng truy xut d liu (thuc th
mc DataAccess, trong th mc App_Code gc website) vi tn tn cng l DB. Ch mt ngoi
l l lp ContentBase. Bi v l cha ca cc lp Product v Download, lp ContentBase khng c
m lnh truy xut d liu, cho nn n cng khng cn c lp ContentBaseDB i cng. C bn
lp thc hin truy xut d liu, s c m t trong cc phn tip theo.

Lp ProductDB
Lp ProductDB hin thc bn phng thc m bn thy trong lp Product. Tuy nhin, cc
phng thc trong lp ProductDB (xem hnh 8-10) thc s a d liu vo/ra c s d liu.
rng khng c phin bn np chng no ca GetProductList trong lp ny. Lp Product c
hai phin bn np chng, nhng cng gi n mt phng thc trong lp ProductDB.

Hnh 8-10

Cc phng thc trong hnh 8-10 c m t trong bng sau:


Phng thc

Kiu tr v

M t

Public Shared Sub Delete (ByVal


id As Integer)

khng

Xa mt sn phNm khi c s d liu.

Public Shared Function [Get]


(ByVal id As Integer) As Product

Product

Thu ly mt th hin ca sn phNm t


c s d liu. Tr v Nothing khi sn
phNm khng tn ti.

Public Shared Function


GetProductList (ByVal categoryId
As Integer) As DataSet

DataSet

Tr v danh sch cc sn phNm t c


s d liu. Khi CategoryId l -1, tt
c cc sn phNm c tr v.

71
Chng 8. Customer Support
Public Shared Sub Save (ByVal
the Product As Product)

khng

Lu sn phNm vo c s d liu. y
ch l phng thc th hin (instance
method) duy nht.

Lp DownloadDB c nhiu im chung vi lp ProductDB, v s c tho lun tip theo.

Lp DownloadDB
Cc lp Product v Download tng t nhau th no, cc lp ProductDB v DownloadDB cng
tng t nhau nh th. iu ny c ngha lp ny hin thc cc phng thc Get, Save,
Delete, v GetDownloadList, nh c minh ha trong hnh 8-11.

Hnh 8-11

Hnh vi v m t cho hu ht cc phng thc ny ging nh trong lp ProductDB. Tham kho


bng m t cc phng thc ca lp ProductDB, thay Product/sn phNm bng
Download/download trong bt k tn/m t no m bn thy. Ch mt ngoi l trong cc tn
phng thc l GetDownloadList. Tng t nh GetProductList, phng thc ny tr v danh
sch cc download dng DataSet.

Lp FaqDB
Mc d lp Faq khng k tha t ContentBase, nhng n cng hin thc cc phng thc nh
lp Product v Download c. Do , lp FaqDB (xem hnh 8-12) hin thc cc phng thc Get,
Save, Delete, v GetFaqList.

Hnh 8-12

72
Chng 8. Customer Support

N goi cc phng thc quen thuc ny, lp FaqDB cn c phng thc BuildWhereClause.
Phng thc ny (c nh du l Private nn khng th c truy xut t bn ngoi lp
FaqDB) nhn mt t tm kim v tr v mt mnh WHERE chuNn dng c th c s dng
trong mt th tc tn tr. Mc d iu ny tim Nn kh nng b tn cng SQL Injection, nhng
phng thc ny trin khai mt s m lnh phng th trnh nguy c bo mt . Bn s
thy cch hot ng ny trong phn sau.

Lp CategoryDB
Lp cui cng trong tng truy xut d liu m bn nn xem qua l lp CategoryDB. Ging nh
bn sao ca n trong tng nghip v, lp ny hin thc ba phng thc nh trong hnh 8-13.

Hnh 8-13

Cc phng thc ny c m t trong bng sau:


Phng thc

Kiu tr v

M t

Public Shared Sub


CreateCategory (ByVal
description As String,
ByVal parentCategoryId As
Integer)

khng

To mt chng loi mi trong c s d


liu. parentCategoryId c truyn cho
phng thc ny phi cha ID ca mt
chng loi hin c trong c s d liu,
hoc phi nh hn 1 to mt chng loi
mi gc.

Public Shared Function


GetCategoryPath (ByVal
categoryId As Integer)As
DataSet

DataSet

Tr v tt c cc chng loi cha ca chng


loi con cho trc. iu ny hu ch khi
cn xc nh tt c cc chng loi cha ca
mt sn phNm hoc download (v ch c
CategoryId ca chng loi con su nht
c lu li).

Public Shared Function


GetCategoryList (ByVal
parentCategoryId As
Integer) As DataSet

DataSet

Tr v danh sch cc chng loi dng


DataSet gm ct ID v ct Description.
Khi parentCategoryId nh hn 1, cc
chng loi gc c tr v. N gc li, cc
chng loi con ca chng loi cha cho
trc c tr v.

N goi cc lp trong th mc DataAccess, tng truy xut d liu cn cha c s d liu thc s,
bao gm bn bng v mt s th tc tn tr.

73
Chng 8. Customer Support

M hnh d liu
C s d liu cho Customer Support gm bn bng, 16 th tc tn tr, v hai hm do ngi
dng nh ngha. Mt s bng trong c s d liu c quan h vi nhau, nh trong hnh 8-14.

Hnh 8-14

C hai bng Product v Download u c quan h vi bng Category thng qua ct CategoryId.
Tuy nhin, bn cng cn bng Category c quan h vi chnh n (ct ParentCategoryId
kt vi ct Id). Theo cch ny, mt chng loi c th c quan h vi mt chng loi khc,
c gi l chng loi cha, do to nn mt cu trc phn cp hoc cy cho cc chng loi.
thu ly d liu phn cp t c s d liu, ng dng s dng Common Table Expressions, s
c tho lun sau.
Mc d tn ca cc bng v cc ct t n ni ln ngha, cc bng di y m t r hn
v chng.
Bng Product
Bng di y m t cc ni dung ca bng Product trong c s d liu Customer Support:
Tn ct

Kiu d liu

M t

Id

int

ID ca sn phNm trong c s d liu. ID ny c sinh t


ng mi khi mt sn phNm mi c chn vo.

Title

nvarchar(100)

Tiu ca sn phNm.

TagLine

nvarchar(100)

Tiu di hn hoc tiu con cho sn phNm, cng c


th cha mt thng ip qung co ngn cho sn phNm.

74
Chng 8. Customer Support
Description

nvarchar(MAX)

M t y v sn phNm, v d nh cha c im k
thut ca sn phNm.

CategoryId

int

ID ca chng loi m sn phNm ny thuc v.

ImageUrl

nvarchar(255)

ng dn o n hnh sn phNm.

Keywords

nvarchar(200)

Cha danh sch (c phn cch bi du phNy) cc t


kha ph hp vi sn phNm.

Bng sau m t nm ct ca bng Download trong c s d liu.


Bng Download
Bng Download v bng Product c nhiu im chung. Cc ct ging nhau cc bng ny
tng ng vi cc thuc tnh cng khai ca lp cha ContentBase m Product v Download k
tha.
Tn ct

Kiu d liu

M t

Id

int

ID ca download trong c s d liu. ID ny c sinh


t ng mi khi mt download mi c chn vo.

Title

nvarchar(100)

Tiu ca download, m t ngn gn v file.

Description

nvarchar(MAX)

M t y v download.

CategoryId

int

ID ca chng loi m download ny thuc v.

DownloadUrl

nvarchar(255)

ng dn o n file.

C th gi lp s k tha trong c s d liu bng cch to mt bng chung ContentBase, cha


nhng thng tin cho c sn phNm v download. Sau , cc bng khc cha d liu ring
(chng hn nh ImageUrl cho bng Product, DownloadUrl cho bng Download) cng vi mt
kha ngoi tr n bng ContentBase.
Tuy nhin, gii php nh th c th khin cu trc bng tr nn ln xn. N goi ra, phi thc
hin mt lng ln vic chn d liu vo hai bng v gi cho cc bng ny ng b, khin
gii php ny khng hay. Do vy, ta chn cch lp li cc ct ging nhau trong c hai bng
Product v Download.
Bng Faq
Bng Faq cha d liu cho FAQ, c bn ct nh sau:
Tn ct

Kiu d liu

M t

Id

int

ID ca FAQ trong c s d liu. ID ny c sinh t ng


mi khi mt FAQ mi c chn vo.

QuestionShort

nvarchar(200)

Cu hi dng ngn ca FAQ.

75
Chng 8. Customer Support
QuestionLong

nvarchar(MAX)

Bn di hn ca cu hi, c th cung cp thm thng tin


bi cnh v cu hi.

Answer

nvarchar(MAX)

Tr li cho cu hi.

Bng cui cng trong c s d liu Customer Support l Category.


Bng Category
Bng Category lu tr cc chng loi c s dng xuyn sut site. Bng ny c quan h vi
chnh n thng qua ct ParentCategoryId v ct Id.
Tn ct

Kiu d liu

M t

Id

int

ID ca chng loi trong c s d liu. ID ny c

sinh t ng mi khi mt chng loi mi c chn


vo.
Description

nvarchar(100)

M t v chng loi.

ParentCategoryId

nvarchar(100)

ID ca chng loi m chng loi hin ti c quan h


vi n. Khi ct ny l NULL, y l chng loi gc v
khng c cha.

Cc th tc tn tr v cc hm do ngi dng nh ngha


Customer Support tng tc vi c s d liu thng qua cc th tc tn tr. Bn s khng tm
thy cu lnh SQL no trong cc trang ASPX hay file code-behind ca chng. Theo cch ny,
website d bo tr hn bi v khi cn thay i cu trc d liu, bn ch cn thay i th tc tn
tr, khng cn thay i cc trang truy xut d liu.

tru tng mt s chc nng, hai hm do ngi dng nh ngha (UDF) c to. V bn
cht, UDF l mt s m T-SQL c kh nng ti s dng, c th c gi bi m lnh khc, bao
gm cc th tc tn tr, v c th tr v cc kiu d liu khc nhau, bao gm cc gi tr v
hng (chng hn nh mt s hoc mt vn bn) v ton b cc bng. Trong Customer Support,
hai UDF u tr v mt bng ty bin gm ct ID v ct Description cha cc chng loi t
bng Category. Bn s tm thy cc hm fnSelectChildCategories v
fnSelectParentCategories bn di nt Functions ca c s d liu trong ca s Server Explorer
ca Visual Studio 2005 (hay Visual Web Developer). Hot ng bn trong ca cc hm ny s c
tho lun sau.

8.2.3 Lp tr gip
N goi m lnh trong tng nghip v v tng truy xut d liu, Customer Support cn s dng
mt lp tr gip, l lp AppConfiguration, c lu trong th mc App_Code.
Lp AppConfiguration cung cp thng tin cu hnh cho m lnh trong tng trnh by v tng
truy xut d liu. N c ba thuc tnh cng khai-chia s-ch c, cung cp thng tin cu hnh
c lu trong file Web.config (xem hnh 8-15).
Thuc tnh ConnectionString c s dng bi cc phng thc trong tng truy xut d liu
kt ni c s d liu. Thuc tnh DefaultSiteDescription c s dng t ng xen mt

76
Chng 8. Customer Support

m t mc nh v website vo cc th <meta> trong phn


s dng thuc tnh ny khi tho lun trang master.

<head>

ca trang. Bn s bit cch

Thuc tnh cui cng ca lp ny l UploadFolder. Thuc tnh ny tr v ng dn o n


th mc lu cc file c upload trong phn qun tr. vic bo tr c n gin hn,
thuc tnh UploadFolder cng s dng kha m FCKeditor s dng. iu ny c ngha cc file
c upload thng qua editor v thng qua cc iu kim upload s nm cng th mc.

Hnh 8-15

8.3

M lnh Customer Support

Trc khi bt u tho lun cc tnh nng cao cp hn ca Customer Support nh Product Locator
v Download List, bn cn xem qua mt s file quan trng trc. Tt c cc file ny thuc th
mc gc ca website.

8.3.1 Cc file ti th mc gc
Th mc gc ca website c nm file quan trng: hai trang master vi phn m rng .master,
trang Default.aspx, file Global.asax, v file Web.config. File Web.config cha mt s thit lp dng
cho cc trang khc, do c tho lun trc.

Web.config
Tng t nh cc ng dng khc trong quyn sch ny, file Web.config c mt s kha ty
bin, chui kt ni cho ng dng, v thng tin cu hnh cho skin dng trong website. Hai kha
ty bin bn di nt <appSettings> c s dng thit lp ng dn lu cc file c
upload v xc nh dng ch mc nh m t v website.
Cng trong file Web.config, bn s thy nt <pages>. Kha ny thit lp theme cho website l
CustomerSupport. y l mt theme ty bin, c lu trong th mc App_Themes. Theme ny
ch c mt file l GridView.skin, file ny nh ngha cm quan ca mi GridView trong website.
Tt c cc thit lp khc trong Web.config rt quen thuc, do khng tho lun na.

Global.asax
Ging nh trong chng Blog, Global.asax cha m lnh gi e-mail mi khi li pht sinh
trong website. M lnh trong file ny ging ht nh trong chng Blog, cho nn bn hy
tham kho phn M lnh Blog hiu r cch hot ng ny.

Default.aspx

77
Chng 8. Customer Support

y l trang ch ca website v da trn trang master MainMaster (s c tho lun sau).


Trang ny ch cha dng ch cho mng ngi dng. y l ni tt nht qung co cc
sn phNm mi m Codepro Hardware cung cp.

Cc trang master
Customer Support c hai trang master gn nh ging ht nhau: mt cho phn cng khai ca

website v mt cho phn qun tr. Khc bit ln nht gia hai trang ny l iu kim ngi
dng ManagementMenu. Trnh n ny cha cc mc cho giao din qun tr, c np mc nh
trong trang master qun tr. Mt khc bit khc l cc siu d liu c thm t ng vo
phn <head> ca trang master cng khai.
thy li hot ng ny, m file MainMaster.Master.vb gc website, y l file code-behind
ca trang master cng khai. Trong file ny, bn thy hai thuc tnh Keywords v Description.
Cc thuc tnh ny c th c truy xut t m lnh bn ngoi lp MainMaster bi v chng
c nh du l Public. Page_Load ca trang master s dng cc thuc tnh ny thay i
ng mt s th <meta> u trang.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Dim metaTag As HtmlMeta = New HtmlMeta()
If Not Keywords Is String.Empty Then
metaTag.Name = keywords
metaTag.Content = Keywords
Page.Header.Controls.Add(metaTag)
End If
metaTag = New HtmlMeta()
metaTag.Name = description
If Not Description = String.Empty Then
metaTag.Content = Description
Else
metaTag.Content = AppConfiguration.DefaultSiteDescription
End If
Page.Header.Controls.Add(metaTag)
End Sub

Trc tin, on m trn to mt th hin mi ca HtmlMeta, y l lp c thit k biu


din siu d liu cho trang. Lp ny trng ra thuc tnh Name v Content, nh x trc tip n
c tnh name v content ca th <meta>. Th meta keywords nhn gi tr t thuc tnh cng
khai Keywords, c nh ngha trong file code-behind, nhng ch khi n c gi tr. Th meta
description th phc tp hn. Trc tin, m lnh kim tra thuc tnh Description c gi
tr cha. N u c, gi tr c s dng. N u cha c gi tr, m t mc nh c thu ly
bng cch gi AppConfiguration.DefaultSiteDescription (ly t file Web.config).
Khi c hai thuc tnh Name v Content c thit lp, i tng HtmlMeta c thm vo tp
Controls ca Header. Khi trang c hin th, i tng HtmlMeta c th hin l mt th
HTML <meta> bn trong phn <head> ca trang. on m trn cho ra m HTML nh sau:
<head>
<title>Cho mng n vi Customer Support Site</title>
<meta name=description
content=Codepro Hardware Ca hng phn cng s mt trn th gii />
</head>

78
Chng 8. Customer Support

Cc trang c s dng trang master gi y c th truy xut cc thuc tnh cng khai khi trang
np. Tuy nhin, mc nh bn khng th truy xut cc thuc tnh ny mt cch trc tip.
Thuc tnh Master mc nh m trang trng ra c kiu l System.Web.UI.MasterPage. Lp ny
khng c thuc tnh Keywords. c th truy xut cc thuc tnh ty bin ca mt trang
master, bn cn thit lp ch th MasterType ti trang mun truy xut cc thuc tnh ny. Mt v
d l trang ProductDetails.aspx trong th mc ContentFiles. Di y l m nh du u trang
ny:
<%@ MasterType VirtualPath=~/MainMaster.Master %>

Vi MasterType c thit lp, gi y trang c th truy xut thuc tnh Keywords ca trang
master trong s kin Load ca n:
Me.Master.Keywords = myProduct.Keywords

Dng m ny truy xut thuc tnh cng khai Keywords ca trang master. Bi v MasterType
c thit lp, Visual Studio 2005 nhn bit c cc thuc tnh v phng thc ca trang
master, cho nn bn nhn c s h tr IntelliSense.
Vi thuc tnh Keywords c thit lp trn trang master, cc th <meta> c thm t ng
vo trang khi trang c hin th.
Cc t kha c thm vo Product trang InsertUpdateProduct.aspx trong phn qun tr ni
dung ca website, s c tho lun sau.
Vi mt t m lnh trong file master, bn to nn mt cch rt linh hot xen siu d liu
vo phn <head> ca trang. Theo mc nh, trang master m bo mi trang c t nht mt th
meta description, nhn gi tr t file Web.config. Tuy nhin, gi y cc trang cn thit lp th
meta description hay keywords chi tit hn c th thc hin bng cch truy xut cc thuc
tnh cng khai ca trang master. Cng kh d dng m rng m lnh trong trang master
thm cc th meta khc nh copyright, author,

Cc file v th mc khc
N goi cc file ti th mc gc, Customer Support cn c nhiu file v th mc khc. Lt na
y bn s tm hiu cc file trong th mc ContentFiles (cu thnh giao din cng khai ca
website) v th mc Management (cha h thng qun tr ni dung ca website). y ch m
t ngn gn mt vi file v th mc khc:

BinTh mc ny cha DLL c s dng bi FCKeditor trong phn qun tr


Management.

ControlsTh mc ny cha cc iu kim ngi dng c s dng xuyn sut

website:

ManagementMenu.ascxc s dng trong th mc Management v cha lin

kt n bn trang qun tr quan trng.

Footer.ascxc s dng trn mi trang, cho nn c thm vo trang


MainMaster v ManagementMaster. N cha mt ghi ch copyright v mt lin kt
n codeprovn.com, nhng d nhin bn c th thay i bt c th g bn cm

thy hp.

Header.ascxCha logo ca website. d dng duyt trang ch, nhp vo

logo s dn n gc ca website.

79
Chng 8. Customer Support

9
9
9

MainMenu.ascxCha cc mc to nn trnh n chnh.

CssTh mc ny cha hai file CSS: Core.css v Styles.css. Core.css cha tt c cc phn
t CSS kim sot cm quan ca website. Styles.css cha cc lp style ty bin, nh
hng n din mo ca cc phn t nh hn nh cc nt nhn, cc header v cc
hng ca iu kim GridView.
FCKeditorTh mc ny cha FCKeditor c s dng trong phn qun tr. Tham kho
chng Blog hiu r hn v editor ny.
ImagesCha cc hnh c s dng trong giao din website, nh logo. Ch rng,
y khng phi l th mc cha cc hnh v file c upload.
UserFilesc s dng bi FCKeditor v phn qun tr lu tr cc hnh nh v sn
phNm, download,

Bn thy hu ht cc file ph trong website, y l lc tp trung vo cc trang thc s cu


thnh Customer Support. Phn tip theo tho lun v Product Locator (cho php ngi dng tm
mt sn phNm bng cch chn chng loi t cc danh sch th xung). K n l m t cch
lm vic ca Downloads List (cho php ngi dng tm cc file i km sn phNm). Cui cng,
bn s thy trang FAQ lm vic th no (ti y, ngi dng c th tm kim danh sch cc cu
hi thng gp).

8.3.2 Product Locator


Mc d c ci tn kh n tng, nhng Product Locator (b nh v sn phNm, nm trong
ContentFiles/Products.aspx) thc t l mt trang kh n gin. N c ba danh sch th xung, cho
php ngi dng i su vo danh sch cc chng loi. Danh sch th xung th nht hin th
cc chng loi mc mt, v danh sch th xung th hai hin th tt c cc chng loi mc hai
l con ca chng loi mc mt ang c chn. Tng t cho danh sch th xung th ba.
hiu cch hot ng ny, xem m nh du ca trang Products:
<asp:DropDownList ID=lstCategoryLevel1 runat=server
DataSourceID=odsCategoryLevel1 DataTextField=Description
DataValueField=Id AutoPostBack=True AppendDataBoundItems=True>
<asp:ListItem Value=>Chn mt chng loi</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID=lstCategoryLevel2 runat=server
DataSourceID=odsCategoryLevel2 DataTextField=Description
DataValueField=Id Visible=False AutoPostBack=True >
</asp:DropDownList>
<asp:DropDownList ID=lstCategoryLevel3 runat=server
DataSourceID=odsCategoryLevel3 DataTextField=Description
DataValueField=Id Visible=False AutoPostBack=True>
</asp:DropDownList>

Trong on m trn, cc thuc tnh quan trng c in m d thy hn. Trong danh sch
th xung th nht, AppendDataBoundItems c thit lp l True m bo bt c mc tnh
no (nh mc Chn mt chng loi) cng c thm vo m nh du ca trang, khng b thay
th bi cc mc t c s d liu. N goi ra, AutoPostBack trn tt c cc iu kim u c
thit lp l True m bo trang s c lm ti khi ngi dng chn mt mc mi t mt
danh sch th xung. Ban u khi trang np, danh sch th xung th hai v th ba b Nn i
bng cch thit lp Visible l False. M lnh trong code-behind ca trang s lm cho cc
danh sch th xung ny hin th khi thch hp. M lnh s c xt sau.

80
Chng 8. Customer Support

Mt thuc tnh quan trng khc ca cc danh sch th xung l DataSourceID. Danh sch th
xung th nht tr n iu kim <asp:ObjectDataSource> c tn l odsCategoryLevell, th hai
l odsCategoryLevel2, v th ba l odsCategoryLevel3. C ba iu kim ObjectDataSource s
dng tn lp v phng thc ging nhau. on m sau l m nh du ca ObjectDataSource
th nht:
<asp:ObjectDataSource ID=odsCategoryLevel1 runat=server
SelectMethod=GetCategoryList TypeName=Category>
<SelectParameters>
<asp:Parameter Name=parentCategoryId Type=Int32 />
</SelectParameters>
</asp:ObjectDataSource>

Cc iu kim <asp:ObjectDataSource> l mt cch tuyt vi tun theo kin trc a tng,


cho ra cc trang web c tnh bo tr v kh m cao. Bng vic s dng iu kim
ObjectDataSource, bn s khng lm ri cc trang vi tn ca cc th tc tn tr hoc t hn l
ton b cc cu lnh SQL. Thay vo , bn tr iu kim n mt tn lp v mt
SelectMethod trong tng nghip v; v khi iu kim ny c bo ly d liu, n s gi
phng thc m bn ch nh. Trong on m trn, iu kim ObjectDataSource gi
phng thc GetCategoryList ca lp Category trong file Category.vb. Phng thc ny nh
sau:
Public Shared Function GetCategoryList(ByVal parentCategoryId As Integer) _
As DataSet
Return CategoryDB.GetCategoryList(parentCategoryId)
End Function

im quan trng phng thc ny l t kha Shared, c ngha rng phng thc ny thc
thi trn mt kiu (lp Category) ch khng phi trn mt th hin ca kiu. Bi v phng
thc ny l chia s, cho nn ObjectDataSource khng cn tham chiu n mt th hin ca
Category m vn c th gi phng thc GetCategoryList mt cch trc tip. N u phng
thc ny khng c nh du l Shared, ObjectDataSource t ng to mt th hin ca lp
Category bng cch gi phng thc khi dng mc nh khng tham s ca n. N u phng
thc ny khng c nh du l Shared v lp khng c phng thc khi dng mc nh
khng tham s, ObjectDataSource khng th to mt th hin ca lp v gi phng thc. Tuy
nhin, bn vn c th cp cho ObjectDataSource mt th hin ca lp trong s kin
ObjectCreating ca n. Bn s thy cch lm vic ny trong chng 12 (BugBase).
Phng thc
CategoryDB:

GetCategoryList

chuyn hng li gi n mt phng thc cng tn trong lp

Public Shared Function GetCategoryList(ByVal parentCategoryId As Integer) _


As DataSet
Dim myDataSet As DataSet = New DataSet()
Using myConnection As New SqlConnection(AppConfiguration.ConnectionString)
Dim myCommand As SqlCommand = New SqlCommand( _
sprocCategorySelectList, myConnection)
myCommand.CommandType = CommandType.StoredProcedure
If parentCategoryId > 0 Then
myCommand.Parameters.AddWithValue(@parentCategoryId, parentCategoryId)
Else
myCommand.Parameters.AddWithValue(@parentCategoryId, DBNull.Value)
End If

81
Chng 8. Customer Support
Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter()
myDataAdapter.SelectCommand = myCommand
myDataAdapter.Fill(myDataSet)
myConnection.Close()
Return myDataSet
End Using
End Function

M lnh ny tng t nh m lnh m bn thy cc chng trc. Ch duy nht mt th


cn gii thch l vic gn tham s cho th tc tn tr bng AddWithValue. N u
parentCategoryId (c truyn cho phng thc ny) ln hn 0, gi tr ny c gi n th
tc tn tr, v th tc tn tr thu ly tt c cc chng loi c ct ParentCategoryId l gi tr
. N u parentCategoryId nh hn 0, gi tr DBNull c truyn cho th tc tn tr, v th tc
tn tr tr v tt c cc chng loi c ct ParentCategoryId l NULL ( chnh l cc chng loi
gc, mc cao nht).
By gi hy nhn li trang Products. Danh sch th xung th nht c kt vi
odsCategoryLevel1, ngun d liu ny c mt <SelectParameter> vi tn l parentCategoryId
v kiu l Int32. Bn cng c th thy tham s ny khng bao gi nhn gi tr trong m lnh,
cho nn n ly gi tr mc nh ca kiu nguyn: 0. y l l do ObjectDataSource cho danh
sch th xung th nht tr v tt c cc chng loi gc. Cc iu kim ngun d liu th hai
v th ba c mt <SelectParameter> c kt vi mt danh sch th xung nh sau:
<asp:ObjectDataSource ID=odsCategoryLevel2 runat=server
SelectMethod=GetCategoryList TypeName=Category>
<SelectParameters>
<asp:ControlParameter ControlID=lstCategoryLevel1 Name=parentCategoryId
PropertyName=SelectedValue Type=Int32 />
</SelectParameters>
</asp:ObjectDataSource>

Khi iu kim ny chuNn b ly d liu, n ly SelectedValue t danh sch th xung trc


danh sch th xung vi cc chng loi gc. Sau , ID ny c lu trong
SelectParameter ca iu kim ObjectDataSource v c truyn cho GetCategoryList, ri
phng thc ny ly tt c cc chng loi con ca chng loi cha c chn.
Qu trnh ny c lp li cho danh sch th xung th ba, nhng lc ny SelectedValue t
danh sch th xung th hai c thu ly v c truyn cho GetCategoryList ly cc
chng loi mc ba.
Bn hin thc hin ti ca ba iu kim th xung i hi mt postback n server mi khi
mt chng loi mi c chn t mt trong ba danh sch. ci thin thi gian np trang v
tri nghim ngi dng, bn c th hin thc cc danh sch ny bng AJAXs kt hp ca
JavaScript, XML, v cc k thut pha server. Ci hay ca k thut ny l khng cn np li ton
b trang, ch np ni dung ca cc iu kim th xung m thi. N h th, trang s khng b
rung v ni dung ca cc iu kim th xung c np nhanh hn.
Bc cui cng trong Product Locator l thu ly cc sn phNm ng vi chng loi c chn
trong danh sch th xung th ba. Mt ln na, iu ny c thc hin vi mt iu kim
ObjectDataSource:
<asp:ObjectDataSource ID=odsProducts runat=server
SelectMethod=GetProductList TypeName=Product>
<SelectParameters>
<asp:ControlParameter ControlID=lstCategoryLevel3 Name=categoryId

82
Chng 8. Customer Support
PropertyName=SelectedValue Type=Int32 />
</SelectParameters>
</asp:ObjectDataSource>

iu kim ObjectDataSource ny c SelectMethod c thit lp l mt phng thc trong lp


Product. iu ny c ngha khi iu kim ly d liu, n pht sinh GetProductList trong lp
Product v truyn cho n SelectedValue ca danh sch th xung th ba (lstCategoryLevel3).
GetProductList trong lp Product y thc nhim v cho GetProductList trong lp ProductDB.
Phng thc ny tng t nh phng thc GetCategoryList m bn thy trc y, trong
n pht sinh mt th tc tn tr v tr kt qu v dng DataSet.
Khc bit duy nht l cch categoryId c truyn cho c s d liu:
If categoryId = -1 Then
myCommand.Parameters.AddWithValue(@categoryId, DBNull.Value)
Else
myCommand.Parameters.AddWithValue(@categoryId, categoryId)
End If

Khi

khc -1, gi tr ca n c gi cho th tc tn tr bng phng thc


Khi categoryId bng -1, gi tr DBNull c gi. Phn chia th ny l cn thit
bi v GetProductList cng c s dng trong phn qun tr ca website. Trang hin th cc
sn phNm s hin th tt c bt chp chng loi. Lp Product c mt phng thc np chng
GetProductList khng tham s, phng thc ny truyn gi tr -1 cho phng thc
GetProductList trong lp ProductDB nh sau:
categoryId

AddWithValue.

Public Shared Function GetProductList() As DataSet


Return ProductDB.GetProductList(-1)
End Function

Gi tr -1 ny c truyn cho GetProductList dn n DBNull.Value c truyn cho th tc


tn tr. Trong th tc , on m sau c s dng trong mnh WHERE gii hn danh
sch sn phNm:
FROM
PRODUCT
WHERE
CategoryId = @categoryId
OR @categoryId IS NULL
ORDER BY
Title

Khi

c gi tr, dng u tin ca mnh WHERE tr v tt c cc mNu tin c


bng vi @categoryId. iu ny m bo cc sn phNm ph hp c tr v trong
phn cng khai ca website khi mt chng loi con c chn. Dng th hai ca mnh
WHERE so snh tham s @categoryId vi gi tr NULL. y l trng hp trong phn qun tr, ni
m NULL c truyn cho th tc tn tr. Gi y tt c sn phNm u c tr v, bt chp
CategoryId ca chng l g. y l mt th thut phn bit gia chc nng front-end (cng
khai) v back-end (qun tr) m khng cn n logic IF/THEN phc tp hoc nhiu th tc tn
tr.
@categoryId

CategoryId

Bc cui cng trong Product Locator l hin th cc mc c tr v t c s d liu. Trang c


mt iu kim <asp:DataList> vi tn l dlProducts, c kt vi ngun d liu odsProducts
m bn thy trc y. DataList ny c mt <ItemTemplate> hin th cc trng nh tiu
sn phNm, tag line, hnh, v mt lin kt n trang ProductDetails.aspx:

83
Chng 8. Customer Support
<asp:DataList ID=dlProducts runat=server DataKeyField=Id
DataSourceID=odsProducts EnableViewState=False >
<ItemTemplate>
<h2>
<%# Eval(Title) %>
</h2>
<p class=Summary>
<asp:Image ID=productImage runat=server
ImageUrl=<%# Eval(ImageUrl) %> ImageAlign=Right />
<%# Eval(TagLine) %>
</p>
<br />
<asp:HyperLink ID=hyperReadMore runat=server
NavigateUrl=<%# ProductDetails.aspx?Id= & Eval(Id) %>
Text=Xem tip />
</ItemTemplate>
</asp:DataList>

Trang ProductDetails.aspx s dng Product.Get(productId) ly mt th hin ca mt sn


phNm v hin th cc thuc tnh ca n trn trang. Cc t kha ca sn phNm c thm vo
mt th <meta> trong trang master ( c tho lun trc). Khi xem phng thc Get
trong tng nghip v, bn hy ch hai du ngoc vung bao quanh tn phng thc:
Public Shared Function [Get](ByVal id As Integer) As Product
Return ProductDB.Get(id)
End Function

Bi v Get l mt t dnh ring trong Visual Basic .NET, bn phi bao quanh Get bng hai du
ngoc vung bo vi trnh bin dch b qua ngha c bit ca t kha . N u bn cm
thy iu ny khin m lnh rc ri, ch vic i tn phng thc thnh GetItem hoc
GetProduct l xong. Tt c cc phng thc Get trong tng nghip v v tng truy xut d liu
u c hai du ngoc vung bao quanh tn ca chng.
Bn thy cch lm vic ca Product Locator, gi n lc xem m lnh trong trang Downloads.
Trang ny s dng cc khi nim ging nh Product Locator, nhng cng c mt s im ng
xt k hn hn cht.

8.3.3 Download List


N hn thong qua, trang Downloads.apsx trong th mc ContentFiles trng ging nh trang
Products.aspx. Mc d m nh du th ging nhng code-behind th hon hon khc. l v
trang Downloads cn hin th cc file ng vi chng loi ang c chn ti mt mc v tt c
cc mc cha v con ca n. Vi trang Products, bn phi chn c ba danh sch th xung trc
bi v iu kim DataList ch thu ly cc sn phNm ng vi chng loi su nht.
Vi trang Downloads, ngi qun tr ni dung c th kt mt file vi chng loi gc, hoc vi
chng loi mc hai hoc mc ba. V d, Warranty Document (giy bo hnh) c th p dng cho
tt c cc sn phNm ca Rocks Hardware, do kt file ny vi chng loi gc l hp l. Khi
ngi dng chn Rocks Hardware t danh sch th xung, h s thy Warranty Document xut
hin. Tuy nhin, h cng thy cc driver cho 850 T5 Printer v cho 3D Printer 740 xut hin bi v
cc driver ny u thuc chng loi Rocks Hardware. N u sau h chn Power Printers, cc file
ng vi chng loi 3D Printers s khng xut hin. Warranty Document v cc driver cho 850 T5
Printer vn cn hin th bi v chng vn thuc Rocks Hardware v Power Printers.

84
Chng 8. Customer Support

N u cm thy kh hiu, hy xem hnh 8-16, hnh ny hin th cu trc phn cp ca mt s


chng loi trong c s d liu. S ny tp trung vo chng loi Rocks Hardware, do
khng hin th con ca hai chng loi kia.

Hnh 8-16

T s ny, bn c th thy Rocks Hardware c hai chng loi con: 3D Printers v Power Printers.
Mi chng loi ny c ba mNu tin con. Khi chn Rocks Hardware t danh sch th xung th
nht, Download List hin th tt c cc mNu tin c lin quan vi Rocks Hardware, bao gm cc con
chu ca n. N u chn Power Printers t danh sch th xung th hai, bn s thy cc mNu tin
thuc chng loi gc Rocks Hardware (nh Warranty Document), Power Printers, v tt c cc chng
loi con ca n. Danh sch khng cn hin th cc mNu tin gn vi chng loi 3D Printers. Cui
cng, khi chn 850 T5 t danh sch th xung th ba, bn s thy cc download gn vi chng
loi mt cch trc tip hoc gn vi cha ng ca n, khng cn cc download ng vi
chng loi 850 hay V70.
Vic chn d liu phn cp nh trong v d trn lun gy kh khn cho cc phin bn SQL
Server c. Phin bn SQL Server 2005 a ra mt khi nim mi: Common Table Expressions (CTE).
CTE l mt kt qu tm thi vi tn c th c s dng trong cc biu thc v m lnh khc.
N ging nh mt bng trong b nh, v bn c th lin kt n vi cc bng khc. im hay
ca CTE l h tr quy, cho php bn thc hin cc truy vn rt mnh ch vi mt vi dng
m.
bit CTE lm vic ra sao, bn hy xem iu kim ObjectDataSource trong trang Downloads:
<asp:ObjectDataSource ID=odsDownloads runat=server
SelectMethod=GetDownloadList TypeName=Download>
<SelectParameters>
<asp:ControlParameter ControlID=lstCategoryLevel1 Name=categoryId
PropertyName=SelectedValue Type=Int32 />
<asp:Parameter Direction=InputOutput Name=recordsAffected Type=Int32 />
</SelectParameters>
</asp:ObjectDataSource>

85
Chng 8. Customer Support

n y chng c g mi. iu kim ngun d liu c kt vi phng thc


GetDownloadList ca lp Download. Tham s u ra recordsAffected c s dng ly s
lng mNu tin c tr v t c s d liu.
GetDownloadList ly cc mNu tin t mt phng thc cng tn trong lp
lng mNu tin v gn cho tham s u ra, ri tr v DataSet:

DownloadDB,

m s

Public Shared Function GetDownloadList(ByVal categoryId As Integer, _


ByRef recordsAffected As Integer) As DataSet
Dim dsDownloads As DataSet = DownloadDB.GetDownloadList(categoryId)
recordsAffected = dsDownloads.Tables(0).Rows.Count
Return dsDownloads
End Function

Phng thc

trong lp DownloadDB c m lnh tng t nh phng thc


m bn thy trc y. Hy quan st cu lnh SELECT ca th tc tn tr ly
cc download c yu cu:
GetDownloadList

GetProductList

SELECT TOP 100


Id,
Title,
Description,
CategoryId,
DownloadUrl
FROM
Download
WHERE
CategoryId IN
(
SELECT DISTINCT Id FROM fnSelectChildCategories(@categoryId)
UNION
SELECT DISTINCT Id FROM fnSelectParentCategories(@categoryId)
)
OR @categoryId IS NULL
ORDER BY
Title

Mnh SELECT v FROM trng rt bnh thng, mnh ORDER BY cng vy. Mnh WHERE
hi phc tp. Th nht, bn thy mt cu lnh IN. Cu lnh ny trong ngn ng T-SQL l mt
cch tin li ly nhiu mNu tin, chng hn theo ID. Cu lnh SELECT di y tr v cc
download thuc chng loi c ID l 3, 7, hay 8:
SELECT Id, Description FROM Download WHERE CategoryId IN (3, 7, 8)

Phn th hai ca mnh WHERE s dng cu lnh UNION hp kt qu ca hai cu lnh


SELECT bn trong. B qua phn hin thc bn trong ca hai cu lnh SELECT, gi s cu lnh
SELECT th nht tr v 3,7,8 v cu lnh SELECT th hai tr v 4,7,9. Kt qu ca mnh WHERE
bn ngoi l:
WHERE CategoryId IN (3, 4, 7, 8, 9)

rng cc gi tr trng nhau (7) b loi b mt cch t ng. N u khng mun iu xy


ra, bn hy s dng UNION ALL.
Gi n phn kh nht: fnSelectChildCategories v fnSelectParentCategories. y l hai
hm do ngi dng nh ngha (UDF), tr v mt bng cho m lnh gi. Chng nhn mt tham
s kiu int. Cc hm ny c th tr v cc ID cha hoc cc ID con ca mt chng loi cho

86
Chng 8. Customer Support

trc (cng vi ID ca chnh chng loi ny). Do , trong hnh 8-16, gi s gi


fnSelectParentCategories vi ID ca chng loi V70, bn s ly c cc ID ca cc chng
loi V70, Power Printers, v Rocks Hardware. thy cch hot ng ny, hy quan st hm
fnSelectParentCategories:
CREATE FUNCTION fnSelectParentCategories
(
@categoryId int
)
RETURNS @theCategoryTable TABLE (Id int, Description nvarchar(100))
AS
BEGIN
WITH CategoriesCte(Id, Description, ParentCategoryId)
AS
(
SELECT Id, Description, ParentCategoryId
FROM Category
WHERE Id = @categoryId
UNION ALL
SELECT C.Id, C.Description, C.ParentCategoryId
FROM Category AS C
JOIN CategoriesCte AS E
ON C.Id = E.ParentCategoryId
)
INSERT INTO @theCategoryTable (Id, Description)
SELECT Id, Description FROM CategoriesCte
RETURN
END

u tin, ch k ca hm c nh ngha, gm tn hm v tham s u vo @categoryId.


Cu lnh RETURNS bo vi m lnh gi rng hm ny tr v mt i tng bng gm ct ID v
ct Description. Bng c tr v t hm ny c th c s dng nh bt k bng thng
thng no khc: bn c th ly d liu t n, kt n vi cc bng khc,
Phn th hai ca hm ny c l mi i vi bn, do s c xem xt k. Cu lnh WITH ch
ra im bt u ca mt Common Table Expression (CTE). M lnh trn ny trnh by mt CTE
quy, mc d cng c th s dng cc CTE khng quy.
Mt CTE quy bao gm hai phn: thnh vin neo (anchor member) v thnh vin quy
(recursive member). Trong on m trn, cu lnh SELECT th nht l thnh vin neo. Khi hm
c thc thi, cu lnh SELECT ny c thc thi trc. Sau , vi mi mNu tin trong tp kt
qu ca biu thc , thnh vin quy c kch hot. Sau , vi mi mNu tin m thnh
vin quy thm vo tp kt qu, thnh vin quy c kch hot ln na, cho n khi
khng cn mNu tin no na.
Tr li v d my in V70, hnh 8-17 hin th cc kt qu t CTE i vi chng loi V70.

87
Chng 8. Customer Support

Hnh 8-17

Khi cu lnh SELECT ca thnh vin neo thc thi, n thm mNu tin u tin vo tp kt qu vi
Id l 67 v ParentCategoryId l 64. Sau thnh vin quy thc thi, v ly cc chng loi c
Id trng vi ParentCategoryId ca mNu tin V70. Ch c mt mNu tin nh th, l mNu tin
Power Printers vi ID l 64 v ParentCategoryId l 55. MNu tin ny cng c thm vo tp kt
qu. Sau , cu lnh SELECT c lp li cho mNu tin va c thm vo, v lc ny n ly
chng loi cha ca mNu tin Power Printers, dn n chng loi Rocks Hardware c thm vo tp
kt qu.
Hm fnSelectChildCategories ly cc mNu tin con ca mt chng loi, hot ng cng tng
t nh trn. Tuy nhin, bi v mt chng loi cha c th c nhiu mNu tin con, ri mNu tin con
c nhiu mNu tin con khc na, tp kt qu c th ln hn.
Th tc tn tr ly cc download t c s d liu s ly c cc mNu tin con v cc mNu tin cha
bng cu lnh UNION. Theo cch ny, ng dn y ca mt chng loi c tr v, bao
gm tt c cha ng v con chu ca n. N u bn ch mun thu ly cc mNu tin con ca mt
chng loi, hy b cu lnh UNION v dng chn t hm fnSelectParentCategories khi th
tc tn tr sprocDownloadSelectList.
Bn thy cch ly cc mNu tin t c s d liu ca th tc tn tr sprocDownloadSelectList,
phn k tip m bn cn tm hiu l cch nhn bit danh sch th xung ca trang Downloads.
Hy xem ObjectDataSource odsDownloads, tp trung vo nt <SelectParameters> vi mt
<asp:ControlParameter>:
<asp:ObjectDataSource ID=odsDownloads runat=server SelectMethod=GetDownloadList
TypeName=Download>
<SelectParameters>
<asp:ControlParameter
ControlID=lstCategoryLevel1 Name=categoryId PropertyName=SelectedValue
Type=Int32 />
<asp:Parameter Direction=InputOutput Name=recordsAffected Type=Int32 />
</SelectParameters>
</asp:ObjectDataSource>

Ban u, ControlID ca ControlParameter c thit lp l lstCategoryLevel1. iu ny c


ngha: khi bn chn mt mc t danh sch th xung th nht, trang s lm ti v bn s
thy cc download thuc chng loi cng tt c cc chng loi con ca n bng CTE
quy. Tuy nhin, khi bn chn mt chng loi t danh sch th xung th hai, danh sch
download s cha cc mNu tin gn vi chng loi . M lnh trong code-behind ca trang
thc hin iu ny:

88
Chng 8. Customer Support
Protected Sub lstCategoryLevel2_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles lstCategoryLevel2.SelectedIndexChanged
If Not lstCategoryLevel2.SelectedValue = Then
Hin th danh sch th xung th ba
lstCategoryLevel3.Visible = True
Kt odsDownloads cho danh sch th xung ny
Dim myParam As ControlParameter = _
CType(odsDownloads.SelectParameters(0), ControlParameter)
myParam.ControlID = lstCategoryLevel2
lstCategoryLevel3.DataBind()
Else
Dim myParam As ControlParameter = _
CType(odsDownloads.SelectParameters(0), ControlParameter)
myParam.ControlID = lstCategoryLevel1
lstCategoryLevel3.Visible = False
End If
End Sub

M lnh ny thc thi khi bn c mt la chn khc trong danh sch th xung th hai. Bn
trong phng thc th s kin SelectedIndexChanged ca danh sch th xung ,
SelectedValue c kim tra. N u c gi tr (tc l c mt chng loi hp l c chn),
SelectParameter ca ObjectDataSource c thay i ng thnh danh sch th xung th hai:
Dim myParam As ControlParameter = _
CType(odsDownloads.SelectParameters(0), ControlParameter)
myParam.ControlID = lstCategoryLevel2

Dng m u tin ly mt tham chiu n SelectParameter th nht ca iu kim ngun d


liu (tham s th hai l tham s u ra c s dng xc nh c bao nhiu mNu tin c
tr v t c s d liu). Tp SelectParameters tr v mt i tng Parameter tng qut, do
CType c s dng p n v kiu ControlParameter. Khi myParam cha mt
ControlParameter, bn c th truy xut thuc tnh ControlID v gn cho n ID ca danh sch
th xung th hai. iu ny lm cho ObjectDataSource ly SelectedValue t danh sch th
xung th hai, ri truyn cho SelectMethod (phng thc GetDownloadList trong lp
Download). Phng thc ny lm cho DataList hin th cc download ng vi chng loi
c chn.
N guyn l ny cng c lp li cho danh sch th xung th ba v th nht. Theo cch ny,
bn c th m bo DataList lun hin th cc mNu tin ng vi chng loi c chn trong
danh sch th xung b tc ng sau cng.
V d trn cho thy rng cc iu kim trong m nh du ca trang khng phi c thit lp
cng. Bn c th d dng hiu chnh cc iu kim lc thc thi bng m lnh ca cc s
kin v phng thc trong code-behind. iu ny c th rt hu ch nu bn mun thay i
hnh vi ca trang lc thc thi.
Phn cui cng trong trang Downloads m bn cn xem l s kin Selected ca iu kim
odsDownloads. S kin ny pht sinh khi iu kim hon tt vic thu ly d liu t ngun d
liu v l ni l tng hin th mt thng bo cho ngi dng bit c bao nhiu mNu tin
c tr v t c s d liu. Phng thc GetDownloadList trong lp Download c mt tham s
u ra (c ch nh bi t kha ByRef) tr v s lng mNu tin cho m lnh gi. Bn trong
s kin Selected ca ngun d liu, tham s u ra c thu ly t tp hp OutputParameters
ca i s ObjectDataSourceStatusEventArgs:
Protected Sub odsDownloads_Selected(ByVal sender As Object, _

89
Chng 8. Customer Support
ByVal e As System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs) Handles _
odsDownloads.Selected
Dim recordsAffected As Integer = _
Convert.ToInt32(e.OutputParameters.Item(recordsAffected))
End Sub

M lnh cn li trong phng thc th l s kin c s dng xy dng mt thng bo,


cho ngi dng bit c bao nhiu mNu tin c tm thy.
n y kt thc tho lun v trang Downloads. Vi trang ny, ngi dng c th duyt qua
danh sch download, lc ra cc download m h quan tm nht.
Mt tnh nng khc ca webiste cho php ngi dng tm kim ni dung l trang Faqs, s
c tho lun ngay sau y.

8.3.4 FAQ
Trang cha cc cu hi thng gp khc vi cc trang m bn thy. Thay v s dng cc
danh sch th xung cho cc chng loi, trang Faqs cho php ngi dng tm kim trn ton
b bng Faq vi mt truy vn h tr logic AND v OR. Do , truy vn driver AND failure s
tr v tt c cc cu hi thng gp c cha t driver v failure, trong khi truy vn
driver OR failure tr v cc FAQ cha t nht mt trong hai t .
Cc phin bn thng mi ca SQL Server 2005 cung cp khi nim Full Text Indexing. y l mt
k thut tm kim rt mnh, cho php bn t nhiu cu hi phc tp hn cc truy vn Boolean
n gin. Tuy nhin, Full Text Indexing khng c trong SQL Server Express Edition, do bn phi
ci phin bn y nu mun s dng tnh nng ny. Tham kho SQL Server Books Online hoc
website MSDN ca Microsoft (http://msdn.microsoft.com) hiu thm v Full Text Indexing.
M nh du ca trang Faqs rt n gin: dng ch gii thiu, mt textbox nhp chui tm
kim, mt nt nhn bt u tm kim, v hai placeholder hin th mt thng bo cho
ngi dng bit s lng kt qu tm c. N cng c mt iu kim DataList hin th
cc cu hi thng gp v cc cu tr li. C l bn n s vng bng ca cc iu kim
ngun d liu trong m nh du ca trang? Trang ny khng c iu kim ngun d liu,
mi php kt d liu u c thc hin trong code-behind ca trang, trong s kin Click ca
nt nhn:
Protected Sub btnSearch_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnSearch.Click
dlFaqs.DataSource = Faq.GetFaqList(txtSearchTerm.Text)
dlFaqs.DataBind()
If dlFaqs.Items.Count > 0 Then
lblSearchedFor2.Text = txtSearchTerm.Text
plcRecords.Visible = True
plcNoRecords.Visible = False
Else
lblSearchedFor1.Text = txtSearchTerm.Text
plcNoRecords.Visible = True
plcRecords.Visible = False
End If
End Sub

M lnh trn gi phng thc GetFaqList ca lp Faq. Phng thc ny (s c xt sau) tr


v mt DataSet, c gn cho thuc tnh DataSource ca iu kim DataList. Bi v khng c

90
Chng 8. Customer Support

iu kim ObjectDataSource no c s dng t ng th l vic kt d liu, bn phi gi


DataBind mt cch tng minh trn DataList. iu ny khin DataList hin th cc FAQ c
tr v t c s d liu. Sau khi DataBind c gi, bn c th kim tra s mc ca DataList
bng cch xt thuc tnh Count ca tp Items. Khi Count bng 0, trang cho hin th
<asp:PlaceHolder> vi tn l plcNoRecords (cha mt thng bo khng tm thy FAQ no).
cho thy ngi dng tm kim g, nhn lblSearchedFor1 c cp nht vi chui tm kim.
Thay v trc tip kt iu kim trong code-behind bng dlFaqs.DataBind(), bn cng c th s
dng mt trong cc iu kim ngun d liu, nh ObjectDataSource. Tuy nhin, s dng mt
iu kim nh th s cn lm vic hn hin thc chc nng nh mong mun. Trc tin,
bn cn to mt <asp:Parameter> cho chui tm kim. Bn cng cn tm cch ngn iu kim
thc thi thao tc Select khi trang np ln u tin. Cui cng, bn cn vit m lnh cho
phng thc th l s kin Selected (pht sinh sau khi iu kim chn d liu t ngun d
liu) nhm xc nh c mNu tin no c tr v hay khng, bn c th Nn v hin cc panel
thch hp. Trc tip s dng DataBind trn iu kim DataList trong code-behind gii quyt
c tt c cc vn ny. Chng 12 s trnh by cch s dng s kin Selected ca iu
kim ObjectDataSource ly nhng thng tin hu ch v d liu c tr v bi iu kim
sau khi hon tt vi phng thc Select ca n.
Khi DataList cha cc mNu tin, hnh ng ngc li c thc hin. plcNoRecords c Nn v
plcRecord c hin th.
ng nh bn mong i, GetFaqList ca lp Faq gi phng thc GetFaqList ca lp FaqDB
ly cc cu hi thng gp t c s d liu. Phng thc ny cn c xem xt k, bi v n
khc vi m lnh truy xut d liu m bn thy trc y. Mi th tc tn tr m bn thy
trc y u l self-contained, tc l chng cha cc cu lnh SQL hon chnh, nhn (ty
chn) mt hay nhiu tham s iu khin mnh WHERE. Tuy nhin, bi v ngi dng c th
tm kim bng c php truy vn Boolean nh gii thiu trc y, mt mnh WHERE bnh
thng s khng lm vic c. Thay vo , m lnh trong lp FaqDB xy dng ng mnh
WHERE, v truyn n lm tham s cho th tc tn tr. Sau , th tc tn tr s dng
phng thc EXEC ca SQL Server thc thi cu lnh SQL ng (cha mnh WHERE ). Quy
trnh ny s c gii thch tng bc mt. u tin, hy xem cu lnh SQL cui cng th no.
Gi s ngi dng nhp chui driver AND failure, tc l ngi ny mun tm tt c cc
FAQ c cha hai t ny. Cu lnh SELECT s nh sau:
SELECT
Id,
QuestionShort,
QuestionLong,
Answer
FROM
Faq
WHERE
(
QuestionShort LIKE N%driver% OR QuestionLong LIKE N%driver%
OR Answer LIKE N%driver%
)
AND
(
QuestionShort LIKE N%failure% OR QuestionLong LIKE N%failure%
OR Answer LIKE N%failure%
)

91
Chng 8. Customer Support

Bi v tnh cht ng ca chui tm kim, bn khng th no ch vic thay %driver% v


%failure% vi hai tham s cho th tc tn tr l c th to truy vn ng c. L nh
ngi dng tm driver AND failure AND Power Printer th sao? Thay v hai tham s, gi
y bn cn n ba tham s! Gii php cho vn ny l to ng ton b mnh WHERE.
iu ny c thc hin bng phng thc BuildWhereClause (phng thc ny c gi
trong phng thc GetFaqList):
Private Shared Function BuildWhereClause(ByVal searchTerm As String) As String
Dim simpleSearch As Boolean = True
Dim whereClause As String = String.Empty
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm

=
=
=
=
=
=
=
=
=

searchTerm.Trim()
searchTerm.Replace(', '')
searchTerm.Replace("", )
searchTerm.Replace(%, )
searchTerm.Replace(--, )
searchTerm.Replace(;, )
searchTerm.Replace((, )
searchTerm.Replace(), )
searchTerm.Replace(_, )

Dim testReplace As String =


testReplace = searchTerm.ToUpper().Replace( AND , )
If testReplace <> searchTerm.ToUpper() Then
simpleSearch = False
End If
testReplace = searchTerm.ToUpper().Replace( OR , )
If testReplace <> searchTerm.ToUpper() Then
simpleSearch = False
End If
If simpleSearch = True Then
searchTerm = searchTerm.Replace( , AND )
End If
Dim myAndSplits() As String = Regex.Split(searchTerm, and , _
RegexOptions.IgnoreCase)
For i As Integer = 0 To myAndSplits.Length - 1
Dim myOrSplits() As String = Regex.Split(myAndSplits(i), or , _
RegexOptions.IgnoreCase)
whereClause += (
For j As Integer = 0 To myOrSplits.Length - 1
whereClause += (F.QuestionShort LIKE N% & myOrSplits(j) & % OR _
F.QuestionLong LIKE N% & myOrSplits(j) & % OR F.Answer LIKE N% & _
myOrSplits(j) & %)
If (j + 1) < myOrSplits.Length Then
whereClause += OR
End If
Next
whereClause += )

Next

If (i + 1) < myAndSplits.Length Then


whereClause += AND
End If

92
Chng 8. Customer Support
Return whereClause
End Function

M lnh bt u bng vic khai bo hai bin v mt s li gi phng thc Replace:


Dim simpleSearch As Boolean = True
Dim whereClause As String = String.Empty
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm
searchTerm

=
=
=
=
=
=
=
=
=

searchTerm.Trim()
searchTerm.Replace(', '')
searchTerm.Replace("", )
searchTerm.Replace(%, )
searchTerm.Replace(--, )
searchTerm.Replace(;, )
searchTerm.Replace((, )
searchTerm.Replace(), )
searchTerm.Replace(_, )

Bin simpleSearch c s dng xc nh chui tm kim ban u c cha t kha AND hay
OR hay khng. Bin whereClause c s dng cha mnh WHERE m phng thc ny
xy dng. Phng thc Replace c s dng nhiu ln loi b cc k t khng cn thit
cho cu lnh SQL. N u bn khng lm sch m SQL, c s d liu ca bn s d b hacker tn
cng theo kiu SQL Injection. Bnh thng, m lnh th tc tn tr c tham s ha s m
nhn vic ny; nhng vi mt cu lnh SQL ng, bn phi t thc hin vic ny. Trong bn
hin thc hin ti, m lnh lm sch c nhng trc tip trong phn thn ca phng thc,
nhng nu bn c nh s dng k thut ny thng hn th nn chuyn n thnh mt
phng thc ring bit. Bn c th thy mt s k t quan trng, c ngha c bit trong TSQL c thay th. V d, hai du gch ngang (--) c thay bng rng. Hai k t ny biu
th bt u mt ch thch, nhng cng c hacker s dng khng cho phn SQL cn li
thc thi. Du nhy n (') c thay bng hai du nhy n (''), v du nhy kp (") b loi
b hon ton bi v chng c th c s dng xen cc du phn cch chui khng hp l.
Du phn trm (%) b loi b ngn ngi dng tm vi cc k t i din (wildcard).
Cc cu lnh k tip s dng bin testReplace v phng thc
kim ban u cha cc t kha AND hay OR hay khng:

Replace

xem chui tm

Dim testReplace As String =


testReplace = searchTerm.ToUpper().Replace( AND , )
If testReplace <> searchTerm.ToUpper() Then
simpleSearch = False
End If
testReplace = searchTerm.ToUpper().Replace( OR , )
If testReplace <> searchTerm.ToUpper() Then
simpleSearch = False
End If
If simpleSearch = True Then
searchTerm = searchTerm.Replace( , AND )
End If

N u mt trong hai t kha ny hin din trong chui tm kim, gi nh rng ngi dng c
s dng logic Boolean trong chui tm kim. N gc li, mi khong trng trong chui tm
kim c thay bng AND. Do , nu ngi dng tm driver OR failure, chui tm kim
khng thay i. Tuy nhin, nu ngi dng tm driver failure, chui tm kim c thay
bng driver AND failure.

93
Chng 8. Customer Support

Khi m tip theo s dng phng thc Split ca i tng Regex tch chui tm kim da
trn t kha AND, sau duyt qua mng ny v quan st tng phn t ring l:
Dim myAndSplits() As String = Regex.Split(searchTerm, and , _
RegexOptions.IgnoreCase)
For i As Integer = 0 To myAndSplits.Length - 1

Sau , m lnh tch phn t da trn t kha OR. N u t kha ny khng hin din trong
phn t, vng lp For j thc thi ng mt ln v thm phn t vo mnh WHERE (c bao
quanh bi du ngoc n). N u phn t c cha t kha OR, vng lp thm mi mc ring l
vo mnh WHERE (c phn tch bi t kha OR):
Dim myOrSplits() As String = Regex.Split(myAndSplits(i), or , _
RegexOptions.IgnoreCase)
whereClause += (
For j As Integer = 0 To myOrSplits.Length - 1
whereClause += (F.QuestionShort LIKE N% & myOrSplits(j) & % OR _
F.QuestionLong LIKE N% & myOrSplits(j) & % OR F.Answer LIKE N% & _
myOrSplits(j) & %)
If (j + 1) < myOrSplits.Length Then
whereClause += OR
End If
Next
whereClause += )
If (i + 1) < myAndSplits.Length Then
whereClause += AND
End If
Next
Return whereClause
End Function

Cui cng, ton b mnh WHERE c tr v cho m lnh gi.


thy mnh WHERE c xy dng th no, gi s ngi dng nhp chui tm kim
driver AND failure AND Power Printer OR 3D Printer.
Biu thc tm kim ny s tr v tt c cc cu hi thng gp c cha t driver v
failure v Power Printer hoc 3D Printer. Vi v d ny, kt thc hm
BuildWhereClause, bin whereClause cha chui sau:
(
(
F.QuestionShort LIKE N%driver% OR F.QuestionLong LIKE N%driver%
OR F.Answer LIKE N%driver%
)
)
AND
(
(
)
)
AND

F.QuestionShort LIKE N%failure% OR F.QuestionLong LIKE N%failure%


OR F.Answer LIKE N%failure%

94
Chng 8. Customer Support
(
(

F.QuestionShort LIKE N%Power Printer% OR F.QuestionLong LIKE N%Power


Printer% OR F.Answer LIKE N%Power Printer%

)
OR
(

F.QuestionShort LIKE N%3D Printer% OR F.QuestionLong LIKE N%3D Printer%


OR F.Answer LIKE N%3D Printer%

Khi c thc thi bi SQL Server, mnh WHERE ny tr v tt c cc cu hi thng gp tha


tiu chuNn tm kim. Bi cch thit lp m lnh, n khng quan tm cu hi ngn c cha t
driver v cu tr li c cha t failure hay khng, hoc ngc li. Trong mi trng
hp, m lnh ny u tm thy cc mNu tin m ngi dng tm kim.
Mnh WHERE c truyn cho c s d liu thng qua tham s SQL @whereClause, ti y n
c gn vo mt cu lnh SQL v c thc thi vi lnh EXEC:
CREATE PROCEDURE sprocFaqSelectListBySearchTerm
@whereClause nvarchar(1000)
AS
DECLARE @sqlStatement nvarchar(MAX)
SET @sqlStatement =
SELECT
Id,
QuestionShort,
QuestionLong,
Answer
FROM
Faq F
WHERE + @whereClause
+
ORDER BY
Id DESC
EXEC(@sqlStatement)

Cu lnh
thng.

EXEC

tr v cc mc FAQ c yu cu, cng ging nh cu lnh

SELECT

thng

n y xem nh kt thc phn FAQ v ton b phn cng khai ca Customer Support. Vi cc
trang trong th mc ContentFiles, ngi dng c th d dng tm thy cc sn phNm, cc file i
km sn phNm, v duyt qua cc cu hi thng gp.
Phn cui cng ca M lnh Customer Support kho st cc trang trong th mc Management,
cha CMS cho Customer Support.

8.3.5 Customer Support CMS


Hu ht cc khi nim c s dng trong h thng qun l ni dung ca Customer Support
c tho lun trong cc chng trc y, c bit l chng CMS. Tuy nhin, c mt s
iu cn bn, s c trnh by ngay sau y mt cch ngn gn.

Trang qun l chng loi

95
Chng 8. Customer Support

Trang Categories.aspx cho php bn thm cc chng loi mi vo c s d liu. Bng vic s
dng cc danh sch th xung quen thuc, bn c th i su vo cu trc phn cp chng loi
v thm mt chng loi mi ti mi mc. im quan trng cn lu trang ny l cch s
dng cc validator. Trang ny c ba textbox, cho php bn nhp mt chng loi mi thm
vo c s d liu ti mi mc. Mi textbox c mt iu kim <asp:RequiredFieldValidator>
gn vi n. Thng thng, vi ba validator, bn cn phi nhp d liu vo c ba textbox trc
khi trang xc nhn tnh hp l. Tuy nhin, trong trng hp ny, ch mt trong ba textbox l
bt buc. cho php ch mt validator ti mt thi im, mi validator c mt c tnh
ValidationGroup khc nhau. Di y l validator kim tra textbox th nht:
<asp:RequiredFieldValidator ID=reqLevel1 ValidationGroup=Level1 runat=server
ControlToValidate=txtLevel1 Display=Dynamic
ErrorMessage=* />

Cc iu kim kch hot vic kim tra hp l (nh cc nt nhn) gi y cng c c tnh
ValidationGroup. Theo cch ny, bn c th gn cc iu kim postback vi mt
ValidationGroup c th:
<asp:Button ID=btnAddNewLevel1 runat=server Text=Thm mc 1 mi
ValidationGroup=Level1 />

Khi nt ny c nhn, ch c cc iu kim trong cng mt ValidationGroup mi c kim


tra tnh hp l.

Cc trang lit k
Cc trang lit k sn phNm, download, v FAQ rt ging nhau. Chng s dng mt GridView
hin th cc mc. Cc nt Sa v Xa cho php bn thay i cc mc hin c v xa chng.
RowCommand cho mi GridView xt CommandName ca i s xc nh hnh ng phi c
thc hin, s dng mt mnh Select Case. Bn trong mi khi Case, m lnh chuyn
CommandArgument thnh Integer v s dng n thu ly DataKey ca khung li. Bn c th
di m lnh ny ra ngoi mnh Select Case bn ch phi vit c mt ln. Tuy nhin khi
lm th, bn s gp vn khi sp xp GridView. Mc d vic sp xp c thc hin t ng
bi ASP.NET, nhng n vn pht sinh RowCommand khi bn nhp vo mt trong cc tiu ct
sp xp khung li. Khi thc hin nh th, CommandArgument ca tham s e cha tn ca ct
cn sp. R rng, tn ct khng th no chuyn thnh Integer c, do m lnh s ph
sn.

Cc trang to v cp nht
Vi mi loi ni dungDownload, FAQ, v Sn phmc mt trang InsertUpdate cho php bn
to mi v cp nht cc mc ang tn ti. C ba u s dng FCKeditor. M lnh ca trang
Download v Product s dng phng thc GetCategoryPath ca lp Category. Phng thc ny
tr v ng dn ca mt chng loi t mNu tin con n mNu tin cha. Phng thc ny l cn
thit bi v mc ni dung trong c s d liu ch cha chng loi con su nht. c th chn
trc danh sch th xung ca cc mc cha, bn cn bit mt chng loi c cc chng loi
cha no. Th tc tn tr sprocCategorySelectPath ln na s dng Common Table Expressions
theo cch m bn thy trc y.
Vi cc trang ny v m lnh ca chng, bn i ht phn M lnh Customer Support. Gi
y, bn c th s dng v hiu r li hot ng bn trong ca Customer Support. Trong phn
tip theo, bn s bit cch ci t ng dng ln web server.

96
Chng 8. Customer Support

8.4

Ci t Customer Support

Cng nh cc chng khc trong quyn sch ny, bn c th chn ci t Customer Support t
ng hay bng tay. Qu trnh ci t t ng cho php bn thit lp ng dng chy di IIS.
iu ny hu ch nu bn mun trin khai h thng trn cc server internet hay intranet cc
b. N u mun xem xt chi tit m lnh v ci tin n, bn nn chn qu trnh ci t bng tay.

S dng gi ci t
N u bn mun ci t CustomerSupport nh mt website thc th trn mt my tnh hay my
server, khng c hiu chnh hay m rng g c, thc hin theo cc bc sau (s dng gi ci
t):
Chy file WebSetupProjects\CustomerSupport\Debug\CustomerSupport.msi t CD-ROM nh
km. Qu trnh ny ci t nhng file cn thit vo th mc C:\Inetpub\wwwroot\
CustomerSupport\. Ch rng, trong lc ci t, c mt mn hnh yu cu bn xc nhn
tn th mc o, bn hy gi nguyn tn mc nh l CustomerSupport (xem hnh 8-18).

Hnh 8-18

N hp Next ci t ng dng, v ng chng trnh ci t khi hon tt.


K tip, m file Web.config trong th mc C:\Inetpub\wwwroot\CustomerSupport\ v tm
nt <connectionStrings>. Kim tra chui kt ni c tr n bn ci t SQL Server ca
bn hay khng v iu chnh nu cn thit. Lu v ng file ny.
Cng ging nh chng 7 (CMS), bn cn cu hnh cc quyn bo mt cho th mc
UserFiles, website c th lu cc file c upload qua website v FCKeditor. Tham
kho chng c nhng ch dn chi tit.

97
Chng 8. Customer Support

By gi duyt http://localhost/CustomerSupport. ng dng Customer Support s xut hin


v bn c th xem danh sch sn phNm, download, v FAQ.

Ci t bng tay
Mc d s dng gi ci t l mt cch rt tin li ci t Customer Support, ci t bng tay
cng khng my kh. ci t Customer Support bng tay, tun theo cc bc sau:
Chp th mc Websites\CustomerSupport\ t CD-ROM nh km vo a cng, chng hn
C:\Websites\CustomerSupport\.
M Visual Studio 2005 (hay Visual Web Developer). Chn File | Open Web Site v tm n th
mc C:\Websites\CustomerSupport\. Khi , ca s Solution Explorer cha tt c cc file
ca d n.
K tip, m file Web.config t Solution Explorer v tm nt <connectionStrings>. Kim
tra chui kt ni c tr n bn ci t SQL Server ca bn hay khng v iu chnh
nu cn thit. Lu v ng file ny.
Cng ging nh chng 7 (CMS), bn cn cu hnh cc quyn bo mt cho th mc
UserFiles, website c th lu cc file c upload qua website v FCKeditor. Tham
kho chng c nhng ch dn chi tit.
By gi bn c th duyt website bng cch nhn Ctrl+F5. Visual Studio 2005 (hay Visual
Web Developer) s khi chy web server ni b v website s c hin th trong trnh
duyt mc nh.

S dng Customer Support


Bt chp chn kiu ci t no, bn cng phi xem Customer Support trong trnh duyt. Bn c
th s dng cc mc trnh n nh Sn phm v Download theo cch c m t u
chng. Bn cng thy mc trnh n Qun tr, mc ny cho php bn qun l ni dung trong
h thng.

98
Chng 8. Customer Support

Hnh 8-19

N hm to s thun li khi l gii cch hot ng ca Customer Support, cng nh cho php bn
truy xut d dng phn phn tr, khng c c ch xc thc no c s dng cho website ny.
iu ny c ngha: bt c ai cng c quyn truy xut phn qun tr ca website ny. D nhin
y khng phi l iu bn mun, cho nn bn cn bo v vng . thc hin vic ny,
chn Website | ASP.NET Configuration t trnh n chnh ca Visual Studio 2005 hay Visual Web
Developer. N h th, Web Site Administration Tool s xut hin trong ca s trnh duyt. To vai tr
ContentManagers v mt ngi dng, ri gn ngi dng ny vo vai tr . N u bn cn thm
thng tin v cch lm vic ca Web Site Administration Tool, nhp lin kt How do I use this tool?
gc trn phi ca mn hnh.
Bc k tip l thm on m sau vo cui file Web.config, ngay sau th ng ca nt
<system.web>:
</system.web>
<location path=Management>
<system.web>
<authorization>
<allow roles=ContentManagers />
<deny users=*/>
</authorization>
</system.web>
</location>

on m trn khng cho php truy xut th mc Management i vi nhng ngi dng khng
thuc vai tr ContentManagers.
Mt gii php khc l to mt website CMS hon ton mi, kt ni vi c s d liu Customer
Support. Vi cch ny, bn c th tch bit phn cng khai vi phn c bo v ca website.

99
Chng 8. Customer Support

Trong phn tip theo, bn s bit cch m rng Customer Support n hu ch hn. Phn ny
xut mt s tnh nng ci tin cho Customer Support v hin thc mt trong nhng tnh nng
.

8.5

M rng Customer Support

Mt ci tin cho Customer Support l cho php ngi dng lin h vi bn thng qua mt form
Contact. Theo cch ny, ngi dng c th t nhng cu hi v sn phNm. Sau , cc cu hi
ny cng cc cu tr li c th c thm vo danh sch FAQ ca site.
Phn ny s hng dn bn to mt tnh nng nh th. Bn s bit cch to form v cch gi
e-mail cho b phn h tr khi mt ngi dng in vo form. Thm na, bn s bit cch lu
nhng chi tit v ngi dng vo Profile ngi dng khng phi nhp i nhp li nhng
chi tit v mnh. hin thc form Contact, tun theo cc bc sau:
Thm mt trang mi vi tn l Contact.aspx trong th mc ContentFiles. Cho trang ny
s dng trang MainMaster.master.
Trong iu kim MainMenu.ascx (thuc th mc Controls), thm mt lin kt n trang
mi ny ngi dng c th truy xut n.
Trn trang Contact, to mt form vi cc textbox cho tn ngi dng, a ch e-mail,
v cu hi/li bnh. t tn cho cc iu kim ny ln lt l txtUserName,
txtEmailAddress, v txtComments. Thit lp thuc tnh TextMode ca txtComments l
MultiLine. Thm nt btnSave vi text l Gi comment.
Thm checkbox chkRememberMe ngi dng chn lu nhng chi tit v h. Tip
tc, thm nhn lblStatus bo vi ngi dng rng thng ip c gi.
N u mun, bn c th thay i b cc trang thnh bt c g m bn thy hp. Bn c
th s dng cc bng v nhn trang c d c.
N hp p vo nt nhn trong Design View VWD thm m lnh th l s kin
ca nt nhn.

Click

Chuyn sang Design View v nhp p vo bt c u trn trang. M lnh th l s


kin Page_Load s c thm vo.
M file Web.config v bn trong phn t <system.web>, thm on m sau:
<anonymousIdentification enabled="true" />
<profile>
<properties>
<add name="Name" allowAnonymous="true" />
<add name="EmailAddress" allowAnonymous="true" />
</properties>
</profile>

Cu hnh sao cho ng dng s dng mt provider h tr tnh nng Profile. lm nh


th, chn Website | ASP.NET Configuration trong VS2005 (hay VWD). Trong Web Site
Administration Tool, nhp Provider Configuration ri nhp Select a single provider for all site
management data. m bo AspNetSqlProvider c chn v nhp lin kt Test m
bo provider hot ng chnh xc.

100
Chng 8. Customer Support

Hnh 8-20

Tr li file Web.config v cun n nt <system.net>. i c tnh host ca phn t


<network> thnh tn ca mail server m bn ang s dng gi mail. Ty vo ci
t ca bn, y c th l localhost hay mt SMTP server no .
u trang, thm mt cu lnh Imports cho System.Net.Mail ri thm on m sau
vo phng thc th l s kin Click ca nt nhn m bn thm bc 6:
Protected Sub btnSave_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnSave.Click
Dim subject As String = "Phn hi t website"
Dim message As String = String.Format("Ngi dng {0} vi " & _
"a ch e-mail: {1} li thng ip sau " & _
ControlChars.CrLf & "{2}", txtUserName.Text, _
txtEmailAddress.Text, txtComments.Text)
Dim mySmtpClient As SmtpClient = New SmtpClient()
Dim myMessage As MailMessage = New MailMessage( _
"You@YourProvider.Com", "You@YourProvider.Com", subject, message)
myMessage.IsBodyHtml = False
mySmtpClient.Send(myMessage)
If chkRememberMe.Checked Then
Profile.Name = txtUserName.Text
Profile.EmailAddress = txtEmailAddress.Text
Else
Profile.Name = String.Empty
Profile.EmailAddress = String.Empty
End If
lblStatus.Text = "Thng ip c gi i."
End Sub

Hy thay You@YourProvider.Com bng a ch e-mail ca bn. on m trn nh dng


phn thn thng ip bng cch ly gi tr ca cc textbox v ni vo thng ip
(dng chui). Sau , mt MailMessage c to ri c gi i bng phng thc

101
Chng 8. Customer Support

ca i tng SmtpClient. cui phng thc, nhng chi tit v ngi dng
c lu vo Profile nu ngi dng chn lu.

Send

Bc cui cng trong trang Contact l a nhng chi tit v ngi dng vo cc
TextBox nu chng tn ti trong profile. lm iu , thm on m sau vo
phng thc th l s kin Page_Load m bn thm bc 7:
If Not Page.IsPostBack Then
txtUserName.Text = Profile.Name
txtEmailAddress.Text = Profile.EmailAddress
End If

Trang Contact xong, gi y ngi dng c th gi mt thng ip n b phn h tr, yu


cu thm thng tin hoc xut v mt sn phNm. N hm to s d dng cho ngi dng in
form, trang Contact lu nhng chi tit v ngi dng bng tnh nng Profile ca ASP.NET 2.0. Sau
, thng tin ny c a vo cc textbox khi trang Contact np li lt tip theo.
Vi Customer Support, bn thy hu ht cc tnh nng cn thit cung cp thng tin v
h tr cho ngi dng. Tuy nhin, trong nhiu trng hp, bn cn hn th na. Vi site hin
ti, tng i d to cc tnh nng mi nh:

Tm kim theo serial numberN u c mt c s d liu cha serial number ca


cc sn phNm, bn c th kt serial number vi cc file v cc cu hi thng gp.
Theo , ngi dng c th nhanh chng tm thy thng tin cn thit bng cch nhp
serial number ca sn phNm.
Tch hp vi mt webshopTrong chng tip theo, bn s bit cch to mt
webshop (h thng bn hng trc tuyn). V bn c th tch hp webshop vi
Customer Support. Theo , ngi dng c th duyt sn phNm, t mua, v download
cc file h tr cho sn phNm ; tt c ch trong mt website.
Hin thc tnh nng download cc file c lin quany l mt tnh nng kh
ph bin, bn c th thm tnh nng ny vo trang Downloads. Ti trang ny, bn cho
hin cc file c lin quan vi file m ngi dng ang xem.

8.6

Kt chng

Trong chng ny, bn c gii thiu Customer Support, mt website cho php ngi dng
tm v ly thng tin v cc sn phNm m cng ty Codepro Hardware bn.
u tin, bn do qua h thng t gc ngi dng cui. Bn bit cch tm kim sn phNm,
cc file i km, v cc cu hi thng gp.
Tip n, bn c ci nhn khi qut v bn thit k ca h thng. Bn thy rng ng dng
c tch lm ba tng khc nhau: mt cho trnh by, mt cho logic nghip v, v mt cho
truy xut d liu. Bn thy qua danh sch cc lp c lin quan v cc phng thc m chng
h tr.
Trong phn M lnh Customer Support, bn xt k m lnh bn trong tt c cc lp v cc
trang. Bn bit cch trin khai cc iu kim ObjectDataSource p dng kin trc ba tng
cho ng dng. Cc iu kim ny cho php bn to cc ng dng thit k tt v d bo tr
(khng phi lm ri cc trang bng nhiu lnh SQL hay tn th tc tn tr). Bn cng bit cch

102
Chng 8. Customer Support

s dng tnh nng Common Table Expressions trong SQL Server, mt k thut mnh to m
quy, cho php bn thu ly cc cu trc d liu phc hp, phn cp t c s d liu.
Cui chng, bn bit cch ci t Customer Support v hin thc mt ci tin cho n.

You might also like