Giáo trình ASP.net (Phần 2)

Giới Thiệu về Bảo Mật Trong ASP.Net

Bảo mật rất quan trọng cho việc phát triển và bảo trì các ứng dụng Web. Mỗi WebSite có các

thiết lập bảo mật khác nhau. Có ba tính năng bảo mật cơ bản cho các ứng dụng ASP.Net :

Hình 10.1 Ba tính năng bảo mật cho các ứng dụng ASP.NET

Authentication : được dùng để xác nhận định dannh người dùng trước khi cho phép hoặc từ

chối các yêu cầu . Thí dụ : trong ứng dụng e-mail , tên người dùng và mật khẩu phải phù hợp

khi so sánh các thông này trong cơ sở dữ liệu.

Authorization : chỉ những người dùng có sự định danh hợp lệ mới có thể truy cập đền các tài

nguyên được chỉ định trong ứng dụng. Thí dụ : sinh viên không thể truy cập được thông tin đề

thi, điểm thi mà chỉ có giáo viên hoặc người quản trị mới có thể truy cập.

Impersionation : ứng dụng ASP.Net xử lý các hoạt động đại diện cho người dùng mà được

xác nhận bằng IIS ( Internet Information Services ) . IIS truyền dấu hiệu xác nhận đến ứng

dụng ASP.Net. Sau đó ứng dụng ASP.Net sử dụng dấu hiệu này và hoạt động dưới sự định

danh của người dùng đã xác nhận.

pdf 188 trang kimcuc 21880
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình ASP.net (Phần 2)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình ASP.net (Phần 2)

Giáo trình ASP.net (Phần 2)
Lưu hành nội bộ Trang 312 
Chƣơng 10: Bảo Mật Ứng Dụng Web 
Kết thúc chương này các bạn có thể : 
 Trình bày được các loại bảo mật trong ASP.Net 
 Mô tả được Form-Base Authentication 
 Thực thi được bảo mật sử dụng Form-Base Authentication 
10.1 Giới Thiệu về Bảo Mật Trong ASP.Net 
Bảo mật rất quan trọng cho việc phát triển và bảo trì các ứng dụng Web. Mỗi WebSite có các 
thiết lập bảo mật khác nhau. Có ba tính năng bảo mật cơ bản cho các ứng dụng ASP.Net : 
Hình 10.1 Ba tính năng bảo mật cho các ứng dụng ASP.NET 
 Authentication : được dùng để xác nhận định dannh người dùng trước khi cho phép hoặc từ 
chối các yêu cầu . Thí dụ : trong ứng dụng e-mail , tên người dùng và mật khẩu phải phù hợp 
khi so sánh các thông này trong cơ sở dữ liệu. 
 Authorization : chỉ những người dùng có sự định danh hợp lệ mới có thể truy cập đền các tài 
nguyên được chỉ định trong ứng dụng. Thí dụ : sinh viên không thể truy cập được thông tin đề 
thi, điểm thi mà chỉ có giáo viên hoặc người quản trị mới có thể truy cập. 
 Impersionation : ứng dụng ASP.Net xử lý các hoạt động đại diện cho người dùng mà được 
xác nhận bằng IIS ( Internet Information Services ) . IIS truyền dấu hiệu xác nhận đến ứng 
dụng ASP.Net. Sau đó ứng dụng ASP.Net sử dụng dấu hiệu này và hoạt động dưới sự định 
danh của người dùng đã xác nhận. 
Form-Based Authentication 
Sử dụng Forms Authentication Provider . Trong 
forms-base authentication định dạng HTML 
thường sử dụng tập hợp các thông tin xác nhận 
: tên đăng nhập , mật khẩu. Ứng dụng phải viết 
các lệnh để xác nhận các thông tin được cung 
cấp phải phù hợp trong cơ sở dữ liệu. Những 
thông tin đã được xác nhận của người dùng có 
thể được lưu trong một biến cookie trong suốt 
phiên làm việc. 
Lưu hành nội bộ Trang 313 
Passport Authentication 
Người dùng được xác nhận bằng các sử dụng 
Passport Service được cung cấp bởi 
Microsoft . Tuy nhiên , khi sử dụng loại xác 
nhận này, chúng ta phải được đăng ký với 
Microsoft‟s Passport Service. Passport server 
sử dụng cơ chế mã hóa cookie để định danh 
và xác nhận tính hợp lệ của người dùng. 
Windows Authentication 
Windows authentication là cách xác nhận 
mặc định của ASP.Net. Loại xác nhận này 
dựa vào các windows account của người 
dùng. Windows authentication trong 
ASP.Net sử dụng II để có thể cấu hình cho 
phép chỉ các người dùng trong Windows 
domain đăng nhập vào ứng dụng. 
 Có 4 tùy chọn được thiết lập trên IIS : 
 Anonymous Authentication : cho phép bất kỳ người dùng truy cập đến ứng dụng 
ASP.Net 
 Basic Authentication : yêu cầu sử dụng tên người dùng và mật khẩu của Windows để 
kết nối đến ứng dụng. Tuy nhiên mật khẩu được truyền trong dạng text đơn giản , do đó loại 
xác nhận này không được an toàn . 
 Digest Authentication : tương tự như Basic Authentication. Tuy nhiên mật khẩu được 
hashed sau đó mới được truyền đi ( gia tăng sự an toàn ). 
 Integrated Windows Authentication : sử dụng Kerberos hoặc giao thức 
change/response để xác nhận người dùng. 
10.2 Thí dụ minh họa 
 Thí dụ : minh họa sử dụng Form-based Authentication trong ứng dụng Web theo yêu 
cầu : người dùng truy cập vào các trang trong thư mục Admin bắt buộc phải đăng nhập , nếu 
không đăng nhập người dùng chỉ có xem danh sách các loại mặt hàng bằng cách truy cập vào 
trang DanhSachLoaiMatHang.aspx 
Lưu hành nội bộ Trang 314 
Bƣớc 1 : Xây dựng 1 ứng dụng Web gồm các trang ASP.Net : CapNhatLoaiMatHang.aspx, 
DanhSachLoaiMatHang.aspx, DangNhap.aspx. Các trang Web này có cấu trúc ứng dụng web 
như hình sau : 
 Hình 10.2Giao diện trang DangNhap.aspx 
Hình 10.3 Giao diện trang CapNhatLoaiMatHang.aspx 
Bƣớc 2 : Cấu hình phần .... trong tập tin Web.config như 
sau : 
Lưu hành nội bộ Trang 315 
 loginUrl : chỉ rõ trang người dùng sẽ đăng nhập 
 defaultUrl : chỉ rõ trang sẽ được chuyển đến nếu đăng nhập thành công. 
 name : chỉ rõ tên Cookie sẽ được tạo 
 timeout : thời gian cookie sẽ tồn tại (tính bằng phút ) 
 passwordFormat : không mã hóa mật khẩu ( password) 
Trong thí dụ này chúng ta khai báo 2 người dùng (user ) có tên đăng nhập là tom và jerry , các 
bạn có thể lưu các user này trong cơ sở dữ liệu để kiểm tra khi đăng nhập 
Bƣớc 3 . Trên cửa sổ Server Explorer , chọn thư mục Admin , từ menu ngữ cảnh của thư mục 
chọn Add | New Item . Cửa sổ Add New Item xuất hiện thêm vào 1 tập tin Web.config để kiểm 
tra việc truy cập cho thư mục này. 
Nội dung của tập tin Web.config trong thư mục Admin: 
Lưu hành nội bộ Trang 316 
Bƣớc 4 . Viết lệnh xử lý các sự kiện cho các trang . 
Trang DangNhap.aspx , các bạn viết lệnh cho nút DangNhap như hình sau : 
Hình 10.4 Phần mã lệnh trang DangNhap.aspx 
Trang CapNhatLoaiMatHang.aspx , các bạn viết thêm vào sự hiện Page_Load và sự kiện cho 
link button Đăng Xuất như hình sau : 
Lưu hành nội bộ Trang 317 
Hình 10.5 Phần mã lệnh trang CapNhatLoaiMatHang.aspx 
Bƣớc 5. Trong cửa sổ Solution Explorer , chọn 
trang CapNhatLoaiMatHang.aspx nhấn phải chuột | 
View in Brower để thi hành trang web.Khi người 
dùng truy cập vào trang này mà chưa đăng nhận thì 
ASP.Net tự động chuyển qua trang DangNhap.aspx 
Kết quả sẽ xuất hiện như sau. 
Lưu hành nội bộ Trang 318 
Hình 10.6 Màn hình hiển thị trang DangNhap.aspx 
Nhập vào Tên đăng nhập : “tom” và Mật khẩu là “tom” sau đó nhấn nút Đăng nhập để vào 
trang CapNhatLoaiMatHang.aspx.Nếu người dùng chọn “Nhớ thông tin này.....” thì trong 
vòng 30 phút có thể truy cập vào trang CapNhatLoaiMatHang.aspx mà không cần phải đăng 
nhập . 
Hình 10.7 Trang cập nhập thông tin mặt hàng 
Sau khi người dùng cập nhật thông tin loại mặt hàng , sau đó nhấp vào Đăng xuất để trở về 
trang DangNhap.aspx khi đó tất cả các thông tin session hay cookie đều được hủy kết thúc 
một phiên làm việc.
Lưu hành nội bộ Trang 319 
Chương 11: GIỚI THIỆU AJAX 
Kết thúc chương này các bạn có thể : 
 Trình bày được kỹ thuật lập trình ASP.Net & Ajax . 
 Mô tả và xây dựng được ứng dụng Ajax ASP.Net với XMLHttpRequest. 
 Mô tả và xây dựng được ứng dụng Ajax ASP.Net với ASPCallBack . 
 Mô tả và xây dựng được ứng dụng Ajax ASP.Net với Ajax Controls : 
 ScriptManager Control, UpdatePanel Control, Timer Controls 
 Mô tả và xây dựng được ứng dụng Ajax ASP.Net với Ajax Controls Toolkits. 
11.1 Giới thiệu AJAX 
AJAX là một công nghệ cho phép lập trình bất đồng bộ trong ứng dụng Web. Thông thường 
người dùng muốn thay đổi thông tin từ trang Web bằng cách nhấp vào các nút lệnh(button) hay 
các liên kết (link) để submit yêu cầu về Web Server để thay đổi nội dung trang Web 
(postback). Như vậy toàn bộ trang Web phải được xử lý lại do đó tốn khá nhiều thời gian và 
gia tăng sự phản hồi các trang Web,.. Công nghệ Ajax ( Asynchronous JavaScript and XML) 
cho phép chỉ các thông tin nào cần thay đổi được gửi về Sever xử lý , sau đó Server sẽ xử lý và 
trả kết quả về cho Client. Sau đây là một vài thông tin chung sẽ giúp chúng ta hiểu hơn về Ajax 
: 
 AJAX bắt đầu phổ biến từ năm 2005 bởi Google (với một ứng dụng Google Suggest, 
Google Maps, Gmail) . 
 AJAX không phải là ngôn ngữ lập trình mới, mà nó là một công nghệ mới để tạo ra một 
ứng dụng web nhỏ hơn, nhanh hơn, tốt hơn và giao diện thân thiện với người dùng hơn. 
 Ajax dựa trên các thành phần HTML trước đây : 
 HTML 
 CSS 
 JavaScript (chủ chốt) 
 XML 
 AJAX là một công nghệ được hổ trợ bởi trình duyệt (browser) và nó độc lập với các 
ứng dụng Web server. 
 Với Ajax, Javascript của bạn có thể liên lạc trực tiếp với Web server bằng cách sử dụng 
đối tượng XMLHttpRequest của Javascript. Với đối tượng này Javascript của bạn có 
thể trao đổi dữ trực tiếp Web server mà không cần đệ trình (submit) toàn bộ dữ liệu 
đến, do đó trang web của bạn không reload lại . 
 Ajax sử dụng cơ chế làm việc bất đồng bộ (Asynchonous), tức là trong khi đối tượng 
XMLHttpRequest thực hiện gửi yêu cầu đến Web server thì Web browser vẫn tiếp tục 
xử lý các công việc khác mà không cần Web server hoàn thành việc trả lời lại yêu cầu 
đó. Nhiều công việc được sử lý song song với nhau, điều này khác với cách lập trình 
web cổ điển trước đây, do đó ứng dụng web sẽ chạy nhanh hơn . 
 Ajax là một kĩ thuật của Web browser và độc lập với Web server 
 Tất cả Web có sử dụng Ajax gọi là Web 2.0 
 Ajax có thể gởi và nhận dữ liệu với nhiều định dạng khác nhau, bao gồm XML, HTML 
và thậm chí là file text . 
11.2 Ajax Làm Việc Nhƣ Thế Nào ? 
Lưu hành nội bộ Trang 320 
Ta hãy phân tích và so sánh cách thức hoạt động của một trang web thông thường và một trang 
web có ứng dụng Ajax để thấy rõ cách thức thực hiện của Ajax . 
Với cách lập trình Web trước đây ( còn gọi là Web 1.0 ) thì khi người dùng cần cập nhật 
thông tin ( click vào một một Button nào đó), thì yêu cầu thay đổi thông tin sẽ được gửi từ phía 
Client về Server dưới dạng HTTP request , toàn bộ trang web sẽ được gửi chứ không riêng gì 
một vài thông tin cần thay đổi (dạng này gọi là postback). Lúc đó Client sẽ rơi vào trạng thái 
chờ (waiting), trong lúc này phía Client không thể thực hiện một công việc nào khác. Khi 
Server xử lý hoàn thành các yêu cầu và thì sẽ gửi trả lại cho phía Client một trang web khác 
thay thế trang cũ (thông tin mà Server response lại ở dạng HTML và CSS). Qui trình này được 
mô tả như sau : 
Hình 11.1 Cách thức hoạt động trang Web thông thường. 
Như vậy ta thấy cách thức hoạt động của 1 trang web cổ điện là : Click waiting .. refresh 
 .Do đó cho dù yêu cầu cập nhật một lượng thong tin nhỏ thì trang web cũng phải load 
lại, do đó cách trang web chạy chậm . 
Với cách lập trình Web có ứng dụng kỹ thuật Ajax thì Ajax cho phép tạo ra một Ajax 
Engine nằm giữa UI (user interface – giao diện người dùng) và Server , tức là nằm giữa giao 
tiếp Client – Server, nhưng phần Ajax Engine này vẫn nằm ở phía Client . 
Hình 11.2 Cách thức hoạt động trang Web có Ajax. 
Khi đó công việc công việc gửi request và nhận response đều do Ajax Engine thực hiện. Thay 
vì trả dữ liệu dưới dạng HTML và CSS trực tiếp cho trình duyệt, Web server có thể gửi trả dữ 
Lưu hành nội bộ Trang 321 
liệu dạng XML và Ajax Engine sẽ tiếp nhận, phân tích và chuyển đổi thành XHTML + CSS 
cho trình duyệt hiển thị. Việc phân tích và chuyển đổi này được thực hiện trên Client nên giảm 
tải rất nhiều cho Server, đồng thời User cảm thấy kết quả xử lý được hiển thị tức thì mà không 
cần nạp lại toàn bộ trang. Mặt khác, sự kết hợp của các công nghệ web như CSS và XHTML 
làm cho việc trình bày giao diện trang web tốt hơn nhiều và giảm đáng kể dung lượng trang 
phải nạp. Đây là những lợi ích hết sức thiết thực mà Ajax đem lại. 
 Ajax Engine chỉ gửi đi những thông tin cần thay đổi chứ không phải toàn bộ trang web, 
do đó giảm được tải qua mạng . 
 Việc gửi request và nhận response do Ajax Engine thực. Do đó phía Browser UI không 
rơi vào trạng thái chờ (waiting), tức là có thể thực hiện nhiều việc cùng lúc 
(Asynchronous). 
Có thể nhìn vào 2 hình sau đây để so sánh hai mô hình ứng dụng Web: truyền thống và sử dụng 
Ajax. 
Hình 11.3 Cách thức hoạt động trang Web không/có Ajax. 
Sau đây là các bước cài đặt Ajax đơn giản, các bước như sau : 
 Phía Client : 
o Viết hàm tạo đối tượng XMLHttpRequest (đối tượng này dùng để gởi 
request đến Server). 
o Viết hàm gởi yêu cầu (request) đến Server. 
Lưu hành nội bộ Trang 322 
o Viết hàm xử lý thông tin sau khi gởi request đến Server. Có thể là thông tin 
lỗi trả về (nếu việc gởi request thất bại) hay là thông tin do Server trả lời lại 
.. 
 Phía Server : 
o Viết hàm xử lý các yêu cầu (request) từ Client gửi đến. 
Thực hiện 
 Viết hàm tạo đối tƣợng XMLHttpRequest. 
o Để bắt đầu viết một ứng dụng web dùng công nghệ Ajax, đầu tiên ta phải 
khởi tạo đối tượng XMLHttpRequest, đối tượng này được dung để gởi 
request đến Server và lấy response từ Server . 
o Tùy trình duyệt mà ta có các cách khởi tạo đối tượng XMLHttpRequest 
khác nhau. 
o Cơ bản ta có 2 loại trình duyệt: 
 Internet Explorer. 
 Mozilla, Firefox, and Netscape Navigator. 
 Khởi tạo đối tƣợng XMLHttpRequest đối với Internet Explorer browser: 
 IE dùng đối tượng ActiveXObject để khởi tạo. 
 Do đó, trước hết phải kiểm tra đối tượng ActiveXObject có tồn tại hay không, ta 
thực hiện như sau: 
 if (window.ActiveXObject) // nếu true thì là IE 
 Ta bắt đầu khỏi tạo đối tượng XMLHttpRequest với ActiveXObject: 
 XHRObject = new ActiveXObject(“Microsoft.XMLHTTP”); 
 Khởi tạo đối tƣợng XMLHttpRequest đối với các browser khác: 
 Các trình duyệt khác dùng đối tượng XMLHttpRequest để khởi tạo. 
 Trước tiên phải kiểm tra đối tượng XMLHttpRequest có tồn tại hay không, ta 
thực hiện như sau: 
 if (window.XMLHttpRequest) // nếu true thì không phải IE 
 Sau đó khởi tạo đối tượng XMLHttpRequest: 
 XHRObject = new XMLHttpRequest(); 
Code đầy đủ để khởi tạo XMLHttpRequest: 
var XHRObject; 
function CreateXMLHttpRequest() 
{ 
 if ( window.ActiveXObject ) //nếu là IE 
 XHRObject=new ctiveXObject(“Microsoft.XMLHTTP”); 
 else if ( window.XMLHttpRequest ) //Mozilla, FireFox,. 
 XHRObject = new XMLHttpRequest(); 
} 
 Viết hàm gởi yêu cầu (request) đến Server. 
Lưu hành nội bộ Trang 323 
Sau khi ta đã khởi tạo đối tượng XMLHttpRequest, ta dùng các phương thức open(), 
send() và thuộc tính onreadystatechange của đối tượng XMLHttpRquest để thực hiện 
gởi request đến Server, ta thực hiện theo các bước sau : 
Mở một request tới server bằng hàm open(): 
 open(“method”,“URL”[,asyncFlag[,“userName”[,“password”]]]) 
o Chú giải: 
o method: Phương thức HTTP được dùng để mở một kết nối, Thí dụ GET 
hoặc POST 
o GET: với giao thức này ta có thể dùng để lấy dữ liệu từ phía Server mà 
không cần send bất kì thông tin nào lên Server. Mặc khác giao thức này có 
mục đích giảm thiểu giao tiếp không cần thiết qua mạng bằng việc cached 
tất cả thông tin trả về từ web Server, cho nên những lần sau khi cần lấy dữ 
liệu cũ thì sẽ giảm thiểu việc truyền thông tin qua mạng bằng cách lấy dữ 
liệu từ cached. 
o POST: Với giao thức này ta bắt buộc phải truyền thông tin từ Client lên 
Server trong khi gởi request, Thí dụ như : id=tên Mặc khác khi dùng giao 
thức này thì dữ liệu response từ Server sẽ không được cached, do đó cho dù 
có request dữ liệu cũ hay mới thì nó đều phải gởi thông tin của form lên web 
server và lấy dữ liệu mới về. 
o URL: Đường dẫn URL request đến server 
o asyncFlag: Cách gọi là đồng bộ hay bất đồng bộ, nếu asyncFlag = true: bất 
đồng bộ (asynchronous), ngược là là đồng bộ (synchronous). Mặc định 
asyncFlag = true 
o userName: Tên đăng nhập tới Server (nếu server yêu cầu) 
o password: Mật khẩu tới Server (nếu server yêu cầu) 
Lưu ý: các tham số trong cặp ngoặc [ ] là optional, nghĩa là có thể có hoặc 
không 
Thí dụ : XHRObject.open(“GET”,”trang2.aspx”,true); 
 XHRObject.open(“POST”,”trang2.aspx”,true); 
 (chú ý : GET và POST phải viết bằng chữ in hoa) 
Khai báo hàm sẽ xử lý dữ liệu trả về từ Server với thuộc tính onreadystatechange : 
 XHRObject.onreadystatechange = handleStateChanged; 
 Ta có thể đặt handleStateChanged thành một tên khác bất kỳ .Đây là một con trỏ 
sẽ trỏ tới hàm có tên tương ứng để xử lý dữ liệu khi Server response lại . 
Kế đến ta thực hiện gởi request đến Server với phương thức send() : 
 XHRObject.send(null); 
 Nếu trong hàm open() ta dùng method Get, thì tr ... .master Qui định layout chính cho 
các trang mà người dùng 
xem 
Admin.master Qui định layout cho các 
trang cho người dùng có 
quyền admin vào quản lý 
website 
User Control AmazonProductList.ascx 
AmazonSearch.ascx 
CartSumary.ascx 
CartSumary2.ascx 
CategoriesList.ascx 
DepartmentsList.ascx 
eBayProductList.ascx 
eBaySearch.ascx 
Menu.ascx 
Pager.ascx 
ProductList.ascx 
SearchBook.ascx 
UserInfo.ascx 
Web page AccountManager.aspx 
AdminDepartment.aspx 
AdminOrderDetails.aspx 
AdminOrder.aspx 
AdminProductDetails.aspx 
AdminProducts.aspx 
Catalog.aspx 
Checkout.aspx 
CheckoutInfo.aspx 
ConfirmCheckoutInfo.aspx 
Default.aspx 
Login.aspx 
ShoppingCart.aspx 
Lưu hành nội bộ Trang 476 
Trong phần này chúng ta không đi vào xây dựng chi tiết từng webpage mà chỉ trình bày bố cục 
các Master Page và một số User Control 
Master Page: 
Logo, banner 
SearchBook.ascx 
UserInfo.ascx 
Menu.ascx ContentPlaceHolder 
CartSumary.ascx 
AmazonSearch.ascx 
eBaySearch.ascx 
Info 
Lưu hành nội bộ Trang 477 
Admin.master 
UserInfo.ascx Logo, banner 
ContentPlaceHolder 
Pager.ascx 
1. Thêm một Web User Control mới có tên là Pager vào thư mục UserControls (chọn with 
a code behind file). 
2. Ở phần Source View, thiết kế như đoạn mã sau: 
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Pager.ascx.cs" 
Inherits="UserControl_Pager" %> 
 Trang  # 
 trong số 
  trang 
| 
Trước 
 ' 
NavigateUrl=''/> 
Tiếp 
3. Chuyển qua Design View, control của chúng ta sẽ như sau: 
4. Ở file code behind điều chỉnh phần code như sau: 
using System; 
public struct PageUrl 
{ 
 private string page; 
Lưu hành nội bộ Trang 478 
 private string url; 
 // Page and Url property definitions 
 public string Page 
 { 
 get 
 { 
 return page; 
 } 
 } 
 public string Url 
 { 
 get 
 { 
 return url; 
 } 
 } 
 // constructor 
 public PageUrl(string page, string url) 
 { 
 this.page = page; 
 this.url = url; 
 } 
} 
public partial class UserControl_Pager : System.Web.UI.UserControl 
{ 
 protected void Page_Load(object sender, EventArgs e) 
 { 
 } 
 private const int half = 5; 
 public void Show(int currentPage, int howManyPages, string firstPageUrl, string 
pageUrlFormat, bool showPages) 
 { 
 if (howManyPages > 1) 
 { 
 this.Visible = true; 
 currentPageLabel.Text = currentPage.ToString(); 
Lưu hành nội bộ Trang 479 
 howManyPagesLabel.Text = howManyPages.ToString(); 
 if (currentPage == 1) 
 { 
 previousLink.Enabled = false; 
 } 
 else 
 { 
 previousLink.NavigateUrl = (currentPage == 2) ? 
 firstPageUrl : String.Format(pageUrlFormat, currentPage - 1); 
 } 
 if (currentPage == howManyPages) 
 { 
 nextLink.Enabled = false; 
 } 
 else 
 { 
 nextLink.NavigateUrl = String.Format(pageUrlFormat, currentPage + 1); 
 } 
 if (showPages) 
 { 
 PageUrl[] pages = new PageUrl[half*2]; 
 if (currentPage > half) 
 { 
 int i = currentPage - half; 
 pages[0] = new PageUrl(i.ToString(), string.Format(pageUrlFormat, i)); 
 int count = 1; 
 i++; 
 while ((i < currentPage + half ) && (i <= howManyPages)) 
 { 
 pages[count] = new PageUrl(i.ToString(), string.Format(pageUrlFormat, i)); 
 count++; i++; 
 } 
 pages[5] = new PageUrl((currentPage).ToString(), ""); 
 } 
 else 
Lưu hành nội bộ Trang 480 
 { 
 pages[0] = new PageUrl("1",firstPageUrl); 
 int i = 2; 
 while ((i <= half + currentPage - 1) && (i <= howManyPages)) 
 { 
 pages[i-1] = new PageUrl(i.ToString(), string.Format(pageUrlFormat, i)); 
 i++; 
 } 
 pages[currentPage - 1] = new PageUrl((currentPage).ToString(), ""); 
 } 
 pagesRepeater.DataSource = pages; 
 pagesRepeater.DataBind(); 
 } 
 } 
 } 
} 
ProductsList.ascx 
1. Thêm một Web User Control vào thư mực UserControls, đặt tên là ProductsList 
2. Mở Design View và kéo thả một Pager từ Solution Explore vừa được xây dựng ở trên 
vào ProductsList control. 
3. Tiếp tục kéo vào một đối tượng DataList vào ProductsList. 
4. Tiếp tục kéo vào một Pager khác vào cuối của ProductsList. 
5. ở phần Source sẽ được chỉnh sửa lại như sau: 
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ProductsList.ascx.cs" 
Inherits="UserControl_ProductsList" %> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" 
TagPrefix="cc1" %> 
 var ModalProgress = ''; 
 Chọn loại tiền: 
 <asp:DropDownList ID="ddlCurrency" runat="server" 
DataSourceID="SqlDataSource1" AutoPostBack="true" 
 DataTextField="QuocGia" DataValueField="DonVi" 
Lưu hành nội bộ Trang 481 
 onselectedindexchanged="ddlCurrency_SelectedIndexChanged" Font-Size="14px"> 
 <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
 ConnectionString="" 
 SelectCommand="SELECT DonVi, QuocGia, ThongDung FROM tblTienTe 
ORDER BY ThongDung DESC, DonVi"> 
 <div style="position: relative; top: 2%; text-align: center; left: 4px; height: 70px; width: 
150px;"> 
 Vui lòng chờ.... 
<cc1:ModalPopupExtender ID="ModalProgress" runat="server" 
TargetControlID="panelUpdateProgress" 
 BackgroundCssClass="modalBackground" PopupControlID="panelUpdateProgress" /> 
 <asp:DataList ID="list" runat="server" RepeatColumns="3" 
 DataKeyField="MaSanPham" onitemcommand="list_ItemCommand" 
 onitemdatabound="list_ItemDataBound"> 
 <asp:HyperLink ID="hplnkName" Height="30px" runat="server" 
NavigateUrl='' Text='<%# 
HttpUtility.HtmlEncode(Eval("TenSanPham").ToString()) %>'> 
Lưu hành nội bộ Trang 482 
 <td style="padding-left:10px;border-left-color:Green; border-left-style:solid; 
border-left-width:1px"> 
 <a href="<%# LinkBuilder.ToProduct(Eval("MaSanPham").ToString()) 
%>"> 
 <img width="100px" height="110px" src="<%# 
LinkBuilder.ToProductImage(Eval("Thumbnail").ToString()) %>" border="0" alt="<%# 
HttpUtility.HtmlEncode(Eval("TenSanPham").ToString())%>"><br style="line-
height:9px"> 
 <%# 
HttpUtility.HtmlEncode(Eval("MoTaSanPham").ToString()) %> 
 <asp:LinkButton ID="btnAddToCart" runat="server" Text="Thêm vào 
giỏ" Width="100px"> 
 <td style="padding-left:10px;border-left-color:Green; border-left-style:solid; 
border-left-width:1px"> 
 ' 
/> 
 <asp:Label ID="lblPrice" runat = 
"server" Text=''> 
Lưu hành nội bộ Trang 483 
 <td colspan="6" style="background:url(images/1_bg1.gif); width:1px; 
height:1px"> 
 var lblprice,ddlist,hidden; 
 function Select1_onchange(seft,lblPrice,hd) { 
 lblprice = lblPrice; 
 ddlist = seft; 
 hidden = hd; 
CurrencyService.GetCurrency(lblPrice,document.getElementById(hd).value,seft.value,Comple
te,Error); 
 } 
 function Error(result) 
 { 
 ddlist.value = "USD"; 
 alert("Vui lòng thử lại sau"); 
 } 
 function Complete(result) 
 { 
 document.getElementById(lblprice).innerHTML= result; 
 } 
6. chỉnh sửa lại file ProductsList.ascx.cs: 
using System; 
Lưu hành nội bộ Trang 484 
using System.Collections; 
using System.Web.UI.WebControls; 
using System.Globalization; 
using CurrencyWS; 
public class MyCompareClass : IComparer 
{ 
 int IComparer.Compare(Object x, Object y) 
 { 
 return (string.Compare(x.ToString(), y.ToString())); 
 } 
} 
public partial class UserControl_ProductsList : System.Web.UI.UserControl 
{ 
 private void InitializeComponent() 
 { 
 } 
 protected void Page_Load(object sender, EventArgs e) 
 { 
 if (!IsPostBack) 
 { 
 InitCurrencyRate(); 
 PopulateControls(); 
 } 
 } 
 private void InitCurrencyRate() 
 { 
 if (Session["BookStoreCurrency"] == null) 
 { 
 hdRate.Value = "1"; 
 ddlCurrency.SelectedIndex = 0; 
 Session["BookStoreCurrency"] = "0,USD"; 
 } 
 else 
 { 
 string[] CurrencyInfo = (Session["BookStoreCurrency"].ToString()).Split(','); 
 ddlCurrency.SelectedIndex = Int32.Parse(CurrencyInfo[0]); 
 CurrencyConvertor currencyConvertor = new CurrencyConvertor(); 
 if (CurrencyInfo[1] != "USD") 
 try 
 { 
 hdRate.Value = (currencyConvertor.ConversionRate(Currency.USD, 
(Currency)Enum.Parse(typeof(Currency), CurrencyInfo[1]))).ToString(); 
 } 
 catch 
 { 
 ddlCurrency.SelectedIndex = 0; 
 hdRate.Value = "1"; 
 } 
 else 
Lưu hành nội bộ Trang 485 
 hdRate.Value = "1"; 
 } 
 } 
 private void PopulateControls() 
 { 
 string departmentId = Request.QueryString["DepartmentID"]; 
 string categoryId = Request.QueryString["CategoryID"]; 
 string page = Request.QueryString["Page"]; 
 string searchString = Request.QueryString["Search"]; 
 string dpId = Request.QueryString["dpid"]; 
 if (page == null) page = "1"; 
 int howManyPages = 1; 
 string firstPageUrl = ""; 
 string pagerFormat = ""; 
 string currentpage = Request.AppRelativeCurrentExecutionFilePath; 
 if (String.Compare(currentpage, "~/NewestProducts.aspx", true) == 0) 
 { 
 DateTime from = new DateTime(2009,10,1,12,0,0); 
 list.DataSource = CatalogAccess.GetNewestProducts(from, 
DateTime.Now,OnlineStoreConfigurations.ProductDescriptionLength,Int32.Parse(page),Onlin
eStoreConfigurations.ProductsPerPage,out howManyPages); 
 list.DataBind(); 
 firstPageUrl = LinkBuilder.ToNewestProducts("1"); 
 pagerFormat = LinkBuilder.ToNewestProducts("{0}"); 
 } 
 else 
 if (String.Compare(currentpage, "~/BestSellerProducts.aspx", true) == 0) 
 { 
 list.DataSource = 
CatalogAccess.GetBestSellerProducts(OnlineStoreConfigurations.ProductDescriptionLength, 
Int32.Parse(page), OnlineStoreConfigurations.ProductsPerPage, out howManyPages); 
 list.DataBind(); 
 firstPageUrl = LinkBuilder.ToBestSellerProducts("1"); 
 pagerFormat = LinkBuilder.ToBestSellerProducts("{0}"); 
 } 
 else 
 if (searchString != null) 
 { 
 string allWords = Request.QueryString["AllWords"]; 
 list.DataSource = CatalogAccess.Search(searchString, dpId, Int32.Parse(page), 
OnlineStoreConfigurations.ProductsPerPage,out howManyPages); 
 list.DataBind(); 
 // Display pager 
 firstPageUrl = LinkBuilder.ToSearch(searchString, dpId, "1"); 
 pagerFormat = LinkBuilder.ToSearch(searchString, dpId, "{0}"); 
 if (list.Items.Count == 0) 
 lblError.Text = "Không có sản phẩm nào"; 
Lưu hành nội bộ Trang 486 
 } 
 else 
 if (categoryId != null) 
 { 
 list.DataSource = CatalogAccess.GetProductsInCategory(categoryId, page, out 
howManyPages); 
 list.DataBind(); 
 firstPageUrl = LinkBuilder.ToCategory(departmentId, categoryId, "1"); 
 pagerFormat = LinkBuilder.ToCategory(departmentId, categoryId, "{0}"); 
 } 
 else 
 if (departmentId != null) 
 { 
 list.DataSource = CatalogAccess.GetProductsOnDeptPromo(departmentId, 
page, out howManyPages); 
 list.DataBind(); 
 firstPageUrl = LinkBuilder.ToDepartment(departmentId, "1"); 
 pagerFormat = LinkBuilder.ToDepartment(departmentId, "{0}"); 
 } 
 else 
 { 
 list.DataSource = CatalogAccess.GetProductsOnFrontPromo(page, out 
howManyPages); 
 list.DataBind(); 
 howManyPages = 1; 
 } 
 topPager.Show(int.Parse(page), howManyPages, firstPageUrl, pagerFormat, true); 
 bottomPager.Show(int.Parse(page), howManyPages, firstPageUrl, pagerFormat, true); 
 } 
 protected void list_ItemCommand(object source, 
System.Web.UI.WebControls.DataListCommandEventArgs e) 
 { 
 DataListItem items = e.Item; 
 string productId = list.DataKeys[e.Item.ItemIndex].ToString(); 
 ShoppingCartAccess.AddToShoppingCart(productId); 
 Response.Redirect(Request.RawUrl); 
 } 
 public string FormatCurrency(double price) 
 { 
 NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat; 
 return price.ToString("N",nfi); 
 } 
 protected void list_SelectedIndexChanged(object sender, EventArgs e) 
 { 
 } 
 protected void list_ItemDataBound(object sender, DataListItemEventArgs e) 
 { 
Lưu hành nội bộ Trang 487 
 Label lblPrice = e.Item.FindControl("lblPrice") as Label; 
 HiddenField hd = e.Item.FindControl("hd") as HiddenField; 
 NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat; 
 double dprice = Double.Parse(hd.Value) * Double.Parse(hdRate.Value); 
 lblPrice.Text = dprice.ToString("N", nfi) + " " + 
(Session["BookStoreCurrency"].ToString()).Split(',')[1]; 
 //} 
 } 
 protected void ddlCurrency_SelectedIndexChanged(object sender, EventArgs e) 
 { 
 if (ddlCurrency.SelectedValue != "USD") 
 { 
 try 
 { 
 CurrencyConvertor currencyConvertor = new CurrencyConvertor(); 
 hdRate.Value = (currencyConvertor.ConversionRate(Currency.USD, 
(Currency)Enum.Parse(typeof(Currency), ddlCurrency.SelectedValue))).ToString(); 
 } 
 catch 
 { 
 hdRate.Value = "1"; 
 ddlCurrency.SelectedIndex = 0; 
 lblError.Text = "Có lỗi trong quá trình chuyển đổi, vui lòng thử lại sau!"; 
 } 
 } 
 else 
 { 
 hdRate.Value = "1"; 
 } 
 Session["BookStoreCurrency"] = 
ddlCurrency.SelectedIndex.ToString()+","+ddlCurrency.SelectedValue; 
 PopulateControls(); 
 Response.Redirect(Request.RawUrl); 
 } 
} 
Mỗi khi ProductsList được load lại sẽ căn cứ vào query string đễ láy được danh sách sản 
phẩm tương ứng. Như vậy, khi muốn load danh sách sản phẩm cho một trang nào đó trên 
website thì ta chỉ cần sử dụng ProductsList User control này. 
Sau đây là một số giao diện chính của website: 
Lưu hành nội bộ Trang 488 
1. Trang chủ 
Ở trang này người dùng có thể xem các loại sách, đăng nhập, đăng ký, tìm kiếm 
Thanh tìm 
kiếm sách 
Thông tin về sách 
như tên sách, hình 
ảnh, giá tiền 
Các thể loại 
sách chính 
Service chuyển 
đổi tiền tệ 
Thông tin 
đăng nhập 
Lưu hành nội bộ Trang 489 
2. Trang đăng ký 
Cho phép người dùng đăng ký một tài khoản để có thể sử dụng đầy đủ các chức năng của 
trang web. 
Các thông tin cần thiết khi 
người dùng đăng ký tài khoản 
Lưu hành nội bộ Trang 490 
3. Trang đăng nhập 
 Người dùng phải nhập chính xác thông tin tài khoản và mật khẩu. 
Nếu người dùng đăng nhập thành công. 
Thông tin về sách 
như tên sách, hình 
ảnh, giá tiền 
Chào mừng tài khoản đã 
đăng nhập thành công 
Trang quản lý tài 
khoản của người dùng 
Lưu hành nội bộ Trang 491 
4. Trang các loại sách 
 Sách Khoa học 
Thông tin về sách thuộc 
thể loại Khoa Học 
Các thể loại 
sách con 
Lưu hành nội bộ Trang 492 
5. Trang chi tiết sản phẩm 
Các loại tiền tệ có thể chuyển đổi: 
Thêm sản phẩm 
vào giỏ hàng 
Tên sách 
Tìm sản phẩm 
tương tự trên 
Amazon 
Tìm sản phẩm 
tương tự trên Ebay Chuyển đổi tiền tệ 
Lưu hành nội bộ Trang 493 
Những sản phẩm tương tự trên Amazon 
Lưu hành nội bộ Trang 494 
 Những sản phẩm tương tự trên Ebay 
Lưu hành nội bộ Trang 495 
6. Trang quản lý tài khoản user 
Lưu hành nội bộ Trang 496 
7. Trang giỏ hàng 
Tiếp tục quá trình 
mua sách Tới trang đặt hàng 
Lưu hành nội bộ Trang 497 
8. Trang đặt hàng 
Service chuyển 
đổi tiền tệ 
Chuyển lên trang PayPal 
để thanh toán 
Lưu hành nội bộ Trang 498 
9. Trang quản lý 
 Quản lý đơn đặt hàng 
Các loại sách 
Thêm loại sách 
Các thực đơn 
chức năng 
Lưu hành nội bộ Trang 499 
Các tài liệu tham khảo 
1. Giáo trình ngôn ngữ C# 
2. Apress - Pro C# 2008 and the NET 3.5 Platform Fourth Edition 
3. Kỹ Thuật Lập trình C# 
4. Apress - Pro C# 2008 and the NET 3.5 Platform Fourth Edition 
5. Apress.Pro.LINQ.Language.Integrated.Query.in.C.Sharp.2008 
6. Apress.Pro ASP.NET 3.5 in C# 2008 
7. Lập trinh ASP.NET Tập 5.Quyển 3. Phạm Hữu Khang 

File đính kèm:

  • pdfgiao_trinh_asp_net_phan_2.pdf