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.
Tóm tắt nội dung tài liệu: 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:
giao_trinh_asp_net_phan_2.pdf

