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