Vnamese Aspnet

  • October 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Vnamese Aspnet as PDF for free.

More details

  • Words: 70,058
  • Pages: 220
1 Yêu cầu hệ thống của ASP.NET. •

Windows 2000 Server or Advanced Server with Service Pack 2 .



Windows XP Professional or 64-Bit Edition



MDAC 2.7 for Data



Internet Information Services

Ghi chú:  Khi tạo XML Web Sevices yêu cầu hệ thống giống như ASP.NET.  Yêu cầu hệ thống cho client sử dụng XML Web Services là phải có Microsoft .NET Framework.

2 Giới thiệu về ASP.NET 2.1

ASP.NET là phiên bản kế tiếp của Active Server Page (ASP); nó là một nền phát triển ứng dụng Web hợp nhất, cung cấp nhiều dịch vụ cần thiết cho lập trình viên xây dựng các lớp ứng dụng chuyên nghiệp. Cú pháp ASP.NET tượng thích với cú pháp ASP, ngoài ra ASP.NET còn cung cấp một mô hình lập trình mới, nền tảng an toàn (secure), linh hoạt (scalable),và ổn ñịnh (stable). Sẽ cảm thấy dễ chịu khi nâng cấp ứng dụng ASP hiện có, bằng cách ñưa vào các hàm ASP.NET cho chúng (lời của MS).

2.2

ASP.NET là biên dịch, dựa trên môi trường .NET và có thể xây dựng bằng bất cứ ngôn ngữ nào tương thích .NET, bao gồm Visual Basic .NET, C#, and JScript .NET. Ngoài ra, toàn bộ thư viện .NET Framework có thể sử dụng với ứng dụng ASP.NET, lập trình viên tận dụng dễ dàng những lợi ích của các kỹ thuật ñược cung cấp, bao gồm quản lý môi trường thực thi ngôn ngữ cung (common language runtime), kiểu an toàn (type safety), kế thừa (inheritance), .v.v.

2.3

ASP.NET ñược thiết kế làm việc với các trình soạn thảo WYSIWYG HTML ñi kèm và các công cụ lập trình khác ñược ñưa vào trong Microsoft Visual .NET. Tất cả các công cụ này không phài chỉ dùng ñể phát triển ứng dụng Web ñược dễ dàng, tuy nhiên có thể sử dụng một vài chức năng thông thường cho ứng dụng Web, bao gồm một GUI cho phép lập trình viên có thể dễ dàng ñặt các server control vào trang web (web page), và một trình debug rất mạnh mẽ.

2.4

Khi tạo một ứng dụng Web lập trình viên có thể chọn Web Forms hoặc Web Services, ngoài ra cũng có thể kết hợp hai loại này với nhau theo bất kỳ cách nào. Cà hai loại này có một nền cơ bản, cho phép sử dụng authentication schemes, cache frequently used data, hoặc chỉnh sửa cấu hình ứng dụng (customize application’s configuration). Tuy nhiên mỗi loại có một vài khả năng riêng:

2.4.1

Web Forms cho phép xây dựng các form có nội dung phong phú (powerful forms) trên trang Web (Web Page). Khi xây dựng các form có thể sử dụng các server control

Created by THÁI NGỌC DUY MSDN based-written.

1 4/12/2007

ñể tạo các thành phần UI thông dụng và lập trình cho chúng một vài chức năng thông dụng, những control này cho phép xây dựng nhanh chóng các form chỉ dùng một lần (out of reusable built-in), hoặc các custom component, làm ñơn giản mã của trang web (simplifying the code of a page).

2.5

Một XML Web Service cung cấp ñiều kiện (mean) ñể truy cập các hàm ở server từ xa. Khi sử dụng Web Service, trong kinh doanh người ta có thể ñưa ra các giao diện lập trình ñược cùng với dữ liệu, hoặc kết quả kinh doanh, những cái này có thể ñược nhận, hiệu chỉnh bởi các ứng dụng client và server. Web Server cho phép trao ñổi dữ liệu theo hai kịch bản (scenarios) client-server và server-client, sử dụng chuẩn HTTP và thông diệp XML (XML messaging) ñể di chuyển dữ liệu qua tường lữa (firewall). XML Web Service có thể ñược viết bằng mọi ngôn ngữ lập trình, sử dụng mọi mô hình thành phần (component model), và có thể chạy trên bất kỳ hệ ñiều hành nào có thể truy cập XML Web Services.

2.6

Mô hình (model) Web Forms và Web Services ñều có tất cả các ñặt tính của ASP.NET, ñó là sức mạnh của .NET Framework và .NET Framework Common Lanuage Runtime. Các tính chất và cách sử dụng có thể ñược phát thảo như sau:

2.6.1

Với người ñã có kỹ năng lập trình ASP thì mô hình lập trình mới ASP.NET sẽ rất gần gũi. Tuy là như vậy nhưng ASP.NET ñã có những thay ñổi rất ñặc biệt so với ASP, ASP.NET ñã có cấu trúc hơn và hướng ñối tượng. Thật ñáng tiết, ñiều này có nghĩa là tất cả các trang ASP ñã tồn tại ñều phải ñược chỉnh sửa một vài nơi ñể có thể chạy dưới ASP.NET. Ngoài ra, Visual Basic và Visual Basic.NET ñã có một sự khác biệt rất lớn, ñiều này có nghĩa là các trang ñược viết bằng Visual Basic Scripting Edition sẽ không thể chuyển trực tiếp sang ASP.NET, cần thiết phải có một số thay ñổi nhất ñịnh ñể có thể chuyển sang ASP.NET. ðể có thêm thông tin về vấn ñề này hãy xem mục Migrating from ASP to ASP.NET trong MSDN.

2.6.2

Truy cập database là kỹ thuật thường ñược sử dụng ñể hiển thị dữ liệu trên trang Web của khách (visitor). Với ASP.NET, việc quản lý (manage) database sẽ khá dễ dàng thông qua code. ðể có nhiều thông tin hơn về vấn ñề này xin xem mục Accessing Data with ASP.NET.

2.6.3

ASP.NET cung cấp một mô hình ñơn giản ñể lập trình viên Web có thể làm việc như trên một ứng dụng thông thường. Lập trình viên có thể viết mã ngay trong file văn bản global.asax, hoặc là trong một class ñược biên dịch, ñược triễn khai như là một assembly, và có thể ñưa vào các sự kiện mức ứng dụng. Ngoài ra người lập trình còn có thể mở rộng mô hình ñể thích hợp cho nhu cầu của từng ứng dụng. ðể có nhiều thông tin hơn hãy xem mục ASP.NET Application trong MSDN.

2.6.4

ASP.NET tạo ra những chương trình dễ sử dụng và những session-state facility gần gủi với lập trình viên ASP và sẳn sàng tương thích với tất cả các giao diện lập trình .NET Framework khác (other .NET Framework APIs). ðể có nhiều thông tin hơn xin xem mục ASP.NET State Management trong MSDN.

2.6.5

ðối với những lập trình viên cao cấp, người muốn sử dụng những giao diện lập trình mạnh như giao diện ISAPI (có trong ASP), ASP.NET giới thiệu hai giao diện: IhttpHandler và IhttpModule. Cài ñặt giao diện IHttpHandler cho phép chương trình tương tác với các yêu cầu mức thấp (low-level request) và những dịch vụ hồi báo (response services) của IIS Web Services và cung cấp một vài chức năng giống với

Created by THÁI NGỌC DUY MSDN based-written.

2 4/12/2007

phần mở rộng ISAPI, nhưng với một mô hình lập trình rất ñơn giản. Cài ñặt giao diện IhttpModule cho phép lập trình viên ñưa vào những customize event riêng trong mỗi yêu cầu (request) sinh ra trong ứng dụng. ðể có nhiều thông tin hơn về vấn ñề này hãy xem mục HTTP Runtime Support.

2.6.6

ASP.NET có ñược những chất lượng thực thi ñược tìm thấy trong .NET Framework và thực thi ngôn ngữ chung (common language runtime). Ngoài ra ASP.NET ñã ñược thiết kế cho mục ñích nâng cao khả năng thực thi vượt qua ASP và tất cả các nền ứng dụng Web khác (Lời của MS).

2.6.7

Tất cả mã của ASP.NET ñều ñược biên dịch, việc này cho phép kết hợp dễ (early binding), kiễu mạnh (strong type), trình biên dịch tức thời (JIT) tương thích native code. Ngoài ra ASP.NET còn cung cấp catch mở rộng cho lập trình viên có thể tối ưu hóa ứng dụng trong một vài trường hợp.

2.6.8

Tạo ñược các câu lệnh debug (custom debug statements) cho trang web, nó rất hữu ích trong khi giãi quyết sự cố (troubleshooting).

2.6.9

Nền .NET Framework và ASP.NET cung cấp sơ ñồ (schemes) chứng nhận(authentication) và cấp phép (authorization) cho ứng dụng Web, có thể dễ dàng xóa, thêm, hiệu chỉnh sơ ñồ.

2.6.10 Cấu hình ứng dụng ASP.NET ñược lưu trữ trong các tập tin XML chuẩn, hiệu chỉnh dễ dàng , và có thể mở rộng ñể phù hợp cho nhu cầu của từng ứng dụng Web.

Created by THÁI NGỌC DUY MSDN based-written.

3 4/12/2007

3 Ứng dụng ASP.NET. Khái quát.

3.1

Một ứng dụng ASP.NET ñược ñịnh nghĩa là tất cả những tập tin, những ñiều khiển (handler), những module và mã thực thi (executable code) có thể ñược gọi từ một cây thư mục ảo (virtual directory) trên ứng dụng Web Server. Có thể sử dụng mọi mô hình lập trình ASP.NET (ASP.NET programming models) trong ứng dụng. Tất cả chúng phải cùng tồn tại trong một cấu trúc thư mục ảo riêng lẻ.

3.2 3.2.1

Tập tin Global.asax. Tập tin Global.asax, còn ñược hiểu như tập tin ứng dụng ASP.NET, là một tập tin tùy chọn chứa mã ñể ñáp ứng (responding) những sự kiện mức ứng dụng (application-level events) ñược phát ra bởi ASP.NET hoặc những module HTTP. Tập tin Global.asax ñược ñặt tại thư mục gốc (root directory) của một ứng dụng ASP.NET. Khi ứng dụng chạy (run), tập tin Global.asax ñược phân tích và biên dịch thành một lớp class .NET Framework dẫn xuất từ lớp HttpApplication. Bản thân tập tin Global.asax ñược cấu hình ñể từ chối bất kỳ yêu cầu URL trực tiếp nào; người sử dụng bên ngoài (external users) không thể download hoặc xem mã ñược viết bên trong nó.

Created by THÁI NGỌC DUY MSDN based-written.

4 4/12/2007

3.2.2

Tập tin Global.asax của ASP.NET có thể cùng tồn tại với tập tin Global.asa của ASP. Có thể tạo tập tin Global.asax bằng trình thiết kế WYSIWYG, bằng Notepad, hoặc như là một lớp ñược biên dịch thành assambly ñặt trong thư mục \bin là thư mục con của thư mục ứng dụng.

3.2.3

Tập tin Global.asax là một tùy chọn, nếu không ñịnh nghĩa tập tin Global.asax thì framework (ASP.NET page framework) sẽ xem như (assumes) không có bất kỳ một event application handler và event session handler nào ñược ñịnh nghĩa.

3.2.4

Nếu nội dung tập tin Global.asax bị thay ñổi trong lúc ứng dụng ASP.NET ñang hoạt ñộng thì ASP.NET Page Framework sẽ tự ñộng dò tìm sự thay ñổi này. Nó sẽ thực hiện xong tất cả những yêu cầu hiện tại, gởi sự kiện Application_OnEnd ñến tất cả những bộ lắng nghe (listeners), và khởi ñộng lại miền ứng dụng (application domain). Trong thực tế, ứng dụng này ñược khởi ñộng lại, ñóng tất cả những browse sesstion, xóa (flushing) tất cả những thông tin trạng thái. Khi có yêu cầu kế tiếp ñến từ browse, ASP.NET page framework sẽ phân tích và biên dịch lại tập tin Global.asax thành ñối tượng trong bộ nhớ và phát ra sự kiện Application_OnStart.

Làm việc với thực thể HttpApplication.

3.3 

Trong suốt thời gian sống của ứng dụng, ASP.NET duy trùy một số thực thể Global.asax chung dẫn xuất từ lớp HttpApplication. Khi ứng dụng ASP.NET nhận một yêu cầu HTTP thì ASP.NET page framework sẽ chỉ ñịnh một trong những ñối tượng này ñể xử lý yêu cầu. Mỗi thực thể HttpApplication chịu trách nhiệm quản lý suốt thời gian sống của yêu cầu mà nó ñược chỉ ñịnh quản lý, và thực thể chỉ ñược sử dụng lại (reused) cho yêu cầu khác sau khi nó ñã xử lý xong yêu cầu hiện tại.



Lớp HttpApplication cho phép lập trình (overriding) truy xuất (access) các phương thức (method), cũng như những sự kiện Application_OnStart và Application_OnEnd. Ngoài ra, nó còn cho phép truy xuất ñến bất kỳ sự kiện nào ñược ñưa ra (exposed) bởi các module HTTP.

3.3.1

Lập trình lại (Overriding) phương thức Init và Dispose.

3.3.1.1 Phương thức HttpApplication.Init ñược gọi ngay sau khi một thực thể (instance) của lớp HttpApplication ñược tạo (sau khi tất cả các module quản lý sự kiện ñã ñược add vào). Có thể sử dụng phương thức này ñể tạo và cấu hình bất kỳ ñối tượng nào ñược sử dụng xuyên suốt (across) trong tất cả các thao tác xử lý sự kiện. Ví dụ: <script language="C#" runat="server"> public override void Init() { // ñặt các ñoạn mã thật sự cần thiết ở ñây. }

Chú ý: 

 

<script language="C#" runat="server"> diễn tả: sử dụng ngôn ngữ C# làm ngôn ngữ script(language="C#"), nơi thực thi script là server (runat="server"). Ví dụ phía trên viết ñể ñặt vào tập tin .aspx. ðể tận dụng sức mạnh của IDE và phương pháp lập trình mới, khi lập trình ta sẽ không lập trình lại phương thức Init() trong tập tin Global.asax, thay vào ñó ta sẽ làm ngay trong lớp Global ñược dẫn xuất từ lớp HttpApplication. Các ví dụ minh họa cho việc overriding các phương thức sẽ ñược thực hiện theo phương pháp này.

Created by THÁI NGỌC DUY MSDN based-written.

5 4/12/2007

3.3.1.2 Phương thức Init không giống với sự kiện Application_OnStart, bởi ví nó luôn luôn ñược gọi trong tất cả các thực thể HttpApplication trong phạm vi một ứng dụng. Sự kiện Application_OnStart chỉ ñược phát ra một lần trong suốt cuộc sống của ứng dụng, khi thực thể (instance) HttpApplication ñầu tiên ñược tạo. Chỉ sử dụng sự kiện Application_OnStart ñể tạo và hiệu chỉnh (modify) những trạng thái (state) ñược chia sẽ bởi tất cả những thực thể pipeline, như là ñối tượng ApplicationState. Không sử dụng nó ñể tạo các biến cục bộ, bởi vì biến cục bộ không ñược chia sẽ bởi nhiều thực thể HttpApplication.Phương thức HttpApplication.Dispose ñược gọi trực tiếp trước khi một thực thể của lớp HttpApplication ñược hũy. Có thể sử dụng nó ñể xóa bất kỳ local resource nào. 3.3.1.3 Phương thức Dispose không giống với sự kiện Application_OnEnd, bởi vì nó luôn luôn ñược gọi trong tất cả các thực thể của lớp HttpApplication trong phạm vi một ứng dụng. Sự kiện Application_OnEnd chỉ ñược phát ra duy nhất một lần trong suốt cuộc sống của ứng dụng, khi thực thể cuối cùng của lớp HttpApplication ñược hũy (torn down). Chỉ sử dụng sự kiện Application_OnEnd ñể xóa những trạng thái hoặc những resource ñược chia sẽ bới tất cả các thực thể pipeline, như là ñối tượng ApplicationState. Không sử dụng nó ñể xóa các biến cục bộ, bởi vì biến cục bộ không ñược chia sẽ sử dụng bởi nhiều thực thể HttpApplication. 3.3.1.4 Không ñược sử dụng các thuộc tính Request, Response, Sesstion của thực thể HttpApplication bên trong các hàm Init và Dispose của một sự thực thi yêu cầu. 3.3.1.5 Ví dụ bên dưới chỉ ra làm thế nào ñể override hai phương thức (method) chu kỳ sống ñược cung cấp bởi lơp cơ bản HttpApplication. <script language="C#" runat=server> public override void Init() { // Init override code goes here. } public override void Dispose() { // Init override code goes here. } Chú ý:  

3.3.2

Ví dụ phía trên viết ñể ñặt vào tập tin .aspx. ðể tận dụng sức mạnh của IDE và phương pháp phát triển ứng dụng Web mới, khi lập trình ta sẽ không thực hiện overriding các phương thức trong tập tin Global.asax thay vào ñó ta sẽ làm công việc này ngay trong lớp Global , là một lớp ñược dẫn xuất từ lớp HttpApplication.

Quản lý những sự kiện của thực thể HttpApplication. Có thể sử dụng tập tin Global.asax ñể xử lý bất kỳ sự kiện nào ñược ñưa ra (exposed) bởi lớp cơ bản HttpApplication. Mẫu sau ñây ñược cung cấp ñể thực hiện công việc này: Application_EventName(AppropriateEventArgumentSignature) Ví dụ: ñoạn mã sau ñây giải quyết các sự kiện OnStart, BeginRequest, và OnEnd cho một ứng dụng ASP.NET, phải ñặt ñoạn mã vào trong tập tin Global.asax, ñoạn mã trong giống như sau:

Created by THÁI NGỌC DUY MSDN based-written.

6 4/12/2007

<Script language="C#" runat="server"> public void Application_OnStart() { // Application start-up code goes here. } public void Application_BeginRequest() { // Application code for each request could go here. } public void Application_OnEnd() { // Application clean-up code goes here. } Chú ý:  

3.4 3.4.1

Ví dụ phía trên viết ñể ñặt vào tập tin .aspx. ðể tận dụng sức mạnh của IDE và phương pháp phát triển ứng dụng Web mới, khi lập trình ta sẽ không thực hiện overriding các phương thức trong tập tin Global.asax thay vào ñó ta sẽ làm công việc này ngay trong lớp Global , là một lớp ñược dẫn xuất từ lớp HttpApplication.

Sử dụng các Module trong tập tin Global.asax. Khái quát. ASP.NET cung cấp những module khác nhau và riêng biệt trong mỗi yêu cầu và những sự kiện ñược ñưa ra (exposed), có thể quản lý (handle) các module này ngay trong tập tin Global.asax hoặc ngay trong một lớp ñược dẫn xuất từ lớp HttpApplication . Có thể sửa ñổi (custmize) và mở rộng các module này, hoặc thậm chí có thể tạo một module mới ñể xử lý thông tin về các yêu cầu HTTP. Ví dụ, có thể tạo một module output cache ñể cài ñặt (implements) output-caching làm việc (behaviors) cho toàn bộ ứng dụng. Tất cả các module, cả những module tự tạo và những module chuẩn ñược cung cấp bởi ASP.NET, ñều phải cài ñặt giao diện IHttpModule . Chỉ cần các module ñược ñăng ký với ứng dụng là có thể dễ dàng tương tác (interact) với các yêu cầu HTTP ñi vào ứng dụng.

3.4.2

Quản lý HTTP Module Events. Có thể sử dụng các module trong tập tin Global.asax ñể quản lý bất kỳ sự kiện nào ñược phát sinh trong các yêu cầu HTTP. Ví dụ, có thể tạo một custom authentication module cho ứng dụng Web ñịnh xây dựng, trong module có xử lý sự kiện OnAuthenticateRequest ñể chứng thực người dùng. Lệnh viết ñể ñiều khiển sự kiện phát sinh (exposed) bởi một HTTP module phải phù hợp với mẫu ñược chỉ rỏ bên dưới. FriendlyModuleName_EventName(AppropriateEventArgumentSignature) Ví dụ, nếu muốn ñưa code ñể quản lý sự kiện bắt ñầu và kết thúc của sesstion, cũng như cho sự kiện OnAuthenticateRequest, nó sẽ trong giống như bên dưới. <Script language="C#" runat="server"> void Session_OnStart() { // Session start-up code goes here. } void Session_OnEnd() {

Created by THÁI NGỌC DUY MSDN based-written.

7 4/12/2007

// Session clean-up code goes here. } void Application_OnAuthenticateRequest(Object Source, EventArgs Details) { // Authentication code goes here. } Chú ý:  

Ví dụ phía trên viết ñể ñặt vào tập tin .aspx. ðể tận dụng sức mạnh của IDE và phương pháp phát triển ứng dụng Web mới, khi lập trình ta sẽ không thực hiện overriding các phương thức trong tập tin Global.asax thay vào ñó ta sẽ làm công việc này ngay trong lớp Global , là một lớp ñược dẫn xuất từ lớp HttpApplication.

Created by THÁI NGỌC DUY MSDN based-written.

8 4/12/2007

3.5

Tổng kết.

3.5.1

Ứng dụng ASP.NET là toàn bộ những tập tin nằm trong một hệ thống thư mục (ảo) phân cấp, và gồm tất cả các ñối tượng ñược tạo ra bởi các tập tin này.

3.5.2

Ứng dụng ASP.NET ñược quản lý bởi một lớp ñược dẫn xuất từ lớp HttpApplication. Trong lúc chạy hệ thống ASP.NET duy trì một hoặc nhiều thực thể của lớp này (ñược tạo và quản lý bởi hệ thống ASP.NET) . Có thể có nhiều yêu cầu HTTP ñược xử lý ñồng thời. Tuy nhiên, tại mỗi thời ñiểm mỗi thực thể (instance) chỉ xử lý cho một yêu cầu HTTP.

3.5.3

Có thể lập trình lại (overriding) phương thức Init() và Dispose().

3.5.4

Có thể viết mã ñể giải quyết các sự kiện mức ứng dụng (Application).

3.5.5

Có thể viết mã ñể xử lý các yêu cầu mức module (sesstion).

3.5.6

Không cần tập tin Global.asax ứng dụng ASP.NET vẫn hoạt ñộng bình thường.

3.5.7

Tập tin Global.asa vẫn có thể tồn tại ñồng thời với tập tin Global.asax.

3.5.8

Sự kiện Start() (Application_OnStart) chỉ ñược phát ra một lần duy nhất khi thực thể ñầu tiên quản lý ứng dụng ,thực thể của lớp dẫn xuất từ lớp HttpApplication, ñược tạo.

3.5.9

Sự kiện End() (Application_OnEnd) chỉ ñược phát ra duy nhất một lần khi thực thể cuối cùng quản lý ứng dụng, thực thể của lớp dẫn xuất từ lớp HttpApplication, bị hũy bỏ.

3.5.10 Phương thức Application.Init() ñược gọi mỗi lần một thực thể quản lý ứng dụng, thực thể của lớp dẫn xuất từ lớp HttpApplication ,ñược tạo ra.

3.5.11 Phương thức Application.Dispose() ñược gọi mỗi khi một thực thể quản lý ứng dụng bị hũy bỏ.

3.5.12 Mỗi khi có một yêu cầu HTTP (HTTP Request) các sử kiện sẽ xảy ra lần lượt: 3.5.12.1 BeginRequest()(Application_BeginRequest): bắt ñầu yêu câu HTTP.

3.5.12.2 AuthenticateRequest() (Application_AuthenticateRequest): chứng thực yêu cầu.

3.5.12.3 EndRequest() (Application_EndRequest): ñã xử lý xong yêu cầu. 3.5.13 Khi một client kết nối vào Server sự kiện Start() (Session_Start) sẽ phát ra. 3.5.14 Khi client ngắt kết nối với Server ngoài khoảng thời gian timeout sự kiện End()(Session_End) sẽ ñược phát ra.

3.5.15 Sự kiện Error() (Application_Error) ñược phát ra khi xuất hiện một lổi không ñược quản lý (unhandled exception).

3.6

Tham khảo lớp HttpApplication.

Created by THÁI NGỌC DUY MSDN based-written.

9 4/12/2007

3.7

Tham khảo Giao diện IHttpModule.

4 Cấu hình ASP.NET. 4.1

Khái qúat .

-

-

ðặc ñiểm hệ thống cấu hình của ASP.NET là một thành phần có thể mở rộng ñược, cho phép ñịnh nghĩa những thiết lập hệ thống khi triễn khai ứng dụng ASP.NET lần ñầu tiên, sau ñó có thể thêm, sửa lại những thiết lập cấu hình tại bất cứ thời ñiểm nào với một sự tác ñộng nhỏ trên các ứng dụng Web và các Server. Hệ thống cấu hình của ASP.NET mang lại các lợi ích sau:  Thông tin cấu hình ñược lưu trữ trong tập tin XML chuẫn, cho nên, có thể sử dụng các trình soạn thảo văn bản chuẫn (notepad) hoặc các ứng dụng phân tích XML (XML Parser) ñể tạo và hiệu chỉnh nó một cách khá dễ dàng.  Có nhiều tập tin cấu hình, tất cả ñều ñược ñặt tên là Web.config, có thể xuất hiện trong nhiều thư mục của một ứng dụng Server ASP.NET. Mỗi tập tin cấu hình áp dụng những thiết lập cấu hình cho thư mục chứa nó và những thư mục con bên dưới nó. Theo mặc ñịnh, những thư mục con sẽ có những thiết lập cấu hình của tập tin Web.config trong thư mục cha, tuy nhiên, những tập tin cấu hình trong thư mục con có thể bổ sung, hiệu chĩnh, và thậm chí còn có thể ñịnh nghĩa chòng những thiếg lập của tập tin cấu hình trong thư mục cha. Tập tin cấu hình mức cao nhất có tên là: C:\WINNT\Microsoft.NET\Framework\ version\CONFIG\Machine.config , nó ñược cung cấp bởi ASP.NET và thiết lập cấu hình cho toàn Web Server.  Trong khi chạy, ASP.NET sử dụng thông tin cấu hình ñược cung cấp trong cấu trúc phân cấp của thư mục ảo ñể tính ra một thiết lập tổng hợp cho mỗi nguồn lực (resource) duy nhất. Chý ý, hệ thống phân cấu thư mục ở ñây là hệ thống thư mục ảo của IIS, không liên quan ñến hệ thống thư mục thường ñược quản lý bởi hệ ñiều hành.  ASP.NET tự ñộng dò tìm những thay ñổi trong các tập tin thiết lập cấu hình và tự ñộng áp dụng những thiết lập cấu hình mới cho những trang Web có liên quan. Web Server không cần phải khởi ñộng lại ñể các thiết lập cấu hình mới có hiệu lực. Thiết lập cấu hình phân cấp (tổng hợp của nhiều tập tin cấu hình) tự ñộng ñược tính và lưu trữ lại bất cứ khi nào hệ thống phân cấp các tập tin cấu hình có sự thay ñổi. Chú ý, những quy tắt ở trên không ñược tính với khối <processModel> trong tập tin cấu hình.  Hệ thống cấu hình của ASP.NET cho phép mở rộng, có thể thêm vào các thông số cấu hình (configuration parameters), và tạo các vùng ñiều khiểnc cấu hình (configuration section handlers) ñể xử lý chúng.

Created by THÁI NGỌC DUY MSDN based-written.

10 4/12/2007

 ASP.NET bảo vệ các tập tin cấu hình từ sự truy cập từ bên ngoài bằng cách cấu hình IIS ngăn cản truy cập trực tiếp từ Browse ñến các tập tin cấu hình. Mã lỗi 403 sẽ ñược trã về cho bất kỳ sự truy cập trực tiếp nào. 4.2

ðịnh dạng của tập tin cấu hình trong ASP.NET.

-

-

Thông tin cấu hình cho nguồn lực ASP.NET (ASP.NET resource) chứa trong một tập hợp các tập tin cấu hình, mỗi tập tin ñều ñược ñặt tên là Web.config. Mỗi tập tin cấu hình chứa một hệ thống cấp bậc các tag XML và các subtag cùng với những thuộc tính chỉ ñịnh những thiết lập cấu hình. Bởi vì những tag phải có cấu trúc XML ñúng chuẫn (well-formed XML) cho nên tag, subtag, attributes phân biệt dạng chữ (case-sensitive). Tên của tag và tên của attributes phải là camelcase, ñiều này có nghĩa là ký tự ñầu tiên của tên tag phải là chử thường, và ký tự ñầu tiên của bất kỳ từ theo sau nào phải là chử hoa. Giá trị của thuộc tính phải là Pascal-case. Tất cả thông tin cấu hình ñều ñược ñặt giữa cặp and . Thông tin cấu hình giữa các tag ñược nhóm vào hai khối (area) chính: khối ñịnh nghĩa ñiều khiển cấu hình section (the configuration section handler declaration area) và khối (area) thiết lập cấu hình section (the configuration section settings area).  Khối ñịnh nghĩa ñiều khiển xuất hiện tại phần ñầu của tập tin cấu hình giữa cặp tag and . Mỗi một sự ñịnh nghĩa chứa trong một tag <section> chỉ rỏ tên của một vùng (section), mỗi section cung cấp một tập hợp dữ liệu cấu hình và tên của các lớp .NET Framework xử lý dữ liệu cấu hình trong section này.  Khối thiết lập cấu hình vùng (section) theo sau khối và chứa các thiết lập cấu hình thật sự. Có mỗi khối thiết lập cấu hình vùng (section) cho mỗi ñịnh nghĩa vùng (section) trong khối . Mỗi cấu hình vùng chứa các subtag, các attribute chứa các thiết lập cho vùng.

Created by THÁI NGỌC DUY MSDN based-written.

11 4/12/2007

-

Tập tin Web.config bên dưới là một ví dụ ñịnh nghĩa hai ñiều khiển cấu hình (declares two configuration section handlers). Cái thứ nhất quản lý các thiết lập cho ứng dụng, và cái còn lại quản lý trạng thái section. <section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <section name="sessionState" type="System.Web.SessionState.SessionStateSectionHandler, System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineToApplication" /> <sessionState cookieless="true" timeout="10" />

-

-

Chỉ cần ñịnh nghĩa khối ñiều khiển cấu hình section (configuration section handler) một lần duy nhất, có thể ñặt nó trong tập tin thiết lập cấu hình toàn server Machine.config hoặc trong tập tin Web.config trong thư mục ảo chứa các tập tin của ứng dụng Web. Các tập tin cấu hình trong thư mục con sẽ tự ñộng thừa kế các ñịnh nghĩa ñiều khiển cấu hình trong thư mục cha. ðể có nhiều thông tin hơn về vấn ñề này xin xem mục Configuration Inheritance trong MSDN. Các thiết lập cấu hình ñược ñặt bên trong các tag phân nhóm section (section grouping tags). Những section tag ở mức cao (top-level section tags) thường mô tả namespace mà những thiết lập cấu hình tác dụng lên. Ví dụ, tag <system.net> mô tả những thiết lập cho những lớp mạng, và tag <system.web> mô tả những thiết lập cho những lớp ASP.NET. Ví dụ bên dưới chỉ rỏ vị trí của các tag. <sectionGroup name="system.net"> <section name="authenticationModules" type="System.Net.Configuration.NetAuthenticationModuleHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <section name="webRequestModules" type="System.Net.Configuration.WebRequestModuleHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <sectionGroup name="system.web"> <section name="authorization" type="System.Web.Configuration.AuthorizationConfigHandler, System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

Created by THÁI NGỌC DUY MSDN based-written.

12 4/12/2007

<section name="sessionState" type="System.Web.SessionState.SessionStateSectionHandler, System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineToApplication" />
<system.net> <system.web> <sessionState sqlConnectionString="data source=127.0.0.1; user id=sa;password=" cookieless="false" timeout="10" />


5 Truy cập những thiết lập cấu hình của ASP.NET. Có thể truy cập vào những thiết lập cấu hình công cộng (public) của ASP.NET từ một ứng dụng ASP.NET bằng cách sử dụng những phương thức tỉnh nội (intrinsic static methods) ñược ñưa ra (exposed) bởi ASP.NET. Ví dụ, ñể ñọc giá trị của thuộc tính cookieless trong section <sessionState> có thể sử dụng ñoạn mã lệnh sau ñây: bool nocookies = Session.Cookieless; Những thiết lập rỏ ràng của ứng dụng (Application-specific settings) ñược lưu trữ trong section của những tập tin Web.config, có thể sử dụng tập hợp tỉnh kiểu chuỗi ConfigurationSettings.AppSettings ñể truy cập ñến nó, ví dụ: String dsn = ConfigurationSettings.AppSettings["dsn"];

6 Tạo những Configuration Sections mới. - Có thể mở rộng những thiết lập cấu hình chuẩn của ASP.NET với những tag cấu hình XML (XML configuration tags) tự ñịnh nghĩa. ðể làm công việc này, ñầu tiên phải tạo một ñiều khiển cấu hình section (configuration section handler). ðiều khiển (handler) phải là một lớp .NET Framework có cài ñặt giao diện IconfigurationSectionHandler. Những ñiều khiển section (section handler) thông dịch và xử lý (processes) những thiết lập ñã ñược ñịnh nghĩa trong các tag XML ñã ñược phân chia (portion) rỏ ràng trong tập tin Web.config, và trả về một ñối tượng cấu hình thích hợp (appropriate) dựa trên những thiết lập cấu Created by THÁI NGỌC DUY MSDN based-written.

13 4/12/2007

hình. ðối tượng cấu hình (configuration object), cái ñược trả về bởi handler class, có thể có cấu trúc dữ liệu không cố ñịnh; nó không bị giới hạn bởi những lớp cấu hình hoặc những ñịnh dạng cấu hình cơ bản. - Ví dụ bên dưới ñịnh nghĩa một giao diện IconfigurationSectionHandler. namespace System.Web.Configuration { public interface IConfigurationSectionHandler { public Object Create(Object parent, Object input, XmlNode node); }

} - Sau khi cài ñặt giao diện IconfigurationSectionHandler, phải ñịnh nghĩa một section trong tập tin Web.config như sau: <sectionGroup name="myGroup"> <sectionGroup name="nestedGroup"> <section name="mySection" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1 /> <myGroup> <mySection>

Created by THÁI NGỌC DUY MSDN based-written.

14 4/12/2007

- Có thể ñọc giá trị của configuration section vừa ñược ñịnh nghĩa bằng ñoạn code sau: NameValueCollection config = (NameValueCollection) ConfigurationSettings.GetConfig("mygroup/nestedgroup/mysection"); Response.Write("The value of key_one is " + config["key_one"] + "
");

Response.Write("The value of key_two is " + config["key_two"] + "
");

7 Sơ ñồ thiết lập cấu hình của ASP.NET. Sơ ñồ cấu hình section (configuration section schema) chứa các ñơn vị (element) ñể ñiều khiển ứng dụng ASP.NET sẽ hoạt ñộng như thế nào. Sơ ñồ tổng quát như sau:

(Mọi người tạm xem nha, Hồi sau sẽ có tiếng việt ñầy ñủ) <system.web> <passport> <deny> <use> <customErrors> <error>

Created by THÁI NGỌC DUY MSDN based-written.

15 4/12/2007

<machineKey> <pages> <processModel> <securityPolicy> <trustLevel> <sessionState> <trust> <webServices> <protocols> <serviceDescriptionFormatExtensionTypes> <soapExtensionTypes> <soapExtensionReflectorTypes> <soapExtensionImporterTypes> <WsdlHelpGenerator>


Element <system.web> for

for for for

Created by THÁI NGỌC DUY MSDN based-written.

Description Chỉ ñơn vị cấu hình cao nhất cho ASP.NET configuration section. Thêm một tham chiếu ñến assembly ñược sử dụng trong suốt qúa trình biên dịch của một nguồn lực ñộng (dynamic resource) Adds an alias for a specific user agent to an internal collection of user agent aliases. Adds a reference to an assembly to use during compilation of a dynamic resource. Adds a reference to an assembly to use during compilation of a dynamic resource. 16 4/12/2007

for <protocols>

Adds a transmission protocol that the .NET Framework can use to decrypt data sent from a client browser in the HTTP request. for Adds a service description format <serviceDescriptionFormatExtensionTypes> extension to run within the scope of the configuration file. for <soapExtensionTypes>, Adds a SOAP extension to run with all <soapExtensionImporterTypes>, and XML Web services within the scope of <soapExtensionReflectorTypes> the configuration file. Allows access to a resource. Specifies ASP.NET compilation processing directives. Configures ASP.NET authentication support. Configures ASP.NET authorization support. Configures the settings for the browser capabilities component. Allows pattern matching to stop after processing the first successful match out of a number of alternatives. Removes all references to items appropriate to the parent tag. Adds aliases for specific user agents to an internal collection of user agent aliases. Contains all the compilation settings used by ASP.NET. Defines a new compiler option. Specifies the compilers that the ASP.NET application supports. Allows optional definition of name and password credentials within the configuration file. <customErrors> Defines custom error messages for an ASP.NET application and the pages that a browser is redirected to when errors occur. <deny> Specifies that access to a resource is denied. <error> Defines one custom error condition that will be handled by a custom error page. Allows multiple rules to be applied in sequence. Configures an ASP.NET application for custom forms-based authentication. Created by THÁI NGỌC DUY MSDN based-written.

17 4/12/2007



<machineKey>

<pages> <passport>

<processModel> <protocols>

for for for for

for <protocols>

Created by THÁI NGỌC DUY MSDN based-written.

Configures the globalization settings of an application. Maps incoming URL requests to IHttpHandler classes. Adds, removes, or clears HTTP modules within an application. Configures ASP.NET HTTP runtime settings. This section can be declared at the machine, site, application, or subdirectory level. Controls the application identity of the Web application. Configures keys to use for encryption and decryption of forms authentication cookie data. This section allows developers to configure a validation key that performs message authentication checks on view state data and forms authentication tickets. It can be declared at the machine, site, or application levels, but not at the subdirectory level. Identifies page-specific configuration settings. Specifies the page to redirect to if the page requires authentication and the user has not signed on with Microsoft Passport authentication. Configures the ASP.NET process model settings on Internet Information Services (IIS) Web server systems. Specifies the transmission protocols that ASP.NET can use to decrypt data sent from a client browser in the HTTP request. Removes a reference to an assembly. Removes an alias for a specific user agent from an internal collection of user agent aliases. Removes a verb/path mapping to an HttpHandler class. Removes a reference to an HttpModule class. The value of must exactly match that of a previous directive. Removes a single protocol from a specific application's list of supported HTML encoding protocols. 18 4/12/2007

for Removes a single service description <serviceDescriptionFormatExtensionTypes> format extension type from within the scope of the configuration file. The HttpCapabilitiesBase-derived class used to hold the results (key-value string pairs) from parsing this section. This string is used at run time to create the return type. <securityPolicy> Defines valid mappings of named security levels to policy files. This section can be declared at the machine, site, or application levels. <serviceDescriptionFormatExtensionTypes> Specifies the service description format extensions to run within the scope of the configuration file. <sessionState> Configures some session-state settings for the current application. <soapExtensionImporterTypes> Specifies the SOAP extensions to run when a service description for an XML Web service within the scope of the configuration file is accessed. <soapExtensionReflectorTypes> Specifies the SOAP extensions to run when a service description is generated for all XML Web services within the scope of the configuration file. <soapExtensionTypes> Specifies the SOAP extensions to run with all XML Web services within the scope of the configuration file. Configures the ASP.NET trace service. <trust> Configures the code access security permission set used to run a particular application. This section can be declared at the machine, site, and application levels. <trustLevel> Defines the mapping of specific security levels to named policy files. <use> Specifies the HTTP request strings sent to this parser. <user> Allows definition of user name and password credentials within the configuration file. <webServices> Controls the settings of XML Web services created using ASP.NET. <WsdlHelpGenerator> Specifies the .aspx Help page for an XML Web service.

Created by THÁI NGỌC DUY MSDN based-written.

19 4/12/2007

TRUY CẬP DỮ LIỆU TRONG MÔI TRƯỜNG .NET ---------------------I. Giới thiệu về ADO.NET I.1. Tổng quan về ADO.NET ADO.NET cung cấp việc truy cập các nguồn dữ liệu một cách nhất quán như SQL Server, cũng như những nguồn dữ liệu quản lý thông qua OLE DB và XML. Những ứng dụng sử dụng dữ liệu chia sẽ có thể dùng ADO.NET ñể kết nối ñến những nguồn dữ liệu này, cũng như truy xuất, thao tác và cập nhật dữ liệu. ADO.NET dễ dàng quản lý việc truy cập dữ liệu từ việc thao tác trên cơ sở dữ liệu thông qua những thành phần riêng lẽ mà có thể dùng chung hoặc dùng riêng lẽ các thành phần này. ADO.NET bao gồm các trình cung cấp dữ liệu .NET (.NET data provider) cho việc kết nối ñến cơ sở dữ liệu, thực thi một câu lệnh và truy xuất kết quả. Các kết quả này hoặc là ñược xử lý trực tiếp hoặc là ñược ñặt trong một ñối tượng ADO.NET Dataset, cho người dùng thao tác trên ñối tượng này . ðối tượng ADO.NET Dataset cũng có thể ñược sử dụng một cách ñộc lập với .NET data provider ñể quản lý dữ liệu thuộc những ứng dụng hoặc những nguồn từ XML. Lớp ADO.NET ñược tìm thấy trong namespace System.Data, và ñược tích hợp với lớp XML, lớp này ñược tìm thấy trong namespace System.Xml Connection Sự khác nhau giữa ADO.NET và ADO 1. Sự thể hiện dữ liệu .  ADO dữ liệu ñược lưu trữ ở dạng recordset , còn ADO.NET lưu trữ dạng dataset .ðây là ñiểm khác biệt quan trọng nhất . 2. Số table .  Một recordset như là một table , nếu recordset chứa nhiều tables thì nó phải dùng phép JOIN query kết các bảng lại, lấy dữ liệu từ các tables khác nhau tập hợp lại thành một tables ñơn .  Ngược lại , dataset là một collection của một hoặc nhiều tables .Các tables bên trong một dataset có thể gọi trực tiếp từng tables thông qua ñối tượng DaTaTable . Nếu một dataset chứa nhiều tables ,nó sẽ chứa nhiều ñối tượng DataTable .Tức là ,mỗi DataTable ñiển hình tương ñương với một table hoặc là một view. Như vậy một dadaset có cấu trúc tương tự như một database.  Ngoài ra , một dataset còn chứa các mối quan hệ .Một mối quan hệ của dataset tương tư như là mối quan hệ khoá ngoại của database ; tức là ,nó kết hợp các dòng của table này với table khác  Ví dụ : Một dataset chứa một table về thông tin nhà ñầu tư (investors ) và một table khác lưu trữ lĩnh vực ñầu tư (purchases) . Nó có thể chứa mối quan hệ mỗi dòng investors table tương ứng mỗi dòng của purchases .  Bởi vì dataset có nhiều ngăn với nhiều tables tách rời nhau và các thông tin về mối quan hệ giữa các table với nhau . Vì vậy cấu trúc dữ liệu nhiều hơn recordset và chứa các mối quan hệ trên tables với nhau . 3. Sự ảnh hưởng dữ liệu và con trỏ .  Trong ADO ta có thể duyệt liên tục các dòng của recordset ta dùng phương thức ADO MoveNext .Trong ADO.NET, các dòng ñược thể hiện như một collection. Vì vậy, ta có thể sử dụng vòng lặp thông qua một table như là thông qua một collection, hoặc là truy cập trực tiếp các dòng thông qua số thứ tự hoặc khoá chính. ðối tượng DataRelation chứa thông tin chính và chi tiết của một record và cung cấp phương thức cho phép truy xuất record quan hệ với các record mà ta ñang thao tác.

Created by THÁI NGỌC DUY MSDN based-written.

20 4/12/2007

 Con trỏ là một phần tử của database ñiều khiển hoạt ñộng của record ,khả năng update dữ liệu và xem xét sự chuyển ñồi dữ liệu bởi các user khác nhau .ADO.NET không có ñối tượng con trỏ vốn có,nhưng thay vào ñó nó chứa data class cung cấp các phương thức như con trỏ truyền thống. 4. Tối ưu các kết nối mở .  ADO.NET thường mở một connection ñủ ñể thực thi một thao tác trên database ,ví dụ như select hoặc update sau khi thực thi select hoặc update thì connection tự ngắt ,ta có thể ñọc các dòng vào dataset và thao tác trên nó mà không cần giữ kết nối ñến data source.Trong ADO, recordset có thể cung cấp ngắt kết nối ,nhưng ADO ñược thiết kế chính cho mục ñích kết nối liên tục.  Một khác biệt quan trọng việc xử lý disconnected trong ADO và ADO.NET . Trong ADO, bạn giao tiếp với cơ sở dữ liệu bằng cách thực hiện cuộc gọi ñến Ole Db Provider. Trong ADO.NET, bạn giao tiếp với cơ sở dữ liệu thông qua một DataAdapter(OleDbDataAdapter hay SqlDataAdapter), nó thực hiện việc gọi ñến Ole Db provider hay APIs (ñược cung cấp bởi nguồn dữ liệu cơ bản). Sự khác nhua quan trọng là trong ADO.NET, data adapter cho phép bạn ñiều khiển cách thay ñổi trên dataset ñược chuyển xuống cơ sở dữ liệu. 5. Chia sẻ dữ liệu giữa các ứng dụng .  Việc truyền một ADO.NET Dataset giữa các ứng dụng thì dễ dàng hơn việc truyền một ADO disconnected recordset. ðể chuyển một ADO disconnected recordset từ một thành phần ñến một thành phần khác, bạn sử dụng COM marshalling. ðể truyền dữ liệu trong ADO.NET, bạn sử dụng một Dataset, nó cũng có thể chuyển một Xml stream.  Việc truyền các file Xml thì thuận lợi hơn truyền COM marshalling.  Nhiều kiểu dữ liệu hơn: COM marshalling giới hạn kiểu dữ liệu, chỉ các kiểu ñược ñịnh nghĩa theo chuẩn của COM. Bởi vì việc truyền của Dataset trong ADO.NET dựa trên khuôn dạng XML, vì thế không giới hạn kiểu dữ liệu  Khả năng thực hiện: Việc truyền một ADO recordset lớn hay một ADO.NET dataset lớn có thể sử dụng tài nguyên mạng, như số lượng dòng dữ liệu. Cả 2 ADO và ADO.NET ñều cho phép bạn tối thiểu dữ liệu ñược truyền. Nhưng ADO.NET cung cấp một khả năng thực hiện thuận lợi hơn, trong ADO.NET không ñòi hỏi việc chuyển ñổi kiểu dữ liệu. ADO yêu cầu COM marshalling chuyển ñổi kiểu dữ liệu cho phù hợp với kiểu dữ liệu của COM.  Vấn ñề bức tường lửa: Việc sử dụng ADO.NET sẽ giúp ta dễ dàng trong việc truyền dữ liệu giữa các thành phần mshelp://MS.VSCC/MS.MSDNVS/vbcon/html/vbconadopreviousversionsofad o.htm

I.1 Cấu trúc của ADO.NET I.1.1. XML và ADO.NET ADO.NET kết hợp với sức mạnh của XML ñể cung cấp truy xuất dữ liệu ngắt ñoạn. ADO.NET ñược thiết kế tay trong tay với lớp XML trong .NET Framework, cả 2 là những thành phần của một kiến trúc ñơn. ADO.NET và lớp XML của .NET Framework cùng sử dụng ñối tượng Dataset. Dataset có thể ñược nạp dữ liệu từ nguồn XML, có thể là 1 file XML hay là 1 dòng XML nào ñó.

Created by THÁI NGỌC DUY MSDN based-written.

21 4/12/2007

I.1.2. ADO.NET Component ADO.NET Components ñược thiết kế ñể quản lý việc truy cập dữ liệu từ nguồn dữ liệu. Có 2 thành phần chính trong ADO.NET: Dataset và .NET Data Provider - một tập hợp các thành phần bao gồm các ñối tượng Connection, Command, DataReader, DataAdapter. ADO.NET Dataset là thành phần chính của kiến trúc kết nối gián ñoạn của ADO.NET. Dataset ñược thiết kế một cách rõ ràng cho việc truy cập dữ liệu không phụ thuộc vào bất kỳ nguồn dữ liệu nào. Và kết quả là nó có thể sử dụng nhiều nguồn dữ liệu khác nhau. Dataset bao gồm tập hợp một hoặc nhiều ñối tượng DataTable ñược tạo thành từ nhiều dòng và nhiều cột dữ liệu, cũng như các khoá chính, khoá ngoại, các ràng buộc và các mối quan hệ của các ñối tượng DataTable. Thành phần chính khác của ADO.NET là .NET Data Provider. Thành phần này ñược thiết kế cho việc thao tác dữ liệu và chắc chắn, truy cập dữ liệu forward only, read only. ðối tượng Connection cung cấp việc kết nối ñến nguồn dữ liệu. ðối tượng command cho phép truy cập các câu lệnh cơ sở dữ liệu ñể lấy kết quả trả về, dữ liệu thay ñổi, thực thi các stored procedure, gửi hoặc nhận thông tin các tham số (parameter). DataReader cung cấp một luồng truy xuất dữ liệu nhanh từ nguồn dữ liệu. Cuối cùng DataAdapter cung cấp một cầu nối giữa ñối tượng Dataset và cơ sở dữ liệu. DataAdapter sử dụng ñối tượng Command ñể thực thi các câu lệnh SQL dưới cơ sở dữ liệu ñể load dữ liệu lên Dataset và cập nhật những thay ñổi trên Dataset xuống cơ sở dữ liệu Bạn có thể viết .NET Data Provider bằng bất kỳ nguồn dữ liệu nào. .NET Framework thông qua 2 .NET Data Provider là: SQL Server .NET Data Provider và OLE DB .NET Data Provider.

Các thành phần trong kiến trúc của ADO.NET I.1.3. Chọn lựa DataReader hay Dataset Khi quyết ñịnh ứng dụng của bạn sẽ sử dụng DataReader hay DataSet, bạn nên quan tâm ñến những chức năng mà ứng dụng của bạn yêu cầu. Bạn nên dùng Dataset khi:  Tách biệt dữ liệu giữa các lớp hoặc từ một XML Wed Service  Tương tác dữ liệu một cách năng ñộng như liên kết với Window Forms control hoặc kết hợp và quan hệ dữ liệu từ nhiều nguồn khác nhau.  Lưu trữ dữ liệu cục bộ trong ứng dụng của bạn

Created by THÁI NGỌC DUY MSDN based-written.

22 4/12/2007

 Cung cấp một cách nhìn về mối quan hệ dữ liệu XML phân tầng và sử dụng những công cụ giống như XSL Transformation hoặc một XLM Path Language (XPath) Query trên dữ liệu của bạn  Thực hiện rộng rãi việc xử lý dữ liệu không yêu cầu một kết nối mở ñến nguồn dữ liệu. Thực hiện việc giải phóng kết nối ñể ñược dùng bởi các Client khác Nếu bạn không yêu cầu các chức năng ñược cung cấp bởi Dataset, bạn có thể cải thiện khả năng ứng dụng của bạn bằng cách sử dụng DataReader II. ðối tượng Dataset ðối tượng Dataset là thành phần chính ñể hổ trợ việc kết nối ngắt ñoạn, là kịch bản phân bổ dữ liệu với ADO.NET. Dataset là bộ nhớ tạm, nó là một bản sao dữ liệu mà cung cấp một mô hình lập trình quan hệ nhất quán không quan tâm ñến nguồn dữ liệu. DataSet bao gồm tập hợp các ñối tượng DataTable mả bạn có thể thiết lập mối quan hệ giữa chúng thông qua ñối tượng DataRelation. Bạn cũng có thể làm cho dữ liệu trong DataSet ñược nhất quán bằng cách sử dụng ñối tượng UniqueConstraint và ForeignKeyConstraint Mô hình ñối tuợng Dataset Mô hình ñối tuợng Dataset

Mô hình ñối tuợng Dataset  Các thành phần của ñối tượng DataSet  Public properties Thuộc tính Diễn tả CaseSensitive Thiết lập hay trả về một giá trị cho biết so sánh chuỗi bên trong các ñối tượng DataTable có phân biệt hoa thường hay không Container(kế thừa từ Trả về container cho thành phần MarshalByValueComponent) DataSetName Thiết lập hay trả về tên của DataSet hiện hành DefaultViewManager DesignMode EnforceConstraints

Created by THÁI NGỌC DUY MSDN based-written.

23 4/12/2007

ExtendedProperties HasErrors Locale Namespace Prefix Relations

Sites Tables

Thiết lập hay trả về namespace của DataSet Trả về một tập hợp các quan hệ liên kết các bảng(DataTable) trong DataSet và cho phép ñịnh hướng từ bảng cha ñến bảng con Trả về tập hợp bảng(DataTable) chứa bên trong DataSet

Public methods a. AcceptChanges ðồng ý tất cả những thay ñổi làm trên DataSet trước khi AcceptChanges ñược gọi. Khi AcceptChanges ñược gọi, các ñối tượng DataRow trong chế ñộ soạn thảo sẽ kết thúc việc soạn thảo. Trạng thái của DataRow cũng ñược thay ñổi. Những dòng ñã thêm vào hay ñã cập nhật thì không thay ñổi, những dòng ñã xoá sẽ bị xoá khỏi DataSet. Phương thức AcceptChanges thường ñược gọi trên một DataTable sau khi bạn thực hiện việc update DataSet sử dụng phương thức dbDataAdapter.Update 

 Ví dụ sau sẽ kiểm tra lỗi cho mỗi bảng. Nếu lỗi có thể bỏ qua, AcceptChanges ñược gọi, ngược lại RejectChanges ñược gọi private void AcceptOrReject(DataTable myTable) { //Nếu có lỗi thì cố gắng reconsiled if(!myTable.HasErrors) { if(Reconcile(myTable)) { // Sau khi ñã sửa tất cả các lỗi myTable.AcceptChanges(); } else { // không thể sửa tất cả các lỗi myTable.RejectChanges(); } } else // nếu không có lỗi, gọi phương thức AcceptChanges myTable.AcceptChanges(); } private bool Reconcile(DataTable thisTable) { foreach(DataRow myRow in thisTable.Rows) { //Chèn lệnh ñể cố gắng reconsile lỗi // Nếu vẫn còn lỗi

Created by THÁI NGỌC DUY MSDN based-written.

24 4/12/2007

// since the caller rejects all changes upon error. if(myRow.HasErrors) return false; } return true; } b. Clear Xoá dữ liệu của DataSet bằng cách xoá tất cả những dòng trong tất cả các bảng của DataSet  Ví dụ sau xoá tất cả các dòng trong tất cả các bảng của DataSet private void ClearDataSet(DataSet myDataSet){ // In ra số dòng trong từng bảng foreach(DataTable t in myDataSet.Tables){ Console.WriteLine(t.TableName + "Rows.Count = " + t.Rows.Count.ToString()); } // Xoá tất cả các dòng của mỗi bảng myDataSet.Clear(); // In ra số dòng của mỗi bảng foreach(DataTable t in myDataSet.Tables){ Console.WriteLine(t.TableName + "Rows.Count = " + t.Rows.Count.ToString()); } } c. Clone Sao chép cấu trúc của DataSet, bao gồm tất cả các lược ñồ DataTable, các quan hệ và các ràng buộc. Không sao chép dữ liệu  Ví dụ private void GetClone(DataSet myDataSet){ // Sao chép cấu trúc của DataSet DataSet cloneSet; cloneSet = myDataSet.Clone() } ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatasetclassclonetopic.htm d. Copy Sao chép cả cấu trúc và dữ liệu của DataSet này  Ví dụ sau dùng phương thức copy ñể tạo một bản sao của DataSet private void CopyDataSet(DataSet myDataSet){ // Tạo một biến ñối tượng DataSet DataSet copyDataSet; copyDataSet = myDataSet.Copy(); } e. Dispose Giải phóng tài nguyên hệ thống sử dụng bởi MarshalByValueComponent f. Equals Xác ñịnh xem 2 thể hiện của ñối tượng có bằng nhau hay không  Ví dụ sau so sánh các ñối tượng khác nhau using System; public class MyClass { public static void Main() {

Created by THÁI NGỌC DUY MSDN based-written.

25 4/12/2007

string s1 = "Tom"; string s2 = "Carol"; Console.WriteLine("Object.Equals(\"{0}\", \"{1}\") => {2}", s1, s2, Object.Equals(s1, s2)); s1 = "Tom"; s2 = "Tom"; Console.WriteLine("Object.Equals(\"{0}\", \"{1}\") => {2}", s1, s2, Object.Equals(s1, s2)); s1 = null; s2 = "Tom"; Console.WriteLine("Object.Equals(null, \"{1}\") => {2}", s1, s2, Object.Equals(s1, s2)); s1 = "Carol"; s2 = null; Console.WriteLine("Object.Equals(\"{0}\", null) => {2}", s1, s2, Object.Equals(s1, s2)); s1 = null; s2 = null; Console.WriteLine("Object.Equals(null, null) => {2}", s1, s2, Object.Equals(s1, s2)); } } /* This code produces the following output. Object.Equals("Tom", "Carol") => False Object.Equals("Tom", "Tom") => True Object.Equals(null, "Tom") => False Object.Equals("Carol", null) => False Object.Equals(null, null) => True */ g. GetChanges Trả vể một bản sao của DataSet chứa tất cả những thay ñổi ñã làm trên DataSet từ khi lần cuối nó ñược Load hay từ khi AcceptChanges ñược gọi. Ví dụ sau dùng phương thức GetChanges ñể tạo một ñối tượng DataSet thứ 2 mà sau ñó ñược dùng ñể cập nhật dữ liệu trên data source private void UpdateDataSet(DataSet myDataSet){ // ðầu tiên ta kiểm tra xem dataset có thay ñổi không với phương thức HasChanges if(!myDataSet.HasChanges(DataRowState.Modified)) return; // Tạo ra một biến DataSet tạm DataSet xDataSet; // Lấy những thay ñổi trên Dataset, chỉ những thay ñổi cập nhật(Modified) mà thôi. xDataSet = myDataSet.GetChanges(DataRowState.Modified);

Created by THÁI NGỌC DUY MSDN based-written.

26 4/12/2007

// Kiểm tra xem Dataset có lỗi không if(xDataSet.HasErrors){ // viết lệnh ñể fix lỗi } // Sau khi Dataset không còn lỗi // gọi phương thức Update của DataAdapter ñể cập nhật dữ liệu xuống Database myOleDbDataAdapter.Update(xDataSet); } h. GetXml Trả về trình bày Xml của dữ liệu ñược lưu trữ trong DataSet. Phương thức này thường ñược sử dụng chung với phương thức WriteXml. i. WriteXml Ghi dữ liệu Xml, tuỳ chọn lược ñồ từ DataSet. Ví dụ sau tạo một ñối tượng System.IO.FileStream mà ñựơc dùng ñể tạo System.Xml.XmlTextWriter. ðối tượng XmlTextWriter ñược dùng với phương thức WriteXml ñể ghi một tài liệu Xml.

private void WriteXmlToFile(DataSet thisDataSet) { if (thisDataSet == null) { return; } // Tạo ra một file ñể ghi string filename = "myXmlDoc.xml"; // Tạo một FileStream ñể ghi System.IO.FileStream myFileStream = new System.IO.FileStream (filename, System.IO.FileMode.Create); // Tạo một XmlTextWriter với FileStream System.Xml.XmlTextWriter myXmlWriter = new System.Xml.XmlTextWriter(myFileStream, System.Text.Encoding.Unicode); // Ghi xuống file với phương thức WriteXml thisDataSet.WriteXml(myXmlWriter); myXmlWriter.Close(); } j. HasChanges Trả về giá trị cho biết DataSet ñã thay ñổi chưa, bao gồm các dòng thêm mới, xoá hay cập nhật Ví dụ sau dùng phương thức GetChanges ñể tạo DataSet thứ 2, sau ñó cập nhật dữ liệu xuống nguồn dữ liệu. private void UpdateDataSet(DataSet myDataSet){ // Kiểm tra xem DataSet có thay ñổi không if(!myDataSet.HasChanges(DataRowState.Modified)) return; // Tạo một biến DataSet tạm DataSet xDataSet; // chỉ lấy những dòng ñã thay ñổi xDataSet = myDataSet.GetChanges(DataRowState.Modified); // Kiểm tra xem dataset có lỗi không if(xDataSet.HasErrors){ // Viết code fix lỗi

Created by THÁI NGỌC DUY MSDN based-written.

27 4/12/2007

} // Sau khi fix lỗi // gọi phương thức Update của DataAdapter ñể cập nhật dữ liệu từ Dataset xuống Database myOleDbDataAdapter.Update(xDataSet); } k. Merge Trộn DataSet này với một DataSet khác Ví dụ sau tạo ra một DataSet với một bảng, 2 cột và 10 dòng. Một DataTable thứ 2 ñược tạo gần như giốn hệt với DataTable thứ nhất ngoại trừ cột mới ñược thêm vào bảng. Hai dòng ñược thêm vào bảng thứ 2, sau ñó nó ñược trộn vào DataSet với tham số preserveChanges là False và tham số missingSchemaAction ñựơc thiết lập là MissingSchemaAction.Add. private void DemonstrateMergeTableAddSchema(){ // Create a DataSet with one table, two columns, and ten rows. DataSet ds = new DataSet("myDataSet"); DataTable t = new DataTable("Items"); // Add table to the DataSet ds.Tables.Add(t); // Create and add two columns to the DataTable DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32"),""); c1.AutoIncrement=true; DataColumn c2 = new DataColumn("Item", Type.GetType("System.Int32"),""); t.Columns.Add(c1); t.Columns.Add(c2); // Set the primary key to the first column. t.PrimaryKey = new DataColumn[1]{ c1 }; // Add RowChanged event handler for the table. t.RowChanged+= new DataRowChangeEventHandler(Row_Changed); // Add ten rows. for(int i = 0; i <10;i++){ DataRow r=t.NewRow(); r["Item"]= i; t.Rows.Add(r); } // Accept changes. ds.AcceptChanges(); PrintValues(ds, "Original values"); // Create a second DataTable identical to the first, with // one extra column using the Clone method. DataTable t2 = t.Clone();

Created by THÁI NGỌC DUY MSDN based-written.

28 4/12/2007

t2.Columns.Add("extra", typeof(string)); // Add two rows. Note that the id column can't be the // same as existing rows in the DataSet table. DataRow newRow; newRow=t2.NewRow(); newRow["id"]= 12; newRow["Item"]=555; newRow["extra"]= "extra Column 1"; t2.Rows.Add(newRow); newRow=t2.NewRow(); newRow["id"]= 13; newRow["Item"]=665; newRow["extra"]= "extra Column 2"; t2.Rows.Add(newRow); // Merge the table into the DataSet. Console.WriteLine("Merging"); ds.Merge(t2,false,MissingSchemaAction.Add); PrintValues(ds, "Merged With Table, Schema Added"); } private void Row_Changed(object sender, DataRowChangeEventArgs e){ Console.WriteLine("Row Changed " + e.Action.ToString() + "\t" + e.Row.ItemArray[0]); } private void PrintValues(DataSet ds, string label){ Console.WriteLine("\n" + label); foreach(DataTable t in ds.Tables){ Console.WriteLine("TableName: " + t.TableName); foreach(DataRow r in t.Rows){ foreach(DataColumn c in t.Columns){ Console.Write("\t " + r[c] ); } Console.WriteLine(); } } } l. ReadXml ðọc lược ñồ Xml và ñọc dữ liệu vào DataSet. Ví dụ sau tạo ra một DataSet ñơn với một bảng, 2 cột, 10 dòng. Lược ñồ và dữ liệu của DataSet ñược ghi vô ñĩa bằng cách gọi phương thức WriteXml. Một DataSet thứ hai ñược tạo và phương thức ReadXml ñược dùng ñể ñiền lược ñồ và dữ liệu vào DataSet. private void DemonstrateReadWriteXMLDocumentWithXMLReader(){ // Create a DataSet with one table and two columns. DataSet OriginalDataSet = new DataSet("myDataSet"); OriginalDataSet.Namespace= "NetFrameWork"; DataTable myTable = new DataTable("myTable"); DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32"));

Created by THÁI NGỌC DUY MSDN based-written.

29 4/12/2007

c1.AutoIncrement= true; DataColumn c2 = new DataColumn("item"); myTable.Columns.Add(c1); myTable.Columns.Add(c2); OriginalDataSet.Tables.Add(myTable); // Add ten rows. DataRow newRow; for(int i = 0; i < 10; i++){ newRow = myTable.NewRow(); newRow["item"]= "item " + i; myTable.Rows.Add(newRow); } OriginalDataSet.AcceptChanges(); // Print out values of each table in the DataSet using the // function defined below. PrintValues(OriginalDataSet, "Original DataSet"); // Write the XML schema and data to file with FileStream. string xmlFilename = "myXmlDocument.xml"; // Create FileStream System.IO.FileStream fsWriteXml = new System.IO.FileStream (xmlFilename, System.IO.FileMode.Create); // Create an XmlTextWriter to write the file. System.Xml.XmlTextWriter xmlWriter = new System.Xml.XmlTextWriter (fsWriteXml, System.Text.Encoding.Unicode); // Use WriteXml to write the document. OriginalDataSet.WriteXml(xmlWriter); // Close the FileStream. fsWriteXml.Close(); // Dispose of the original DataSet. OriginalDataSet.Dispose(); // Create a new DataSet. DataSet newDataSet = new DataSet("New DataSet"); // Read the XML document back in. // Create new FileStream to read schema with. System.IO.FileStream fsReadXml = new System.IO.FileStream (xmlFilename, System.IO.FileMode.Open); // Create an XmlTextReader to read the file. System.Xml.XmlTextReader myXmlReader = new System.Xml.XmlTextReader(fsReadXml); // Read the XML document into the DataSet. newDataSet.ReadXml(myXmlReader); // Close the XmlTextReader myXmlReader.Close(); // Print out values of each table in the DataSet using the // function defined below. PrintValues(newDataSet,"New DataSet"); } private void PrintValues(DataSet ds, string label){

Created by THÁI NGỌC DUY MSDN based-written.

30 4/12/2007

Console.WriteLine("\n" + label); foreach(DataTable t in ds.Tables){ Console.WriteLine("TableName: " + t.TableName); foreach(DataRow r in t.Rows){ foreach(DataColumn c in t.Columns){ Console.Write("\t " + r[c] ); } Console.WriteLine(); } } } m. RejectCanges Huỷ bỏ tất cả những thay ñổi trên DataSet từ khi nó ñược tạo ra, hoặc từ khi lần cuối DataSet.AcceptChanges ñược gọi. Ví dụ sau chỉ ra một lớp kế thừa từ lớp DataSet. Sự kiện RejectChanges ñược gọi bên trong hàm private void RejectChangesInDataSet(){ // Instantiate the derived DataSet. DerivedDataSet myDerivedDataSet = new DerivedDataSet(); // Insert code to change values // Invoke the RejectChanges method in the derived class. myDerivedDataSet.RejectDataSetChanges(); } // +++++++++++++++++++++++++++++++++++++++++++++++ public class DerivedDataSet:System.Data.DataSet { public void RejectDataSetChanges(){ // Invoke the RejectChangesmethod. this.RejectChanges(); } } n. Reset Thiết lập DataSet về trạng thái ban ñầu o. WriteXmlSchema Ghi cấu trúc Xml như một lược ñồ Xml Ví dụ sau tạo ra một ñối tượng System.IO.FileStream mới với ñường dẫn chỉ ra. ðối tượng FileStream ñược dùng ñể tạo một ñối tượng System.Xml.XMLTextWriter. Phương thức WriteXmlSchema ñược gọi bởi ñối tượng XmlTextWriter ñể ghi lược ñồ xuồng ñĩa private void WriteSchemaWithXmlTextWriter(DataSet thisDataSet){ // Set the file path and name. Modify this for your purposes. string filename="mySchema.xml"; // Create a FileStream object with the file path and name. System.IO.FileStream myFileStream = new System.IO.FileStream (filename,System.IO.FileMode.Create); // Create a new XmlTextWriter object with the FileStream. System.Xml.XmlTextWriter MyXmlTextWriter =

Created by THÁI NGỌC DUY MSDN based-written.

31 4/12/2007

new System.Xml.XmlTextWriter(myFileStream, System.Text.Encoding.Unicode); // Write the schema into the DataSet and close the reader. thisDataSet.WriteXmlSchema(MyXmlTextWriter ); MyXmlTextWriter.Close(); } II.1 DataTableCollection II.1.1. Khái niệm Một ADO.NET Dataset chứa một tập hợp 0 hoặc nhiều bảng trình bày bởi ñối tượng DataTable.DataTableCollection chứa tất cả các ñối tượng DataTable trong Dataset Một DataTable ñược ñịnh nghĩa trong namespace System.Data và trình bày một bảng ñơn. Nó chứa một tập hợp các cột là DataColumnCollection và các ràng buộc ñược trình bày bởi ConstraintCollection, nó ñược ñịnh nghĩa với giản ñồ của các bảng. Một DataTable cũng chứa tập hợp các dòng ñược trình bày bởi DataRowCollection, nó chứa dữ liệu trong các bảng. Cùng với trạng thái hiện tại của nó, Datarow nhớ ñược trạng thái hiện tại và trạng thái ban ñầu của nó ñể xác ñịnh những thay ñổi của nó trong những dòng. II.1.2. Thành phần của DataTable collection  Public properties Property Description Lấy tổng số thành phần trong collection Count

IsReadonly(kế thừa từ InternalDataCollectionBase) IsSynchronized(kế thừa từ InternalDataCollectionBase) Item

Lấy giá trị chỉ ra liệu InternalDataCollectionBase là chỉ ñọc hay không Lấy giá trị chỉ ra liệu InternalDataCollectionBase ñược ñồng bộ hay không Lấy một ñối tượng DataTable cụ thể trong collection SyncRoot(kế thừa từ Lấy một ñối tượng mà có thể ñược dùng ñể ñồng InternalDataCollectionBase) bộ collection  Public methods Method Description Add Thêm một ñối tượng DataTable vào collection AddRange Sao chép các thành phần của một mảng ñối tượng DataTable chỉ ñịnh vào cuối của collection CanRemove Kiểm tra liệu ñối tượng DataTable chỉ ñịnh có ñược xoá khỏi collection hay không Clear Xoá tất cả các ñối tượng DataTable trong collection Contains Lấy giá trị cho biết liệu một ñối tượng DataTable với tên chỉ ra có tồn tại trong collection hay không CopyTo Equals Xác ñịnh xem hai thể hiện của ñối tượng có bằng nhau không GetEnumerator(kế thừa từ Lấy một Enumerator cho collection InternalDataCollectionBase) GetHastCode(kế thừa từ Object) GetType(kế thừa từ object) Lấy kiểu của thể hiện hiện tại

Created by THÁI NGỌC DUY MSDN based-written.

32 4/12/2007

IndexOf Remove RemoveAt ToString(kế thừa tử Object)

Lấy chỉ số trong collection của một ñối tượng DataTable cụ thể Xoá một ñối tượng DataTable cụ thể trong collection Xoá một ñối tượng DataTable ở một vị trí cụ thể Trả về một chuỗi trình bày bởi ñối tượng hiện tại

II.1.3. ðối tượng DataTable Một Dataset ñược tạo thành từ một tập hợp các bảng, các quan hệ và các ràng buộc. Trong ADO.NET, các ñối tượng DataTable ñược dùng ñể trình bày các bảng trong DataSet. Một DataTable trình bày một bảng trong DataTableCllection Lớp DataTable là một thành phần của namespace System.Data bên trong thư viện của .NET Framework. Bạn có thể tạo và sử dụng một DataTable một cách ñộc lập hoặc như một thành phần của một Dataset, và các ñối tượng DataTable cũng có thể ñược sử dụng chung với các ñối tượng khác của .NET Framework như là DataView. Bạn có thể truy cập tập hợp các bảng trong Dataset thông qua thuộc tính Tables của ñối tượng DataSet. Lược ñồ, cấu trúc của Table ñược trình bày bởi columns và constraints. Bạn ñịnh nghĩa lược ñồ của DataTable sử dụng các ñối tượng DataColumns, ForeignKeyConstraint và UniqueConstraint. Các cột trong table có thể ánh xạ từ các cột trong nguồn dữ liệu, chứa những giá trị tính toán từ những biểu thức, các giá trị tăng tự ñộng hoặc chứa những giá trị khoá chính. Ngoài những lược ñồ, một DataTable cũng phải có những dòng, dùng ñể chứa và sắp xếp dữ liệu. Lớp DataRow trình bày dữ liệu thật ñược chứa trong bảng. Bạn sử dụng DataRow và những thuộc tính , phương thức của nó ñể truy xuất, ñịnh giá và thao tác dữ liệu trong một bảng. Như bạn truy cập và thay ñổi dữ liệu bên trong một bảng. ðối tượng DataRow giữ lại cả 2 trạng thái hiện tại và trạng thái ban ñầu. Bạn có thể tạo những mối quan hệ cha con giữa những bảng bằng cách sử dụng một hoặc nhiều cột quan hệ trong bảng. Bạn tạo một mối quan hệ giữa các ñối tượng DataTable sử dụng một DataRelation. ðối tượng DataRelation sau ñó ñược sử dụng ñể trả về những dòng quan hệ cha con của một dòng cụ thể. Class DataTable là ñối tượng chính trong thư viện ADO.NET. Các thành phần sử dụng DataTable bao gồm DataSet và DataView. Khi truy cập các ñối tượng DataTable, bạn phải chú ý ñến việc phân biệt chữ hoa chữ thường. Ví dụ nếu có một bảng tên là “mydatatable” và một bảng khác tên là “Mydatatable”. Khi tìm tên bảng, bạn phải quan tâm tới việc phân biệt này. Nếu bạn ñang tạo DataTable bằng cách lập trình, ñầu tiên bạn phải ñịnh nghĩa giản ñồ cho nó bằng cách thêm các ñối tượng DataColumnm vào collection DataColumnCollection(truy cập thông qua thuộc tính columns) ðể thêm các dòng vào DataTable, trước hết bạn phải sử dụng phương thức NewRow ñể trả về một ñối tượng DataRow mới. Phương thức NewRow trả về một dòng với giản ñồ của DataTable, giống như nó ñã ñược ñịnh nghĩa bởi DataColumnCollection của Table. Số dòng lớn nhất mà một DataTable có thể lưu trữ là 16,777,216 DataTable còn chứa một tập hợp các ñối tượng ràng buộc mà có thể ñược sử dụng ñể ñảm bảo tính nhất quán dữ liệu ðể xác ñịnh khi có những thay ñổi ñược làm trên bảng, chúng ta dùng một trong những sự kiện sau: RowChanged, RowChanging, RowDeleting, RowDeleted  Các thành phần của ñối tượng DataTable  Public Constructors  Public properties

Created by THÁI NGỌC DUY MSDN based-written.

33 4/12/2007

Property CaseSensitive ChildRelation Columns Constraints Container(kế thừa từ MarshalByValueCompo nent) Dataset DefaulView DesignMode(kế thừa từ MarshalbyValueCompo nent) DisplayExpression ExtendedProperties HashErrors Locale MinimumCapacity Namespace ParentRelations Prefix PrimaryKey Rows Site TableName  Public method Method AcceptChanges BeginInit BeginLoadData Clear Clone Compute Copy Dispose(kế thừa từ MarshalbyValueCompo nent) EndInit

Description Cho biết liệu chuỗi so sánh bên trong bảng có phân biệt chữ hoa chữ thường hay không Lấy tập hợp các quan hệ con của DataTable này Trả về tập hợp column có trong bảng này Trả về tập hợp các constraint ñược lưu giữ bởi bảng này Trả về Container của thành phần

Trả về Dataset chứa bảng này Trả về cách nhìn tuỳ chọn của bảng Lấy giá trị cho biết liệu thành phần ñang trong chế ñộ thiết kế hay không

Trả về hay thiết lập biểu thức mà sẽ trả về một giá trị dùng ñể trình bày bảng này trong giao diện người dùng Trả về tập hợp thông tin người dùng một cách tuỳ chọn Trả về giá trị cho biết có lỗi nào trong bất kỳ dòng trong bất kỳ bảng của Dataset mà chứa bảng này

Trả về hay thiết lập các không gian tên XML trình bày dữ liệu lưu trữ trong DataTable Trả về tập các quan hệ cha cho DataTable này Trả về hay thiết lập một mảng các columns mà chức năng như một primary key cho bảng dữ liệu Trả về tập hợp các dòng thuộc về bảng này Trả về hay thiết lập tên của DataTable

Description ðảm bảo tất cả những thay ñổi ñã làm trên bảng này kể từ lần cuối AcceptChanges ñược gọi Bắt ñầu khởi tạo DataTable mà ñược sử dụng trên một form hoặc ñược dùng bởi thành phần khác. Khởi tạo xảy ra lúc chạy tắt những thông báo, chỉ mục và ràng buộc trong khi load dữ liệu Xoá dữ liệu của DataTable Lấy cấu trúc của DataTable bao gồm các lược ñồ và các ràng buộc của DataTable Tính toán những giá trị cho trước trên những dòng hiện tại mà ñã ñược lọc ra Copy tất cả cấu trúc và dữ liệu của DataTable này Giải phóng tài nguyên ñược sử dụng bởi MarshalValueComponent Kết thúc việc khởi tạo DataTable mà ñược dùng trên form hoặc

Created by THÁI NGỌC DUY MSDN based-written.

34 4/12/2007

EndLoadData Equals(kế thưà từ Object) GetChanges

GetErrors GetHashCode(kế thừa từ Object) GetService(kế thừa từ MarshalByValueCompo nent) GetType(kế thừa từ Object) ImportRow LoadDataRow NewRow RejectChanges

Reset Select ToString  Public Event Event ColumnChanged

ñược dùng bởi thành phần khác. Việc khởi tạo xảy ra lúc chạy Bật các thông báo, chỉ mục và các ràng buộc sau khi ñã load dữ liệu Xác ñịnh liệu 2 thể hiện của ñối tượng có bằng nhau không Trả về một bảng sao của DataTable chứa tất cả những thay ñổi làm trên nó từ khi nó ñã ñược load lần cuối hoặc từ khi AcceptChanges ñược gọi Trả về một mảng DataRow mà chứa lỗi

Trả về kiểu dữ liệu của thể hiện hiện tại Sao chép một DataRow vào một DataTable Tìm và cập nhật một trường cụ thể, nếu không tìm thấy thì một dòng mới ñược tạo ra sử dụng giá trị cho trước tạo một DataRow mới với cùng lược ñồ của bảng Quay về(huỷ bỏ) tất cả những thay ñổi mà ñã ñược làm trên bảng kể từ khi nó ñược load hoặc lần cuối AcceptChanges ñược gọi Thiết lập lại DataTable về trạng thái ban ñầu của nó Trả về một mảng ñối tượng DataRow

ColumnChanging Dispose(kế thừa từ MarshalByValueComponent) RowChanged RowChanging RowDeleted RowDeleting

Description Xảy ra khi sau khi một giá trị của DataColumn ñược thay ñổi trong DataRow Xảy ra khi một giá trị của DataColumn ñang bị thay ñổi trong DataRow

Xảy ra công Xảy ra Xảy ra Xảy ra

sau khi một DataRow ñược thay ñổi thành khi một DataRow ñang thay ñổi sau khi một dòng trong bảng ñược xoá trước khi một dòng trong table ñang ñược xoá

II.1.4. DataColumnCollection II.1.4.1. Khái niệm Trình bày một tập hợp các ñối tượng DataColumn cho DataTable. DataColumn collection ñịnh nghĩa lược ñồ cho DataTable, và xác ñịnh loại dữ liệu mả DataColumn có thể chứa. Bạn có thể truy cập DataColumnCollection thông qua thuộc tính Columns của ñối tượng DataTable. DataColumnCollection dùng phương thức Add và Remove ñể chèn và xoá các ñối tượng DataColumn. Dùng thuộc tính Count ñể xác ñịnh có bao nhiêu ñối tượng DataColumn trong collection. Dùng phương thức Constraint ñể kiểm tra ñối tượng DataColumn chỉ ra có tồn tại trong collection hay không.

Created by THÁI NGỌC DUY MSDN based-written.

35 4/12/2007

Ví dụ sau in ra các thuộc tính của mỗi cột trong collection private void PrintDataTableColumnInfo(DataTable myTable){ DataColumnCollection cols; // Use a DataTable object's DataColumnCollection. cols = myTable.Columns; // Print the ColumnName and DataType for each column. foreach(DataColumn col in cols){ Console.WriteLine(col.ColumnName); Console.WriteLine(col.DataType); } } Các thành phần của DataColumnCollection cũng giống như các thành phần của một collection khác. mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatacolumncollectionclasst opic.htm II.1.4.2. ðối tượng DataColumn II.1.4.2.1. Khái niệm Trình bày lược ñồ của một cột trong một DataTable. DataColumn là một khối xây dựng có qui tắc cho việc tạo ra lược ñồ cho một DataTable. Bạn xây dựng lược ñồ bằng cách thêm vào một hay nhiều ñối tượng DataColumn vào DataColumnCollection Mỗi DataColumn có một thuộc tính DataType mà xác ñịnh kiểu dữ liệu ñược lưu trữ trong DataColumn. Bạn có thể hạn chế kiểu dữ liệu integers, strings hay decimals. Bởi vì dữ liệu chứa bởi DataTable thuờng ñược trộn lại với nguồn dữ liệu ban ñầu của nó II.1.4.2.2. Các thành phần của ñối tượng DataColumn  Public Properties Thuộc tính Diễn tả AllowDBName Trả về hay thiết lập giá trị cho biết liệu có cho phép một giá trị Null cho cột này hay không AutoIncrement Trả về hoặc thiết lập giá trị cột này có tự ñộng tăng hay không khi một dòng mới ñược thêm vào bảng AutoIncrementSeed Thiết lập hay trả về giá trị ñầu tiên cho một cột và thuộc tính AutoIncrement ñược thiết lập là True AutoIncrementStep Thiết lập hay trả về giá trị mỗi lần tăng Caption Thiết lập hay trả về tiêu ñề của cột ColumnMapping Thiết lập hay trả về MappingType của cột ColumnName Thiết lập hay trả về tên của cột trong DataColumnCollection Container(kế thừa từ Trả về Container của thành phần MarshalByValueComponent) DataType Thiết lập hay trả về kiểu dữ liệu lưu trữ trong cột DefaultValue Thiết lập hay trả về giá trị mặc ñịnh cho cột khi tạo ra một dòng mới DesignMode(kế thừa từ Trả về giá trị cho biết liệu thành phần ñang trong chế MarshalByValueComponent) ñộ thiết kế hay không Expression Thiết lập hay trả về biểu thức dùng ñể lọc dữ liệu, tính toán giá trị trên cột hoặc tạo một cột tính toán ExtendedProperties Trả về collection thông tin người dùng tuỳ chọn

Created by THÁI NGỌC DUY MSDN based-written.

36 4/12/2007

Maxlength Namespace Ordinal Prefix ReadOnly

Thiết lập hay trả về chiều dài tối ña của dữ liệu của cột Thiết lập hay trả về không gian tên của DataColumn Trả về vị trí của cột trong DataColumnCollection Thiết lập hay trả về giá trị cho biết dữ liệu cột là chỉ ñọc hay không Thiết lập hay trả về site của thành phần

Site(kế thừa từ MarshalByValueComponent) Table Trả về tên của bảng chứa cột Unique Thiết lập hay trả về giá trị cho biết liệu giá trị mỗi dòng của cột có là duy nhất hay không

II.1.4.2.3. Ví dụ Ví dụ sau tạo ra một DataTable với vài DataColumn private void MakeTable(DataTable myTable){ // Create a DataTable. DataTable myTable = new DataTable("myTable"); // Create a DataColumn and set various properties. DataColumn myColumn = new DataColumn(); myColumn.DataType = System.Type.GetType("System.Decimal"); myColumn.AllowDBNull = false; myColumn.Caption = "Price"; myColumn.ColumnName = "Price"; myColumn.DefaultValue = 25; // Add the column to the table. myTable.Columns.Add(myColumn); // Add 10 rows and set values. DataRow myRow; for(int i = 0; i < 10; i++){ myRow = myTable.NewRow(); myRow["Price"] = i + 1; // Be sure to add the new row to the DataRowCollection. myTable.Rows.Add(myRow); } } II.1.5. DataRowCollection II.1.5.3. Khái niệm DataRowCollection trình bày tập hợp các dòng trong DataTable. DataRowCollection là thành phần chính của DataTable. Trong khi DataColumnCollection ñịnh nghĩa lược ñồ của bảng, DataRowCollection chứa dữ liệu thật của bảng. Mỗi DataRow trong DataRowCollection trình bày một dòng ñơn. Bạn có thể gọi phương thức Add hay Remove ñể chèn hay xoá các ñối tượng DataRow từ DataRowCollection. Bạn cũng có thể gọi phương thức Find ñể tìm kiếm các ñối tượng DataRow bằng cách chỉ ra giá trị của khoá chính của dòng này II.1.5.4. ðối tượng DataRow II.1.5.4.1. Khái niệm ðối tượng DataRow trình bày một dòng dữ liệu trong DataTable. ðối tượng DataRow và DataColumn là các thành phần chính của một DataTable. Sử dụng ñối tượng DataRow và các thuộc tính, phương thức của nó ñể truy xuất và tính toán, chèn, xoá, cập nhật dữ liệu cho DataTable. DataRowCollection trình bày các ñối tượng DataRow thật sự cho DataTable. II.1.5.4.2. Các thành phần của ñối tượng DataRow  Public properties

Created by THÁI NGỌC DUY MSDN based-written.

37 4/12/2007

Thuộc tính Diễn tả HasErrors Trả về giá trị cho biết liệu có lỗi trong dòng hay không Item Thiết lập hay trả về dữ liệu lưu trữ trong một cột ñặc biệt ItemArray Thiết lập hay trả về tất cả giá trị cho dòng này thông qua một mảng RowError Thiết lập hay trả về mô tả lỗi tuỳ chọn cho một dòng RowState Trả về trạng thái hiện tại của dòng Table Trả về DataTable chứa DataRow này  Public methods Phương thức Diễn tả AcceptChanges ðảm bảo(xác nhận)tất cả những thay ñổi ñã làm trên dòng này từ khi lần cuối AcceptChanges ñược gọi BeginEdit Bắt ñầu thao tác soạn thảo trên ñối tượng DataRow CancelEdit Huỷ bỏ việc soạn thảo hiện tại trên dòng ClearErrors Xoá những lỗi cho dòng, bao gồm RowError và tập các lỗi SetColumnError Delete Xoá DataRow EndEdit Kết thúc việc soạn thảo trên một dòng Equals(kế thừa từ Xác ñịnh liệu hai thể hiện của ñối tượng có bằng nhau hay Object) không GetChildRows Trả về những dòng con của DataRow GetColumnError Trả về một mảng cột mà có lỗi GetHashCode(kế thừa từ Object) GetParentRow Trả về những dòng cha của DataRow GetType(kế thừa Trả về kiểu của thể hiện hiện tại từ Object) HasVersion Trả về một giá trị cho biết một phiên bản chỉ ra có tồn tại hay không IsNull Trả về một giá trị cho biết giá trị của cột có chứa giá trị null hay không RejectChanges Loại bỏ tất cả những thay ñổi ñã làm trên dòng từ jkhi AcceptChanges ñược gọi lần cuối SetColumnError Thiết lập diễn tả lỗi cho một cột SetParentRow Thiết lập dòng cha cho một DataRow ToString II.1.5.4.3. Ví dụ Ví dụ sau tạo ra một DataRow mới bằng cách gọi phương thức NewRow của ñối tượng DataTable private void CreateNewDataRow(){ // Use the MakeTable function below to create a new table. DataTable myTable; myTable = MakeNamesTable(); // Once a table has been created, use the NewRow to create a DataRow. DataRow myRow; myRow = myTable.NewRow(); // Then add the new row to the collection. myRow["fName"] = "John"; myRow["lName"] = "Smith"; myTable.Rows.Add(myRow);

Created by THÁI NGỌC DUY MSDN based-written.

38 4/12/2007

foreach(DataColumn dc in myTable.Columns) Console.WriteLine(dc.ColumnName); dataGrid1.DataSource=myTable; } private DataTable MakeNamesTable(){ // Create a new DataTable titled 'Names.' DataTable namesTable = new DataTable("Names"); // Add three column objects to the table. DataColumn idColumn = new DataColumn(); idColumn.DataType = System.Type.GetType("System.Int32"); idColumn.ColumnName = "id"; idColumn.AutoIncrement = true; namesTable.Columns.Add(idColumn); DataColumn fNameColumn = new DataColumn(); fNameColumn.DataType = System.Type.GetType("System.String"); fNameColumn.ColumnName = "Fname"; fNameColumn.DefaultValue = "Fname"; namesTable.Columns.Add(fNameColumn); DataColumn lNameColumn = new DataColumn(); lNameColumn.DataType = System.Type.GetType("System.String"); lNameColumn.ColumnName = "LName"; namesTable.Columns.Add(lNameColumn); // Create an array for DataColumn objects. DataColumn [] keys = new DataColumn [1]; keys[0] = idColumn; namesTable.PrimaryKey = keys; // Return the new DataTable. return namesTable; } II.2 DataRelationCollection II.2.1. Khái niệm Dataset lưu trữ những mối quan hệ trong ñối tượng DataRelationCollection của nó. Một mối quan hệ ñược biểu diễn bởi một ñối tượng DataRelation, kết hợp những dòng trong DataTable này với những DataTable khác Mối quan hệ (Relationship) cho phép ñiều hướng từ một bảng ñến một bảng khác bên trong Dataset. Những thành phẩn chủ yếu của DataRelation là tên của quan hệ, tên của những bảng quan hệ và những cột quan hệ trong mỗi bảng. Mối quan hệ có thể ñược xây dựng với nhiều hơn một cột cho mỗi bảng bằng cách chỉ ra một mảng các ñối tượng của DataColumn như là những cột chính.. Khi một quan hệ ñược thêm vào DataRelationCollection, nó có thể them vào một UniqueKeyConstraint và một ForeignKeyConstraint ñể ñảm bảo tính toàn vẹn dữ liệu khi có những thay ñổi giá trị trên những cột quan hệ II.2.2. ðối tượng DataRelation Một DataRelation ñược sử dụng ñể quan hệ giữa 2 ñối tượng DataTable với nhau thông qua ñối tượng DataColumn. Ví dụ trong mối quan hệ khách hàng và hoá ñơn, bảng khách hàng là cha và bảng hoá ñơn là con trong mối quan hệ. Mối quan hệ ñược tạo ra giữa những cột tương thích trong bảng cha và bảng con. ðó lả kiểu dữ liệu giữa 2 cột là duy nhất.

Created by THÁI NGỌC DUY MSDN based-written.

39 4/12/2007

Những mối quan hệ cũng có thể xếp tầng những thay ñổi khác nhau từ những dòng dữ liệu cha ñến những dòng dữ liệu con. ðể ñiều khiển cách giá trị bị thay ñổi trong nhũng dòng dữ liệu con, ta thêm vào một ForeignKeyConstraint vào ConstraintCollection của ñối tượng DataTable. ConstraintCollection hoạt ñộng khi dữ liệu trên bảng cha bị xoá hay ñược cập nhật. Khi một DataRelation ñược tạo, ñầu tiên nó kiểm tra xem mối quan hệ ñược tạo hay không. Sau khi nó ñược thêm vào DataRelationCollection. Mối quan hệ ñược duy trì bởi việc không cho phép bất kỳ sự thay ñổi nào mà vi phạm ràng buộc này. Các ñối tượng DataRelation ñược chứa trong DataRelationCollection. Bạn có thể truy cập DataRealtionCollection thông qua thuộc tính Collections của DataSet và thuộc tính ChildRelation and ParentRelation của DataTable private void CreateRelation() { // Get the DataColumn objects from two DataTable objects in a DataSet. DataColumn parentCol; DataColumn childCol; // Code to get the DataSet not shown here. parentCol = DataSet1.Tables["Customers"].Columns["CustID"]; childCol = DataSet1.Tables["Orders"].Columns["CustID"]; // Create DataRelation. DataRelation relCustOrder; relCustOrder = new DataRelation("CustomersOrders", parentCol, childCol); // Add the relation to the DataSet. DataSet1.Relations.Add(relCustOrder); } mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatarelationclasstopic.ht m Các thành phần của ñối tượng DataRelation  Public properties Thuộc tính Diễn tả ChildColumns Trả về các ñối tượng DataColumns con của quan hệ này ChildKeyConstraint Trả về ForeignKeyConstraint cho quan hệ ChildTable Trả về bảng con của quan hệ DataSet Trả về Dataset chứa DataRealtion này ExtendedProperties Trả về tập hợp mà lưu trữ những thuộc tính tuỳ chọn Nested Trả về hoặc thiết lập một giá trị cho biết các ñối tượng DataRelation là ẩn ParentColumns Trả về một mảng ñối tượng DataColumn mà là những cột cha của DataRelation này ParentKeyConstraint Trả về UniqueConstraint mà chắc rằng những giá trị trong cột cha của DataRelation là duy nhất RelationName Trả về hoặc thiết lập tên dùng ñể truy xuất một DataRelation từ DataRelationCollection II.3 Extendedproperties Dataset(cũng như DataTable và DataColumn) có một thuộc tính ExtendedProperties. ExtendedProperty là một PropertyCollection nơi mà bạn có thể ñặc những thông tin tuỳ chọn, như là câu lệnh select mà ñã ñược sử dụng ñể sinh ra kết quả, ngày giờ dữ liệu ñược tạo ra\

Created by THÁI NGỌC DUY MSDN based-written.

40 4/12/2007

III.

.NET Data Provider .Net Data Provider dùng ñể kết nối ñến cơ sở dữ liệu, thực thi những câu lệnh và truy xuất kết quả. Những kết quả ñó hoặc ñược xử lý trực tiếp hoặc ñược giữ trong ADO.NET DataSet. Có 2 loại .NET Data Provider:  OLEDB Data Provider: sử dụng cho các cơ sở dữ liệu OLEDB như Access, DB2,…  SQL Data Provider: sử dụng cho cơ sở dữ liệu SQL Server 7.0 và các phiên bản SQL mới hơn. Mỗi ñối tượng của .NET Data Provider cũng chia ra làm 2 loại: như ñối tượng connection có OleDbConnection và SqlConnection, ñối tượng DataAdapter có OleDbDataAdapter và SqlDataAdapter, ñối tượng Command cũng có OleDbCommnad và SqlCommand, ñối tượng DataReader cũng có OleDbDataReader và SqlDataReader. OleDb Managed-provider Namespace

SqlClient Managed-provider Namespace

ðối tượng Connection III.1 - Thiết lập kết nối ñến nguồn dữ liệu - Chuỗi ConnectionString: Lấy hoặc ñặt chuỗi dùng ñể mở một cơ sở dữ liệu SQL Server public void CreateSqlConnection() { //khai báo và khởi tạo một SqlConnection SqlConnection myConnection = new SqlConnection(); // thiết lập chuỗi ConnectionString myConnection.ConnectionString = "user id=sa;password=aU98rrx2;initial catalog=northwind;data source=mySQLServer;Connect Timeout=30"; //Mở kết nối myConnection.Open(); } Các giá trị bên trong chuỗi ConnectionString  User id: account login vào Sql Server

Created by THÁI NGỌC DUY MSDN based-written.

41 4/12/2007

 Password hay pwd: password của account ñang log on  Initial catalog hay Database: Tên của Database  Data Source | Server | Address | Addr | Network Address: tên thể hiện SQL mà ta sẽ kết nối  Ngoài ra còn các thành phần khác trong chuỗi kết nối như: o Connect Timeout | Connection Timeout:thời gian chờ kết nối o Integrated Security | Trusted_Connection: kết nối bảo mật hay là không bảo mật (true or false) DataAdapter III.2 III.2.1. Khái niệm DataAdapter trình bày một tập các câu lệnh dữ liệu và một kết nối dữ liệu, DataAdapter dùng ñể ñiền dữ liệu vào DataSet và cập nhật dữ liệu vào nguồn dữ liệu. DataAdapter như một cầu nối giữa DataSet và nguồn dữ liệu phục vụ cho việc truy xuất và lưu dữ liệu. DataAdapter dùng phương thức Fill ñể ñiền dữ liệu vào DataSet và sử dụng phương thức Update ñể cập nhật những thay ñổi từ DataSet xuống cơ sở dữ liệu. Tuỳ thuộc vào loại dữ liệu nguồn mà bạn sẽ sử dụng loại DataAdapter phù hợp. Có 2 loại DataAdapter: Các thành phần của DataAdapter III.2.2.  Public properties  AcceptChangesDuringFill: Thiết lập hoặc trả về giá trị cho biết phương thức AcceptChanges có ñược gọi trên DataRow sau khi nó ñược thêm vào DataTable  Container  ContinueUpdateOnError: thiết lập hay trả về giá trị cho biết có cho phép cập nhật dữ liệu trong khi xảy ra lỗi trên DataRow hay không (True/false)  MisssingMapingAction  Site  TableMapings: Trả về một collection mà cung cấp ánh xạ chính giữa một bảng nguồn và một DataTable  Public methods  CreateObjRef:  Dispose(kế thừa từ ñối tượng Component): giải phóng tài nguyên mà ñối tượng sử dụng  Equals(kế thừa từ Object):  Fill: Thêm vào hay làm tươi những dòng dữ liệu trong DataSet ñể hợp với dữ liệu ở cơ sở dữ liệu. Phương thức Fill truy xuất những dòng trong nguồn dữ liệu bằng cách sử dụng câu lệnh Select. ðối tượng Connection kết hợp với câu lệnh Select phải là hợp lệ, nhưng ta không cần phải mở connection, phương thức Fill sẽ tự ñộng mở kết nối nếu kết nối chưa ñược mở, còn nếu kết nối ñã mở thì nó sẽ xác nhận. Sau khi ñã Fill, nó sẽ ñóng kết nối lại. Thao tác Fill sau ñó thêm các dòng vào các ñối tượng DataTable ñích trong DataSet, việc tạo các ñối tượng DataTable nếu chúng chưa tồn tại. Khi tạo các ñối tượng DataTable, thông thường phương thức Fill chỉ tạo tên cột. Tuy nhiên, nếu thuộc tính MissingSchemaAction ñược thiết lập là AddWithKey thì khoá chính và ràng buộc thích hợp cũng ñược tạo ra. Nếu data adapter bắt gặp các cột trùng lắp trong khi nạp dữ liệu cho DataTable, nó sẽ sinh ra một chuỗi cột tuần tự, sử dụng columnname1, columnname2,… Nếu dữ liệu vào chứa những cột không tên thì các cột này sẽ ñược ñặt vào DataSet

Created by THÁI NGỌC DUY MSDN based-written.

42 4/12/2007

theo mẫu column1, column2. Khi nhiều tập kết quả ñược thêm vào DataSet, mỗi tập kết quả ñược ñặt trong một bảng riêng biệt Bạn có thể dùng phương thức Fill nhiều lần trên cùng một DataTable. Nếu một khoá chính tồn tại, các dòng thêm vào ñược trộn với những dòng tương thích mà ñã tồn tại. Nếu chưa tồn tại khoá chính, những dòng thêm vào ñược thêm vào cuối của DataTable mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatacommondataadapterclas sfilltopic.htm  Các cú pháp của phương thức Fill • Cú pháp 1: thêm vào hoặc làm tươi dòng dữ liệu trong DataSet ñể tương thích với chúng trong dữ liệu nguồn, sử dụng tên DataSet và tạo một DataTable tên là “”Table” public override int Fill( DataSet dataSet ); •

Cú pháp 2: Thêm vào hoặc làm tươi dòng dữ liệu trong DataTable ñể tương thích với chúng trong nguồn dữ liệu bằng cách sử dụng tên DataTable public int Fill( DataTable dataTable );



Cú pháp 3: thêm hoặc làm tươi dòng dữ liệu trong DataSet ñể tương thích với chúng trong nguồn dữ liệu sử dụng tên DataSet và tên DataTable public int Fill( DataSet dataSet, string srcTable ); Nếu DataSet tồn tại nhiều DataTable mà tên của các DataTable này chỉ khác nhau về chữ hoa và chữ thường thì khi ta gọi phương thức Fill với 1 DataTable mà tên của DataTable này khác với tất cả các tên DataTable trong Dataset về chữ hoa và chữ thường thì DataTable này sẽ ñược thêm mới. DataSet dataset = new DataSet(); dataset.Tables.Add("aaa"); dataset.Tables.Add("AAA"); // Fills "aaa", DataTable ñã tồn tại trong DataSet adapter.Fill(dataset, "aaa"); adapter.Fill(dataset, "Aaa"); // Thêm một bảng mới Aaa Còn trường hợp Trong DataSet chỉ có một DataTable. Thì khi phương thức Fill ñược gọi với tên của DataTable chỉ khác với tên DataTable trong DataSet về chữ hoa và chữ thường thì phương thức Fill sẽ Fill trên DataTable - DataTable ñã tồn tại trong DataSet DataSet dataset = new DataSet(); dataset.Tables.Add("aaa");

Created by THÁI NGỌC DUY MSDN based-written.

43 4/12/2007



// Fills table "aaa" bởi vì chỉ có 1 tên bảng giống với tên bảng Fill trong DataSet adapter.Fill(dataset, "AAA"); Cú pháp 4: thêm vào hoặc làm tươi dòng dữ liệu trong DataTable ñể tương thích với chúng trong nguồn dữ liệu sử dụng tên của DataTable và tên của IdataReader protected virtual int Fill( DataTable dataTable, IDataReader dataReader );



Cú pháp 5: thêm vào hoặc làm tươi dòng dữ liệu trong dataTable ñể tương thích với chúng trong nguồn dữ liệu sử dụng tên DataTable, câu lệnh Sql Select cụ thể và CommandBehaviour protected virtual int Fill( DataTable dataTable, IDbCommand command, CommandBehavior behavior );  DataTable: tên dataTable ñể ñiền dữ liệu  Command: câu lệnh Sql Select dùng ñể truy xuất dòng dữ liệu từ nguồn dữ liệu  Behaviour: giá trị commandBehaviour. Bạn có thể tham khảo các giá trị của commandBehaviour tại trang

mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatacommandbehaviorclasst opic.htm • Cú pháp 6: thêm vào hay làm tươi dòng dữ liệu trong một vùng cụ thể trong DataSet ñể tương thích với chúng trong nguồn dữ liệu sử dụng tên DataSet và tên DataTable. public int Fill( DataSet dataSet, int startRecord, int maxRecords, string srcTable ); •

Cú pháp 7: thêm hay làm tươi dòng dữ liệu trong một vùng trong DataSet sử dụng tên DataSet, tên DataTable và tên IdataReader protected virtual int Fill( DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords );

Created by THÁI NGỌC DUY MSDN based-written.

44 4/12/2007



Cú pháp 8: thêm hay làm tươi dòng dữ liệu trong một vùng trong DataSet sử dụng tên dataset, tên bảng nguồn, chuỗi command và command behaviour

protected virtual int Fill( DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior ); Bạn có thể tham khảo thêm các cú pháp của phương thức Fill tại ñịa chỉ sau mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatacommondbd ataadapterclassfilltopic.htm  FillSchema: thêm vào một DataTable tên là Table vào một DataSet và cấu hình lược ñồ dựa trên SchemaType cụ thể. public abstract DataTable[] FillSchema( DataSet dataSet, SchemaType schemaType );  GetFillParameters: trả về tham số thiết lập bởi người dùng khi thực thi một câu lệnh SQL SELECT. Trả về một mảng các ñối tượng Idataparameter.  Update: Gọi câu lệnh Insert, Update, Delete tương ứng cho mỗi dòng ñược inserted, updated, deleted trong Dataset từ DataTable public DataSet CreateCmdsAndUpdate(DataSet myDataSet,string myConnection,string mySelectQuery,string myTableName) { OleDbConnection myConn = new OleDbConnection(myConnection); OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(); myDataAdapter.SelectCommand = new OleDbCommand(mySelectQuery, myConn); OleDbCommandBuilder custCB = new OleDbCommandBuilder(myDataAdapter); myConn.Open(); DataSet custDS = new DataSet(); myDataAdapter.Fill(custDS); //viết code ñể cập nhật dữ liệu ở ñây //Without the OleDbCommandBuilder this line would fail myDataAdapter.Update(custDS); myConn.Close(); return custDS; }

Created by THÁI NGỌC DUY MSDN based-written.

45 4/12/2007

III.3 ðối tượng Command III.3.1. ðịnh nghĩa Một Data Command chứa một tham chiếu ñến một câu lệnh Sql hoặc một Stored procedure mà bạn có thể thực thi trực tiếp. Một Data Command là một thể hiện của class OleDbCommand hoặc class SqlCommand Khi làm việc với Data Commands, bạn có thể thực hiện ñược một số tác vụ trên ứng dụng của bạn như:  Thực thi câu lệnh Select mà trả về một kết quả, bạn có thể ñọc trực tiếp mà bạn không phải load nó lên DataSet. ðể ñọc, bạn sử dụng một DataReader(OleDbDataReader hoặc là SqlDataReader). Sử dụng ñối tượng DataReader giúp ta giảm thiểu bộ nhớ và truy xuất dữ liệu một cách nhanh chóng  Thực thi các câu lệnh ñịnh nghĩa cơ sở dữ liệu (DDL) như tạo, cập nhật và xoá bảng, stored procedure và các cấu trúc cơ sở dữ liệu khác(dĩ nhiên là bạn phải có quyền ñể thực hiện các câu lệnh này)  Thực thi các câu lệnh ñể lấy thông tin danh mục  Thực thi các câu lệnh Sql ñộng như update, insert hoặc delete, ta không phải update dataset rồi sau ñó copy những thay ñổi xuống cơ sở dữ liệu  Thực thi các câu lệnh mà trả về giá trị vô hướng (giá trị ñơn), như kết quả của chứng thực thể tính dụng hay một giá trị tính toán  Thực thi các câu lệnh mà trả về dữ liệu từ một cơ sở dữ liệu SQL Server(phiên bản 7.0 hay mới hơn) theo dạng Xml. Cách dùng thông thường là thực thi một câu truy vấn và lấy lại dữ liệu theo dạng Xml  Cách Data Command làm việc Các thuộc tính của Data Command chứa tất cả các thông tin cần thiết ñể thực thi câu lệnh dựa vào cơ sở dữ liệu. Bao gồm:  Connection: Command tham chiếu ñến một connection - ñối tượng này dùng ñể giao tiếp với cơ sở dữ liệu.  Name hoặc text của một câu lệnh: chuỗi trình bày câu lệnh Sql hay là tên của một Stored Procedure  Các tham số(parameters): Một câu lệnh có thể yêu cầu bạn truyền giá trị các tham số. Câu lệnh cũng có thể trả về các giá trị. Mỗi câu lệnh có một tập hợp các tham số mà bạn có thể thiết lập hoặc ñọc một cách riêng biệt ñể truyền hoặc nhận dữ liệu.  Nhiều tập kết quả Cách dùng thông thường của data command là trả về một tập kết quả ñơn. Tuy nhiên data command có thể thực thi những thủ tục mà trả về nhiều tập kết quả. Ta có thể thực hiện ñược theo nhiều cách. Thứ nhất data command tham chiếu ñến một stored procedure mà stored này trả về nhiều tập kết quả. Thứ hai, command có thể chứa 2 hay nhiều câu lệnh hay tên của stored procedure, trong trường hợp này các câu lệnh hay các thủ tục chạy tuần tự và trả về nhiều tập kết quả Việc trả về nhiều tập kết quả cho phép bạn tối ưu cách sử dùng một kết nối mở ñơn của bạn. Thông thường việc sử dụng bao gồm: Việc chạy nhiều câu truy vấn, mỗi câu truy vấn trả về một tập kết quả  riêng biệt Việc chạy một câu lệnh Update hay Insert theo sau bởi câu lệnh Select   Thực thi data command Sau khi thiết lập các thuộc tính của Data command, bạn có thể thực thi Data command. Data command cung cấp 4 phương thức thực thi. Tuỳ thuộc vào câu lệnh và thủ tục ñược thực thi, bạn có thể thực thi và trả về:

Created by THÁI NGỌC DUY MSDN based-written.

46 4/12/2007

 Tập kết quả: trong trường hợp này bạn ñang thực thi một câu lệnh Sql hay một stored procedure mà trả về một hay nhiều mẫu tin. Bạn có thể lấy tập kết quả này bằng cách sử dụng data reader  ðếm những mẫu tin bị ảnh hưởng: tình huống này xảy ra khi bạn thực thi một câu lệnh hay một thủ tục mà cập nhật cơ sở dữ liệu hay làm thay ñổi cấu trúc của cơ sở dữ liệu  Giá trị ñơn; Thực thi trên câu lệnh hay stored procedure mà thực hiện việc tìm kiếm, tính toán một giá trị thích hợp hay giải quyết một giá trị ñơn nào khác  Dữ liệu dưới dạng Xml: Khả năng này chỉ thực hiện ñược trên Sql Server 7.0 trở về sau  Cách Data Adapter sử dụng Data command Data Adapter sử dụng data command ñể ñọc và ghi cơ sở dữ liệu. Data Adapter có thể chứa 4 ñối tượng Data command . Mỗi ñối tượng chứa trong một thuộc tính của Data Adapter: SelectCommand, UpdateCommand, InsertCommand, DeleteCommand. Khi bạn sử dụng Data Adapter, nó thực hiện một cách hiệu quả những thao tác tương tự với command. Ví dụ khi bạn gọi phương thức Fill của Adapter, Adapter thực thi data command trong thuộc tính SelectCommand và sử dụng một data Adapter ñể fill tập kết quả vào table của Dataset mà bạn chỉ ra. Tương tự khi bạn gọi phương thức Update, nó thực thi các câu lệnh thích hợp (trong thuộc tính UpdateCommand, Insertcommand, DeleteCommand) Một ñiểm quan trọng là Data Adapter ñược thiết kế sử dụng command ñể giao tiếp với Dataset. Bằng cách sử dụng Data Command của chính bạn, bạn có thể thực hiện những chức năng tương tự như Data Adapter làm, nhưng khi bạn có nhiều control thì ñối tượng command ñược thực thi khi nào và như thế nào, ñặc biệt là ñiều gì sẽ xảy ra với tập kết quả của command. III.3.2. Các thành phần của ñối tượng Command Như ñã ñề cập trước, mỗi ñối tượng của .NET Data Provider có 2 loại OleDb và Sql. Data command cũng có 2 loại: OleDbCommand và SqlCommand. Ở ñây ta sẽ nghiên cứu SqlCommand.  Public constructor: SqlCommand có nhiều constructor, mỗi loại có một chức năng khác nhau.  Khởi tạo một thể hiện mới của lớp SqlCommand public SqlCommand(); Ví dụ: public void CreateMySqlCommand() { SqlCommand myCommand = new SqlCommand(); myCommand.CommandTimeout = 15; myCommand.CommandType = CommandType.Text; }  Khởi tạo một thể hiện của SqlCommand với chuỗi truy vấn public SqlCommand( string cmdText ); Ví dụ: public void CreateMySqlCommand() { string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID";

Created by THÁI NGỌC DUY MSDN based-written.

47 4/12/2007

SqlCommand myCommand = new SqlCommand(mySelectQuery); myCommand.CommandTimeout = 15; myCommand.CommandType = CommandType.Text; } 

Khởi tạo một thể hiện của class SqlCommand với chuỗi truy vấn và một SqlConnection public SqlCommand( string cmdText, SqlConnection connection ); Ví dụ: public void CreateMySqlCommand() { string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID"; string myConnectString = "user id=sa;password=;database=northwind;server=mySQLServer"; SqlConnection myConnection = new SqlConnection(myConnectString); SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection); myCommand.CommandTimeout = 15; myCommand.CommandType = CommandType.Text; }  Khởi tạo một thể hiện mới của class SqlCommand với chuỗi truy vấn, một SqlConnection và Transaction public SqlCommand( string cmdText, SqlConnection connection, SqlTransaction transaction ); Ví dụ: public void CreateMySqlCommand() { SqlConnection myConnection = new SqlConnection("user id=sa;password=;initial catalog=northwind;data source=mySQLServer"); myConnection.Open(); SqlTransaction myTrans = myConnection.BeginTransaction(); string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID"; SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection,myTrans); myCommand.CommandTimeout = 20; }

 Public Properties Thuộc tính Diễn tả CommandText nhận hoặc trả về câu lệnh T-Sql hay

Created by THÁI NGỌC DUY MSDN based-written.

Ví dụ Mycommand.CommandText=”Select *

48 4/12/2007

CommandTimeout CommandType

Connection

thủ tục ñể thực thi nhận hay trả về thời gian chờ thực thi nhận hay trả về giá trị cho biết loại commandtext ñược gán(các giá trị StoredProcedure, TableDirect,Text. Mặc ñịnh là Text) nhận hay trả về SqlConnection mà command sử dụng

from NhanVien” Mycommand.CommandTimeout=20 Mycommand.CommandType= CommandType.Text myCommand.Connection = new SqlConnection(myConnectString);

Container DesignTimeVisible Parameters trả về SqlParameter collection Site Transaction UpdateRowSource Ví dụ sử dụng các thuộc tính của SqlCommand public void CreateMySqlCommand() { // gán chuỗi truy vấn cho một biến chuỗi string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID"; // chuỗi kết nối string myConnectString = "user id=sa;password=;database=northwind;server=mySQLServer"; // tạo mới một thể hiện của SqlCommand với chuỗi truy vấn SqlCommand myCommand = new SqlCommand(mySelectQuery); //thiết lập thuộc tính Connection của SqlCommand myCommand.Connection = new SqlConnection(myConnectString); // thuộc tính CommandTimeout myCommand.CommandTimeout = 15; // thuộc tính CommandType myCommand.CommandType = CommandType.Text; }  Public methods a. Cancel Huỷ bỏ thực thi của một SqlCommand b. CreateParameter Tạo một thể hiện mới cho ñối tượng SqlParameter. c. ExecuteNonQuery Thực thi một câu lệnh T-SQL dựa vào Connection và trả về số mẫu tin bị ảnh hưởng. Bạn có thể sử dụng phương thức ExecuteNonQuery ñể thực hiện các thao tác catalog(ví dụ việc truy vấn cấu trúc của một cơ sở dữ liệu hoặc tạo các ñối tượng của cơ sở dữ liệu như table) hoặc là thay ñổi dữ liệu không dùng Dataset bằng cách thực thi các câu lệnh Update, Insert và Delete ðối với các câu lệnh Update, Insert và Delete thì giá trị trả về là số dòng bị ảnh hưởng, còn các loại câu lệnh khác thì giá trị trả về là –1 Ví dụ sau sẽ tạo một ñối tượng SqlCommand và thực thi nó sử dụng phương thức ExecuteNonQuery. Ta sẽ truyền vào một chuỗi – là câu lệnh T-SQL (Update, Insert hay Delete)-và một chuỗi dùng ñể kết nối ñến data source. public void CreateMySqlCommand(string myExecuteQuery, SqlConnection myConnection) {

Created by THÁI NGỌC DUY MSDN based-written.

49 4/12/2007

SqlCommand myCommand = new SqlCommand(myExecuteQuery, myConnection); myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myConnection.Close(); } d. ExecuteReader Gửi CommandText ñến Connection và xâ dựng một SqlDataReader Ví dụ sau sẽ tạo một ñối tượng SqlCommand và thực thi nó sử dụng phương thức ExecuteNonQuery. Ta sẽ truyền vào một chuỗi – là câu lệnh T-SQL (Update, Insert hay Delete)-và một chuỗi dùng ñể kết nối ñến data source. CommandBehavious ñược thiết lập là CloseConnection. public void CreateMySqlDataReader(string mySelectQuery,string myConnectionString) { SqlConnection myConnection = new SqlConnection(myConnectionString); SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection); myCommand.Connection.Open(); SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); while(myReader.Read()) { Console.WriteLine(myReader.GetString(0)); } myReader.Close(); myConnection.Close(); }  CommandBehavious: cung cấp một thông báo về tập kết quả của câu truy vấn và ảnh hưởng của nó trên cơ sở dữ liệu. Các thành phần của CommandBehavious Tên thành phần Diễn tả CloseConnection Khi command thực thi, ñối tượng connection ñược ñóng khi ñối tượng DataReader ñược ñóng Default Câu truy vấn có thể trả về nhiều tập kết quả. Việc thực thi có thể tác ñộng ñến trạng thái của cơ sở dữ liệu. Mặc ñịnh khi gọi phương thức ExecuteReader là ExecuteReader(CommandBehavious.Default) KeyInfo Truy vấn trả về thông tin cột và khoá chính. Truy vấn ñược thực thi không cần bất kỳ thao tác khoá trên các mẫu tin ñược chọn SchemaOnly Truy vấn trả về thông tin cột và việc thực thi không tác ñộng ñến trạng thái của cơ sở dữ liệu SequentialAccess Cung cấp cho DataReader một cách giữ các mẫu tin chứa những cột với giá tị binary lớn. Thay vì phải load tất cả các dòng, SequentialAccess cho phép DataReader load tất cả dữ liệu như là một luồng. Sau ñó bạn có thể sử dụng phương thức GetBytes hay GetChars ñể chỉ ra vị trí byte bắt ñầu ñọc , và giới hạn kích thước bô ñệm cho giá trị trả về. SingleResult Truy vấn trả về một tập kết quả ñơn. Việc thực thi của

Created by THÁI NGỌC DUY MSDN based-written.

50 4/12/2007

SingleRow

truy vấn có thể ảnh hưởng ñến trạng thái của Database Truy vấn trả về một dòng ñơn. Việc thực thi của truy vấn có thể tác ñộng ñến trạng thái của database. Ta cũng có thể chỉ ra SingleRow khi thực thi truy vấn mà trả về nhiều tập kết quả. Trong trường hợp này, nhiều tập kết quả vẫn ñược trả về nhưng mỗi tập kết quả chỉ có một dòng ñơn

e. ExecuteScalar Thực thi truy vấn, trả về cột ñầu tiên của dòng ñầu tiên trong tập kết quả trả về của truy vấn, những cột hay những dòng thêm vào ñược bỏ qua. f. ExecuteXmlReader Gửi CommandText tới Connection và xây dựng ñối tượng XmlReader III.4 ðối tượng DataReader Như ñã ñề cập trước, lợi ích của việc dùng Dataset là cho phép ta kết nối ngắt ñoạn với dữ liệu nguồn, chúng ta có thể thao tác dataset trên ứng dụng của chúng ta và sau ñó cập nhật những thay ñổi xuống cơ sở dữ liệu. ðối với những ứng dụng chạy lâu dài thì ñây là hướng giải quyết tốt. ðối với ứng dụng Wed, bạn thường sử dụng những thao tác ngắn với từng yêu cầu (thông thường là chỉ ñể hiển thị dữ liệu). Thông thường bạn không cần giữ dataset. ðối với trường hợp này bạn có thể dùng DataReader. Có 2 loại DataReader là OldDbDataReader và SqlDataReader Một SqlDataReader cung cấp một cách truy xuất dữ liệu forward-only, read – only. ðể dùng SqlDataReader bạn khai báo một SqlCommand thay vì một SqlDataAdapter. SqlCommand cung cấp một phương thức ExecuteReader mà trả về một SqlDataReader. Cũng chú ý là bạn nên mở và ñóng kết nối SqlConnection một cách rõ ràng khi bạn dùng SqlCommand. Sau khi gọi phương thức ExecuteReader, SqlDataReader có thể bound ñến một server control của ASP.NET SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand("select * from Authors", myConnection); myConnection.Open();

SqlDataReader dr = myCommand.ExecuteReader(); ... myConnection.Close(); Bạn sử dụng phương thức Read của ñối tượng DataReader ñể lấy một dòng từ kết quả của truy vấn, bạn có thể truy cập các cột của dòng bằng cách truyền vào tên của cột hay index. Bạn phải luôn luôn gọi phương thức Close klhi bạn không còn sử dụng DataReader. Chú ý là trong khi có một DataReader ñang mở, Connection ñang sử dụng ñộc quyền bởi DataReader. Bạn sẽ không ñược phép thực thi bất kỳ câu lệnh cho Connection, cho dù bạn tạo một DataReader khác, mãi cho ñến khi DataReader ñầu ñược ñóng Nếu nhiều tập kết quả ñược trả về, DataReader cung cấp phương thức NextResult ñể tương tác xuyên qua thứ tự tập kết quả

Created by THÁI NGỌC DUY MSDN based-written.

51 4/12/2007

// select nhiều bảng SqlCommand myCMD = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories;" + "SELECT EmployeeID, LastName FROM Employees", nwindConn); nwindConn.Open(); SqlDataReader myReader = myCMD.ExecuteReader(); do { Console.WriteLine("\t{0}\t{1}", myReader.GetName(0), myReader.GetName(1)); while (myReader.Read()) Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1)); } while (myReader.NextResult()); // Gọi phương thức NextResult myReader.Close(); nwindConn.Close();  Các thuộc tính của Class SqlDataReader Thuộc tính FieldCount IsClosed

Tác dụng Trả về số cột của dòng hiện tại Trả về True khi ñối tượng ñang ñóng, ngược lại trả về False RecordsAffected Trả về số dòng bị ảnh hưởng khi gọi phương thức ExecuteReader của command  Các phương thức của ñối tượng Phương thức Close GetBoolean GetByte GetFloat GetInt16, GetInt32 GetName Read

Tác dụng ðóng ñối tượng SqlDataReader Lấy giá trị của cột chỉ ñịnh theo kiểu Boolean Lấy giá trị của cột chỉ ra theo kiểu Byte GetDouble, GetChar GetString Lấy tên của cột chỉ ñịnh Chuyển ñầu ñọc tới record kế tiếp

[C#] public void ReadMyData(string myConnString) { string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders"; SqlConnection myConnection = new SqlConnection(myConnString); SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection); myConnection.Open(); SqlDataReader myReader;

Created by THÁI NGỌC DUY MSDN based-written.

52 4/12/2007

myReader = myCommand.ExecuteReader(); // Always call Read before accessing data. while (myReader.Read()) { Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1)); } // always call Close when done reading. myReader.Close(); // Close the connection when done with it. myConnection.Close(); } Command Dataset ðể cho phép trang của bạn truy cập ñến những class mà bạn cần ñể thực hiện việc truy cập dữ liệu SQL, bạn phải import 2 namespace là System.Data và System.Data.SqlClient <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> ðể thực hiện một câu truy vấn ñến cơ sở dữ liệu Sql, ta tạo một SqlConnection ñến cơ sở dữ liệu bằng một chuỗi kết nối, và sau ñó ñặt 1 ñối tượng SqlDataAdapter dùng ñể chứa câu truy vấn ñó. ðể thao tác ñối tượng Dataset với kết quả từ câu truy vấn ñó, bạn gọi phương thức Fill của command SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors");

Khi thực hiện một command mà không yêu cầu dữ liệu trả về như insert, update, delete, bạn cũng dùng một SqlCommand. Command ñược thực hiện bằng phương thức ExcuteNonQuery, nó sẽ trả về số dòng bị ảnh hưởng. Chú ý là kết nối phải ñược mở khi bạn dùng SqlCommand SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand( "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '12345-6789'", myConnection); myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close(); Ví dụ sử dụng DataGrid MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind();

Created by THÁI NGỌC DUY MSDN based-written.

53 4/12/2007

Hay MyDataGrid.DataSource=ds; MyDataGrid.DataMember="Authors"; MyDataGrid.DataBind(); Bạn cũng có thể bind trực tiếp ñến SqlDataReader, trong trường hợp này bạn chỉ có thể hiển thị dữ liệu <script language="C#" runat="server"> protected void Page_Load(Object sender, EventArgs e) { SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand("select * from Authors", myConnection); myConnection.Open(); SqlDataReader dr = myCommand.ExecuteReader(); MyDataGrid.DataSource = dr; MyDataGrid.DataBind(); myConnection.Close(); } Thực hiện một câu lệnh có tham số Bạn cũng có thể sử dụng một câu lệnh select có tham số bằng cách sử dụng ñối tượng SqlDataAdapter. Ví dụ sau chỉ ra cách bạn có thể thay ñổi giá trị dữ liệu ñược public void GetAuthors_Click(Object sender, EventArgs E) { String selectCmd = "select * from Authors where state = @State"; SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection); myCommand.SelectCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NVarChar, 2)); myCommand.SelectCommand.Parameters["@State"].Value = MySelect.Value; DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors"); MyDataGrid.DataSource= ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind();

Created by THÁI NGỌC DUY MSDN based-written.

54 4/12/2007

} Thực hiện câu lệnh Insert vào cơ sở dữ liệu ðể chèn một dòng vào cơ sở dữ liệu, bạn có thể chèn một form ñơn giản cho phép người dùng nhập vào, sau ñó thực thi câu lệnh insert trong sự kiện submit. Bạn sử dụng collection Parameters của ñối tượng command. Chúng ta nên thực hiện câu lệnh insert này trong khối try catch ñể tránh trường hợp trùng khoá <script language="C#" runat="server"> SqlConnection myConnection; protected void Page_Load(Object Src, EventArgs E) { myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); if (!IsPostBack) BindGrid(); } public void AddAuthor_Click(Object sender, EventArgs E) { if (au_id.Value == "" || au_fname.Value == "" || au_lname.Value == "" || phone.Value == "") { Message.InnerHtml = "ERROR: Null values not allowed for Author ID, Name or Phone"; Message.Style["color"] = "red"; BindGrid(); return; } String insertCmd = "insert into Authors (au_id, au_lname, au_fname, phone, address, city, state, zip, contract) values (@Id, @LName, @FName, @Phone, @Address, @City, @State, @Zip, @Contract)"; SqlCommand myCommand = new SqlCommand(insertCmd, myConnection); myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11)); myCommand.Parameters["@Id"].Value = au_id.Value; myCommand.Parameters.Add(new SqlParameter("@LName", SqlDbType.NVarChar, 40)); myCommand.Parameters["@LName"].Value = au_lname.Value; myCommand.Parameters.Add(new SqlParameter("@FName", SqlDbType.NVarChar, 20)); myCommand.Parameters["@FName"].Value = au_fname.Value;

Created by THÁI NGỌC DUY MSDN based-written.

55 4/12/2007

myCommand.Parameters.Add(new SqlParameter("@Phone", SqlDbType.NChar, 12)); myCommand.Parameters["@Phone"].Value = phone.Value; myCommand.Parameters.Add(new SqlParameter("@Address", SqlDbType.NVarChar, 40)); myCommand.Parameters["@Address"].Value = address.Value; myCommand.Parameters.Add(new SqlParameter("@City", SqlDbType.NVarChar, 20)); myCommand.Parameters["@City"].Value = city.Value; myCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NChar, 2)); myCommand.Parameters["@State"].Value = state.Value; myCommand.Parameters.Add(new SqlParameter("@Zip", SqlDbType.NChar, 5)); myCommand.Parameters["@Zip"].Value = zip.Value; myCommand.Parameters.Add(new SqlParameter("@Contract", SqlDbType.NVarChar,1)); myCommand.Parameters["@Contract"].Value = contract.Value; myCommand.Connection.Open(); try { myCommand.ExecuteNonQuery(); Message.InnerHtml = "Record Added
" + insertCmd.ToString(); } catch (SqlException e) { if (e.Number == 2627) Message.InnerHtml = "ERROR: A record already exists with the same primary key"; else Message.InnerHtml = "ERROR: Could not add record, please ensure the fields are correctly filled out"; Message.Style["color"] = "red"; } myCommand.Connection.Close(); BindGrid(); } public void BindGrid() {

Created by THÁI NGỌC DUY MSDN based-written.

56 4/12/2007

SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors"); MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); } Updated dữ liệu <script language="C#" runat="server"> SqlConnection myConnection; protected void Page_Load(Object Src, EventArgs E) { myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); if (!IsPostBack) BindGrid(); } public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs e) { MyDataGrid.EditItemIndex = (int)e.Item.ItemIndex; BindGrid(); } public void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs e) { MyDataGrid.EditItemIndex = -1; BindGrid(); } public void MyDataGrid_Update(Object sender, DataGridCommandEventArgs e) { String updateCmd = "UPDATE Authors SET au_id = @Id, au_lname = @LName, au_fname = @FName, phone = @Phone, " + "address = @Address, city = @City, state = @State, zip = @Zip, contract = @Contract where au_id = @Id"; SqlCommand myCommand = new SqlCommand(updateCmd, myConnection); myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11)); myCommand.Parameters.Add(new SqlParameter("@LName", SqlDbType.NVarChar, 40));

Created by THÁI NGỌC DUY MSDN based-written.

57 4/12/2007

myCommand.Parameters.Add(new SqlDbType.NVarChar, 20)); myCommand.Parameters.Add(new 12)); myCommand.Parameters.Add(new SqlDbType.NVarChar, 40)); myCommand.Parameters.Add(new SqlDbType.NVarChar, 20)); myCommand.Parameters.Add(new 2)); myCommand.Parameters.Add(new 5)); myCommand.Parameters.Add(new SqlDbType.NVarChar,1));

SqlParameter("@FName", SqlParameter("@Phone", SqlDbType.NChar, SqlParameter("@Address", SqlParameter("@City", SqlParameter("@State", SqlDbType.NChar, SqlParameter("@Zip", SqlDbType.NChar, SqlParameter("@Contract",

myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)e.Item.ItemIndex]; String[] cols = {"@Id","@LName","@FName","@Phone","@Address","@City","@State","@Zip","@Co ntract"}; int numCols = e.Item.Cells.Count; for (int i=2; i
Created by THÁI NGỌC DUY MSDN based-written.

58 4/12/2007

Message.InnerHtml = "Record Updated
" + updateCmd; MyDataGrid.EditItemIndex = -1; } catch (SqlException exc) { if (exc.Number == 2627) Message.InnerHtml = "ERROR: A record already exists with the same primary key"; else Message.InnerHtml = "ERROR: Could not update record, please ensure the fields are correctly filled out"; Message.Style["color"] = "red"; } myCommand.Connection.Close(); BindGrid(); } public void BindGrid() { SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors"); MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); } Xoá dữ liệu <script language="C#" runat="server"> SqlConnection myConnection; protected void Page_Load(Object sender, EventArgs e) { myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); if (!IsPostBack) BindGrid(); } public void MyDataGrid_Delete(Object sender, DataGridCommandEventArgs e) { String deleteCmd = "DELETE from Employee where emp_id = @Id";

Created by THÁI NGỌC DUY MSDN based-written.

59 4/12/2007

SqlCommand myCommand = new SqlCommand(deleteCmd, myConnection); myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11)); myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)e.Item.ItemIndex]; myCommand.Connection.Open(); try { myCommand.ExecuteNonQuery(); Message.InnerHtml = "Record Deleted
" + deleteCmd; } catch (SqlException) { Message.InnerHtml = "ERROR: Could not delete record"; Message.Style["color"] = "red"; } myCommand.Connection.Close(); BindGrid(); } public void BindGrid() { SqlDataAdapter myCommand = new SqlDataAdapter("select * from Employee", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Employee"); MyDataGrid.DataSource=ds.Tables["Employee"].DefaultView; MyDataGrid.DataBind(); } Sử dụng Stored procedure <script language="VB" runat="server"> Sub Page_Load(Sender As Object, E As EventArgs) Dim DS As DataSet Dim MyConnection As SqlConnection Dim MyCommand As SqlDataAdapter MyConnection = New SqlConnection("server=(local)\NetSDK;database=northwind;Trusted_Connection=ye s")

Created by THÁI NGỌC DUY MSDN based-written.

60 4/12/2007

MyCommand = New SqlDataAdapter("Ten Most Expensive Products", MyConnection) MyCommand.SelectCommand.CommandType = CommandType.StoredProcedure DS = new DataSet() MyCommand.Fill(DS, "Products") MyDataGrid.DataSource=DS.Tables("Products").DefaultView MyDataGrid.DataBind() End Sub

Ví du mẫu using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace WebApplication1 { /// <summary> /// Summary description for WebForm1. /// public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid MyDataGrid; protected System.Web.UI.HtmlControls.HtmlInputButton Button2; protected System.Web.UI.WebControls.DropDownList MySelect; protected System.Web.UI.WebControls.Button Button3; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here //AccessData(); }

Created by THÁI NGỌC DUY MSDN based-written.

61 4/12/2007

private void AccessData() { SqlConnection nwindConn=new SqlConnection(); nwindConn.ConnectionString= "user id=sa;password=;initial catalog=northwind;data source=azsw0131;Connect Timeout=30"; SqlCommand myCMD = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories;" + "", nwindConn); nwindConn.Open(); SqlDataReader myReader = myCMD.ExecuteReader(); do { //Console.WriteLine("\t{0}\t{1}", myReader.GetName(0), myReader.GetName(1)); Page.Response.Write(myReader.GetName(0)+ " " + myReader.GetName(1)+ "\t"); while (myReader.Read()) //Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1)); Page.Response.Write( myReader.GetInt32(0)+ " " + myReader.GetString(1)+ "\t"); } while (myReader.NextResult()); myReader.Close(); nwindConn.Close(); } private void AccessData1() { SqlConnection myConnection = new SqlConnection("user id=sa;pwd=;server=azsw0131;database=pubs;Trusted_Connection=n o"); SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors where state=@state", myConnection); myCommand.SelectCommand.Parameters.Add(new SqlParameter("@state",SqlDbType.NVarChar,2)); myCommand.SelectCommand.Parameters["@state"].Value=My Select.SelectedIndex; DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors");

MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); myConnection.Close(); }

Created by THÁI NGỌC DUY MSDN based-written.

62 4/12/2007

private void BindData1() { SqlConnection myConnection = new SqlConnection("user id=sa;pwd=;server=azsw0131;database=pubs;Trusted_Connection=n o"); SqlCommand myCommand1 = new SqlCommand("select state from Authors", myConnection); myConnection.Open(); SqlDataReader dr1=myCommand1.ExecuteReader(); MySelect.Items.Add("CA"); MySelect.Items.Add("US"); //MySelect.DataBind(); dr1.Close(); myConnection.Close(); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Button2.ServerClick += new System.EventHandler(this.Button2_ServerClick); this.Button3.Click += new System.EventHandler(this.Button3_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { AccessData(); } private void Button2_ServerClick(object sender, System.EventArgs e) {

Created by THÁI NGỌC DUY MSDN based-written.

63 4/12/2007

AccessData1(); } private void Button3_Click(object sender, System.EventArgs e) { BindData1(); } } }

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

BÁO CÁO KẾT QỦA NGHIÊN CỨU A. Mục ñích nghiên cứu: Tìm hiểu phương pháp triển khai một ứng dụng Web trong Visual Studio.NET, bao gồm: - Các công cụ hỗ trợ triển khai. - Sử dụng các công cụ ñóng gói ứng dụng ASP.NET B. Báo cáo chi tiết: I. Phương pháp triển khai một ứng dụng trong Visual Studio.NET: 1. Nhng tính năng c bn v trin khai mt ng d ng trong .NET Framework: .NET Framework cung cấp một số tính năng cơ bản ñể dễ dàng thực thi một ứng dụng. Những tính năng này bao gồm: - Các ứng dụng không tác ñộng Tính năng này cung cấp việc cô lập ứng dụng và vô hiệu hoá sự xung ñột DLL - Mặc ñịnh là các thành phần riêng: Mặc ñịnh, các thành phần ñược triển khai tới thư mục của ứng dụng và chỉ hiện hữu với ứng dụng ñó - ðiểu khiển sự chia sẻ code - Version cùng tồn tại: Các version của cùng một thành phần hoặc ứng dụng có thể cùng tồn tại, bạn có thể chọn version ñể sử dụng - Tái tạo và triển khai bằng XCOPY: Các thành phần tự mô tả và tự chứa ñựng có thể ñược triển khai mà không cần ñăng ký registry hay chịu sự phụ thuộc nào - Dễ dàng cập nhật: Admin có thể sử dụng các host, ví dụ như ASP.NET, ñể cập nhật DLLs, thậm chí các máy tính từ xa. - Tích hợp với Microsoft Windows Installer: - Dễ dàng triển khai: Phân phối phần mềm dễ dàng, bao gồm cả sử dụng Active Directory - Code cục bộ: ðịnh danh dựa trên code hơn là dựa vào user, cách giải quyết ñược ñặt bởi admin. 2. ðóng gói và trin khai ng d ng . NET Framework:  ðóng gói: .NET Framework cung cấp một số tùy chọn sau cho việc ñóng gói ứng dụng:

Created by THÁI NGỌC DUY MSDN based-written.

64 4/12/2007

- Assembly ñơn hoặc bộ sưu tập các assembly: Với tùy chọn này, việc ñóng gói tạo ra file .dll hoặc . exe - Tập tin CAB(cabinet): Tạo thành file nén ñể giảm thời gian phân phối hoặc download - Gói Microsoft Windows Installer hoặc theo một ñịnh dạng installer khác: Tạo thành file .msi ñể sử dụng trong Windows Installer hoặc một file khác sử dụng bởi một installer nào ñó. 

Phân phối: .NET Framework cung cấp một số tùy chọn sau cho việc phân phối ứng dụng: - Sử dụng XCOPY hoặc FTP: Bởi vì những ứng dụng Common Language Runtime là tự mô tả và không cần ñăng ký registry, bạn có thể sử dụng XCOPY hoặc FTP ñể copy ứng dụng tới một thư mục thích hợp, và ứng dụng có thể chạy từ thư mục ñó. - Sử dụng code download: Nếu bạn phân phối ứng dụng qua Internet, bạn có thể download code vào máy và chạy ứng dụng ñó. - Sử dụng các chương trình cài ñặt (ví dụ như Windows Installer 2.0): Windows Installer 2.0 có thể cài ñặt, sửa chửa, hoặc xoá các assembly của Microsoft .NET Framework ở nơi lưu giữ assembly toàn cục và trong các thư mục riêng. 3. Gi i thi u Microsoft Windows Installer: Triển khai là quá trình phân phối một ứng dụng hoặc một component hoàn chỉnh ñể cài ñặt vào các máy khác. Trong VS.NET, sự triển khai dựa vào kỹ thuật Microsoft Windows Installer. ðây là nhưng công cụ tạo installers cho các ứng dụng hoặc components Windows-based hoặc Web-based Microsoft Window Installer: MWI là một dịch vụ cài ñặt và cấu hình, nó là một phần của Windows 2000, Windows Me, Windows XP. Windows Installer dựa trên mô hình data-driven cung cấp tất cả dữ liệu của quá trình cài ñặt và sự chỉ dẫn trong ñóng gói. Với Windows Installer, mỗi computer lưu giữ một CSDL lưu trữ thông tin những ứng dụng ñã ñược cài ñặt bao gồm files, registry keys và components. Khi một ứng dụng uninstall, thì CSDL này kiểm tra sự phụ thuộc của các ứng dụng khác tới các files, registry keys, components này trước khi thực hiện uninstall. Windows Installer còn cung cấp khả năng tự sửa chửa (self-repair) cho phép ứng dụng tự ñộng cài ñặt lại khi bị mất hoặc thiếu file. Các công cụ triển khai ứng dụng trong VS.NET ñược xây dựng dựa trên nền tảng của Windows Installer, cung cấp nhiều khả năng triển khai và bảo trì ứng dụng 4. Trin khai ng d ng: Triển khai là quá trình mà bạn phân phối một ứng dụng hoặc component hoàn chỉnh ñể cài ñặt vào các máy khác. Trước khi bạn triển khai một giải pháp, bạn cần phải cho Visual Studio biết cái gì cần triển khai, nơi triển khai và cách triển khai nó. Bạn làm ñiền này bằng cách thêm một hoặc nhiều dự án triển khai vào trong giải pháp của bạn. Mỗi dự án triển khai chỉ rõ những dòng lệnh ñể cài ñặt các files và components vào một máy. ðể phân phối ứng dụng, bạn thường tạo một dự án triển khai cách biệt cho mỗi tầng trong ứng dụng. Ví dụ như một ứng dụng 3 tầng cần 3 dự án triển khai, một cho dữ liệu, một cho bussiness logic và một cho client. 

Assemblies: Các components thì ñược ñóng gói trong các assemblies. Assemblies là các khối ñược xây dựng của các ứng dụng .NET có thể dùng lại, có thể thay ñổi phiên bản, và tự mô tả. Một assembly là một collection của các

Created by THÁI NGỌC DUY MSDN based-written.

65 4/12/2007

kiểu(type) và resource mà chúng ta xây dựng ñể làm việc với nhau và tạo thành các nhóm chức năng. Một assembly cung cấp Common Language Runtime với các thông tin cần ñể nhận ra sự thi hành các kiểu. Một assembly ñơn giản nhất là một bộ thực thi ñơn chứa tất cả các thông tin cần thiết cho việc triển khai và phiên bản ứng dụng, một kiểu thì không tồn tại bên ngoài bối cảnh của 1 assembly. 

Các thao tác trong triển khai:  Tạo hoặc thêm một dự án triển khai: Những dự án triển khai cho phép bạn chỉ rõ nơi và cách mà giải pháp sẽ triển khai suốt và sau quá trình phát triển. Một giải pháp có thể có nhiều dự án triển khai. Mỗi dự án có thể ñộc lập về cấu hình. ðể tạo mới một dự án triển khai, thực hiện các bước sau: a. Chọn File Add New Project b. Trong hộp thoại Add New Project, chọn danh mục Setup and Deployment Projects c. Chọn kiểu dự án triển khai mà bạn muốn. Các kiểu này bao gồm: - Merge Module Project: ðóng gói các component ñể có thể chia sẻ với nhiều ứng dụng. - Setup Project: Xây dựng bộ cài ñặt cho ứng dụng Windows-based. - Web Setup Project: Xây dựng bộ cài ñặt cho ứng dụng Web. - Cab Project: Tạo một file Cabinet ñể có thể download trên trình duyệt Web. ðể thêm một dự án triển khai ñã có sẳn vào giải pháp: a. Chọn File Add Existing Project. b. Trong hộp thoại Add Existing Project, browse ñến vị trí của dự án triển khai và chọn Open.  Tạo hoặc thêm một dự án Setup: Dự án Setup dùng ñể tạo ra file Windows Installer (.msi) dùng ñể phân phối ứng dụng ñể cài ñặt tới máy khác hoăc Web Server. Có 2 loạt dự án Setup: Dự án Setup tiêu chuẩn tạo ra bộ cài ñặt ñể cài ñặt ứng dụng Windows vào máy khác, dự án Web Setup tạo bộ cài ñặt ñể cài ñặt ứng dụng Web vào Web Server. ðể tạo mới một dự án Setup: a. Chọn File Add New Project. b. Trong hộp thoại Add New Project, chọn danh mục Setup and Deployment Projects. c. Chọn Setup Project cho dự án Setup tiêu chuẩn, Web Setup Project cho dự án Web Setup. ðể thêm một dự án Setup ñã có sẵn vào giải pháp: a. Chọn File Add Existing Project. b. Trong hộp thoại Add Existing Project, browse tới vị trí của dự án Setup và chọn Open.  Tạo mới hoặc thêm một dự án Merge Module: Dự án Merge Module ñược dùng ñể ñóng gói các files hoặc components dùng ñể chia sẻ giữa các ứng dụng. Nó tạo ra file Merge Module (.msm) và bao gồm các files, tài nguyên, mục vào registry(registry entries) và Setup Logic cho component. File .msm có thể trộn (merged) với các dự án triển khai khác, ñảm bảo sự cài ñặt component truy cập nhiều ứng dụng. ðể tạo mới một dự án Merge Module:

Created by THÁI NGỌC DUY MSDN based-written.

66 4/12/2007

a. Chọn File Add New Project b. Trong hộp thoại Add New Project, chọn Setup and Deployment Projects. c. Chọn Merge Module Project. ðể thêm một dự án Merge Module ñã có sẵn vào giải pháp: a. Chọn File -> Add -> Existing Project. b. Trong hộp thoại Add Existing Project, browse tới vị trí của dự án Merge Module và chọn Open.  Tạo mới hoặc thêm một dự án CAB: Dự án CAB dùng ñể tạo file cabinet (.cab), dùng ñể download các components tới một trình duyệt Web. ðể tạo mới một dự án CAB: a. Chọn File Add New Project. b. Trong hộp thoại Add New Project, chọn Setup and Deployment Projects. c. Chọn Cab Project. ðể thêm một dự án CAB ñã có sẳn vào giải pháp: a. Chọn File Add Existing Project. b. Trong hộp thoại Add Existing Project, browse tới vị trí của dự án CAB và chọn Open.  ðặt các thuộc tính cho dự án triển khai: Các dự án triển khai có 2 loại thuộc tính: Thuộc tính dự án chung và thuộc tính cấu hình phụ thuộc. Thuộc tính chung ñươc ñặt trong của sổ Properties và áp dụng cho tất cả cấu hình dự án, ñể ñặt thuộc tính cấu hình phụ thuộc, sử dụng hộp thoại Deployment Properties, thuộc tính này áp dụng cho 1 cấu hình dự án riêng. ðể ñặt thuộc tính cấu hình phụ thuộc: a. Chọn View -> Property Pages. b. Chọn một cấu hình từ danh sách các cấu hình (Configuration list). c. Chọn một category trong danh sách các categories. Thuộc tính của category ñược chọn sẽ hiển thị  Thêm các items vào dự án triển khai: ðể tạo bộ cài ñặt, bạn cần phải chỉ rõ những gì chứa trong bộ cài ñặt và nơi mà nó sẽ cài ñặt vào máy. ðể làm ñiều này chúng ta thêm các items vào dự án triển khai. Các loại items chúng ta có thể thêm vào dự án triển khai bao gồm: Project outputs, files, Merge Modules và các components. ðể thêm một Project output hoặc file vào dự án triển khai: a. Chọn File System Editor: Một dự án triển khai bao gồm 6 trình soạn thảo (editor), ñó là: File System Editor, Registry Editor, File Types Editor, User Interface Editor, Custom Action Editor và Launch Conditions Editor. ðối với dự án Merge Module thì không có User Interface Editor, dự án CAB thì không có một editor nào. Khi một dự án triển khai ñược thêm vào giải pháp thì File System Editor ñược hiển thị mặc ñịnh. ðể mở một trình soạn thảo: - Chọn dự án triển khai trong Solution Explorer

Created by THÁI NGỌC DUY MSDN based-written.

67 4/12/2007

- Chọn View Editor và nhấp chuột vào tên của trình soạn thảo mà bạn muốn mở. b. Chọn 1 folder trên máy ñích nơi mà item sẽ ñược cài ñặt. Bạn có thể tạo mới hoặc xoá các folder trên máy ñích. Mặc ñịnh thì File System Editor hiển thị một tập chuẩn các folder ñại diện cho cấu trúc các folder trên máy ñích. Có 2 loại folder là Special folder và Custom folder: - Special folders là những folder trong File System Editor ñại diện cho những folder ban ñầu trong Windows. Sử dụng Special folder trong dự án triển khai cho phép bạn chọn folder ñích trong máy ñích mà không cần biết ñường dẫn thực sự của nó. - Custom folders là các folder ñặc biệt ñại diện cho các folder trong máy ñích. Khác với Special folders, Custom folder không phụ thuộc vào các folder có sẳn, nó cho phép bạn tạo mới một folder trong quá trình cài ñặt. ðể thêm một Special folder: - Trong Folder List của File System Editor, chọn File System on Target Machine. - Trong menu Action, chọn Add Special Folder, nhấp chọn loạI Special folder. ðể thêm một Custom folder: - Trong Folder List của File System Editor, chọn File System on Target Machine. - Trong menu Action, chọn Add Special Folder, nhấp chọn Custom Folder hoặc Web Custom Folder. - Gõ vào tên của custom folder. ðể thêm một Subfolder: - Chọn một folder trong File System Editor - Trong menu Action, chọn Add Folder - Gõ vào tên của folder ðể xoá một folder: - Chọn 1 folder và chọn Delete trong menu Edit c.

Trong menu Action, chon Add Project Output (hoặc File). Chọn item cần thêm trong hộp thoại.

ðể thêm một Merge Module hoặc component vào dự án triển khai: a. Chọn dự án triển khai trong Solution Explorer. b. Trong menu Project, chọn Add Merge Module (hoặc Component). Chọn item cần thêm trong hộp thoạI  Thêm và xoá các icons: Icons ñược cài ñặt và kết hợp với ứng dụng ở máy ñích trong suốt quá trình cài ñặt. Bạn có thể chọn các icon xuất hiện trong cửa sổ Windows Explorer của máy ñích, bạn cũng có thể chọn icon xuất hiện trong hộp thoạI Add/Remove Programs. ðể làm ñiều này, ta thiểt lập thuộc tính Icon hoặc AddRemoveProgramsIcon. ðể thêm một Icon vào ứng dụng: a. Tạo một shortcut cho ứng dụng trong File System Editor, bằng cách: - Trong File System Editor, chọn file hoặc folder bạn muốn tạo shortcut. Chú ý khi tạo shortcut cho Special folder, phải gán thuộc tính AlwaysCreate của folder = True.

Created by THÁI NGỌC DUY MSDN based-written.

68 4/12/2007

- Trong menu Action, chọn Create Shortcut to. Shortcut xuất hiện trong File List. - Chọn shortcut, và chọn menu Edit Cut. - Trong Folder List, chọn folder muốn hiển thị shortcut, chọn Edit Paste. Xoá shortcut bằng cách chọn shortcut trong File List và chọn Edit Delete. b. Chọn shortcut trong File System Editor c. Trong cửa sổ Properties, chọn thuộc tính Icon Browse. d. Trong hộp thoại Icon, chọn Browse. e. Trong hộp thoại Select item in project, chọn folder và chọn file chứa Icon. ðể thêm một Icon Add/Remove Programs vào ứng dụng: a. Chọn dự án Setup hoặc Web Setup trong Solution Explorer. b. Trong cửa sổ Properties, chọn thuộc tính AddRemoveProgramsIcon Browse. c. Trong hộp thoại Icon, chọn Browse d. Trong hộp thoại Select item in project, chọn folder và chọn file chứa Icon. ðể xoá một Icon: Trong cửa sổ Properties, chọn thuộc tính Icon hoặc AddRemoveProgramsIcon, sau ñó chọn None trong danh sách. 

Các phương thức khác của việc triển khai: Có một số phương thức khác của việc triển khai một ứng dụng. Trong hầu hết các trường hợp, các công cụ triển khai cung cấp nhiểu bộ cài ñặt mạnh. Tuy nhiên, trong vài trường hợp ñơn giản thì các phương thức có thể thích hợp. 





IV.

Lệnh Copy Project: ðối với dự án Web, lệnh Copy Project ñược hiển thị trong menu Project. Copy Project là một cách ñơn giản ñể sao chép nội dung dự án tới Web Server, nhưng nó không tự ñộng cấu hình thư mục IIS (Internet Information Service). Mặc ñịnh thì lênh Copy Project tạo một ứng dụng Web mới ở Server ñích và chỉ copy những file yêu cầu ñể chạy ứng dụng. ðể sử dụng lệnh Copy Project thì FrontPage Server Extensions phải ñược cài ñặt trên Server ñích. Những bước cơ bản ñể copy một dự án vào server: a. Trong menu Project, chọn Copy Project. b. Chọn thư mục dự án ñích. c. Chọn phương thức truy cập Web. d. Chọn file cần copy Lệnh XCOPY: Lệnh XCOPY là một cách ñơn giản ñể copy một dự án hoặc một ứng dụng từ vị trí này tới vị trí khác. XCOPY không ñăng ký vị trí của assemblies, và với ứng dụng Web nó không tự ñộng cấu hình thư mục IIS Third-party Installation Tools: Các công cụ này ủng hộ các tính năng của Windows Installer, không ñược ủng hộ bởi sự triển khai trong Visual Studio.

Triển khai ứng các ứng dụng ứng WEB Projects: 1. Làm vi c v i WEB Projects:

Created by THÁI NGỌC DUY MSDN based-written.

69 4/12/2007

Các ứng dụng Web ASP.NET và các dịch vụ Web XML cho phép bạn tạo ra các ứng dụng ñể nâng cao năng lực của World Wide Web. Các loại dự án này ñược chạy trên một Web Server, chuyển và nhận thông tin thông qua các giao thức chuẩn như HTTP và XML. Sử dụng Web Projects, bạn có thể tạo ñược mọi thứ từ Web site truyền thống phục vụ những trang HTML ñể nâng cao tính năng của các ứng dụng kinh doanh chạy trên mạng intranet hoặc Internet… Visual Basic và Visual C# bao gồm các template cho phép bạn tạo ra 3 loại dự án Web-based: - ASP.NET Web Application template: Lập trình ứng dụng Web với các designer ñể tạo ra các Web Forms page kết hợp các tính năng của ASP.NET - ASP.NET Web Server template: Một ứng dụng cung cấp khả năng trao ñổi thông báo giữa các trang Web sử dụng các giao thức như HTTP, XML, XSL, SOAP và WSDL. - Empty Web Project template: Một ứng dụng Web rỗng mà bạn có thể tùy chỉnh 2. Biên d ch và trin khai ng d ng WEB Projects: Visual Studio cung cấp một cơ cấu ñơn giản ñể triển khai các ứng dụng tới các máy cục bộ hoặc các máy remote. Bạn có thể cài ñặt ứng dụng bằng cách ñơn giản là sao chép chúng vào các thư mục ứng dụng ñã ñược chỉ rõ hoặc bằng cách sử dụng nhiều dự án triển khai chuyên dụng và có thể cấu hình ñược Khi sử dụng Visual Studio.Net ñể xây dựng các ứng dụng Web ASP.NET, bạn sử dụng một mô hình triển khai tổng quát, dự án sẽ ñược biên dịch và các file kết quả sẽ ñược triển khai. Web Forms code trong class file (.aspx.vb hoặc là . aspx.cs) ñược biên dịch vào một file .dll. File này sau ñó sẽ triển khai tới Server mà không có source code nào. Khi một yêu cầu trong trang ñược nhận, file .dll sẽ ñược thực thi. Biên dịch và triển khai: Giả sử bạn có một ứng dụng Web ASP.NET ñơn giản gọi là WebApplication1 bao gồm: - Một Web Forms page tên là WebForm1.aspx - Một số module thêm vào chứa business logic gọi là BusinessLogic1(.vb hoặc .cs) và BusinessLogic2(.vb hoặc .cs). Sau khi bạn hiệu chỉnh và biên dịch dự án: - Tất cả các file trong dự án ñược lưu lại từ lần build cuối cùng. - File WebForm1.aspx và các file mặc ñịnh của dự án ñược copy vào Web server. File Class WebForm1(.aspx.vb hoặc .aspx.cs), component BusinessLogic1 và component BusinessLogic2 ñược biên dịch trong file .dll, file này ñược copy mặc ñịnh vào thư mục \Bin của thư mục ảo Triển khai một ứng dụng ASP.NET: - ðóng gói thành file chạy .exe hoặc file .dll - Phân phối: Sử dụng XCOPY hoặc FTP Bạn có thể sử dụng XCOPY hoặc FTP ñể triển khai một ứng dụng ASP.NET tới server. Bạn có thể chạy một phiên bản của ứng dụng bên cạnh phiên bản khác, bạn có thể update ứng dụng mà không phải ñóng ứng dụng. Common Laguage Runtime chạy một ứng dụng ñồng thời với các ứng dụng khác mà không có sự xung ñột về DLL Triển khai các ứng dụng XML Web Services:

Created by THÁI NGỌC DUY MSDN based-written.

70 4/12/2007

Triển khai một ứng dụng XML Web Service bao gồm việc sao chép file .asmx và các assembly khác ñược sử dụng bởi XML Web Service (nhưng không phải là thành phần của .NET Framework) tới Web server. VD: Giả sử bạn có một XML Web Service tên là StockServices. ðể triển khai XML Web Service, bạn tạo một thư mục ảo trên Web server và ñặt file .asmx vào thư mục ñó. Một cách triển khai ñiển hình gồm cấu trúc thư mục sau:

\Inetpub \WWWRoot \StockServices StockServices. Asmx \Bin Assembly sử dụng bởi XML Web Services không phải là thành phần của .NET Framework. Các mục ñược triển khai tới Web Server khi công bố một XML Web Service:

7.1

Mục

7.2

Thư mục ứng dụng Web

Tập tin <MyXMLWebSevice>.asmx Tập tin <MyXMLWebService>.disco

Tập tin Web.config Thư mục \Bin

Mô tả

Thư mục gốc của XML Web Service. Các file còn lại ñược ñặt trong thư mục này. Thư mục này có thể Gõ dấu là một ứng dụng Web IIS. URL ñể client gọi XML Web Service Cơ chế discovery của XML Web Service(file này là tùy chọn, không ñược tự ñộng tạo ra bởi XML Web Service) (Tùy chọn) Nếu bạn muốn ghi ñè các thiểt lập mặc ñịnh vể cấu hình, bạn có thể bao gồm file Web.config Lưu giữ các file nhị phân của XML Web Service. Nếu lớp XML Web Service không có cùng file .asmx thì assembly chứa lớp phải là thư mục \Bin

3. Ví d trin khai ng d ng WEB Project: Ví dụ sau ñây chúng ta sẽ tạo một ứng dụng Web Forms ñơn giản sử dụng Visual Basic, và tạo bộ cài ñặt ñể triển khai ứng dụng tới Web server.  Tạo ứng dụng Web Forms:  Trong menu File, chọn New Project  Trong hộp thoại New Project, chọn Visual Basic Projects trong ô Project Types và chọn ASP.NET Web Application trong ô Templates. Gõ http://localhost/WebApp1 vào ô Location. Dự án ñược thêm vào Solution Explorer và Web Forms Designer ñược mở  Chọn tab Web Forms trong Toolbox và chọn Button kéo vào Web Form.  Nhấp ñúp Button và thêm sự kiện handler cho(even handler) Button. Trong even handler, gõ vào ñoạn mã sau:

8

Button1.Text = “abc” ðiều này sẽ làm thay ñổI text hiển thị trên Button1 khi nó ñược click  Trong menu Build, chọn Build WebApp1

Created by THÁI NGỌC DUY MSDN based-written.

71 4/12/2007



Tạo dự án triển khai (Deployment project):  Trong menu File, chọn Add Project New Project.  Trong hộp thoại Add New Project, chọn Setup and Deployment Projects trong ô Project Type và chọn Web Setup Project trong ô Templates. Gõ WebDeploy vào ô Name. Dự án ñược thêm vào Solution Explorer, và File Systems Editor ñược mở.  Trong cửa sổ Properties, chọn thuộc tính ProductName và gõ vào WebApp1.



Thêm thông tin dự án WebApp1 vào dự án triển khai:  Trong File Systems Editor, chọn thư mục Web Application. Chọn menu Action Add Project Output.  Trong hộp thoại Add Project Output Group, chọn WebApp1 từ danh sách drop-down Project.  Chọn Primary Output và nhóm Content Files từ danh sách drop-down và click OK.



ðặt thuộc tính cho Installer:  Chọn thư mục WebApplication. Trong cửa sổ Properties, ñặt giá trị xyz cho thuộc tính VirtualDirectory.  Trong cửa sổ Properties, ñặt giá trị cho thuộc tính DefaultDocument là WebForm1.aspx.  Trong menu Build, chọn Build WebDeploy.



Triển khai ứng dụng tới Web server trong máy của bạn:  Trong Solution Explorer, chọn dự án WebDeploy. Chọn Install từ menu Project.  ðể truy nhập ứng dụng Web ñã ñược triển khai, mở Internet Explorer gõ vào ñịa chỉ http://localhost/xyz. Trong trang Web hiện lên, bạn sẽ thấy text của button thay ñổi khi click vào nó



Triển khai ứng dụng tới Web server trong máy khác:  Trong Windows Explorer, chỉ tới thư mục của dự án và tìm Installer ñã ñược build. ðường dẫn mặc ñịnh sẽ là: \documents and settings\yourloginname\ My Documents\Visual Studio Projects\WebDeploy\project configuration\WebDeploy.msi. Project Configuration mặc ñịnh là Debug.  Sao chép file WebDeploy.msi và tất cả các file và thư mục con trong thư mục vào Web server của máy ñích  Trong máy Web server, nhấp ñúp file Setup.exe ñể chạy installer. Lưu ý là bạn phải có Install permissions ñể chạy installer, và bạn phải có IIS permissions ñể cài ñặt vào Web server  ðể truy cập ứng dụng Web ñã ñược triển khai, mở Internet Explorer, gõ vào ñịa chỉ http:// [ComputerName]/xyz.



Uninstall ứng dụng:

Created by THÁI NGỌC DUY MSDN based-written.

72 4/12/2007

Trong Windows Control Panel, nhấp ñúp Add/Remove Programs  Trong hộp thoại Add/Remove Programs, chọn WebApp1 và chọn Remove. ðể uninstall từ máy của bạn, chọn Project Uninstall



4. Làm vi c v I các Editor trong d án Setup: Một dự án triển khai có tất cả 6 editor là: File System Editor, Registry Editor, File Type Editor, User Interface Editor, Custom Actions Editor và Launch Conditions Editor. a. File System Editor: Cho phép bạn thêm Project outputs, files và các items khác vào dự án triển khai và ñịnh nghĩa nơi nó ñược cài ñặt. Mặc ñịnh thì File System Editor một tập chuẩn các thư mục phù hợp với cấu trúc thư mục chuấn trên máy ñích. Bạn có thể thêm một thư mục con vào thư mục nào ñó, chọn thư mục ñặt biệt từ danh sách hoặc thêm một folder vào vị tri top-level. Khi bạn chọn một thư mục hoặc một item trong File System Editor thì một vài thuộc tính liên quan tới nó sẽ ñược hiển thị, bạn có thể chỉnh sửa các thuộc tính này trong cửa sổ Properties. - Thêm Project outputs: • Trong menu Action, chọn Add Project outputs • Trong hộp thoại Add Project Output Group, chọn project từ danh sách Projects. • Chọn loại output từ danh sách output, bạn có thể chọn nhiều loại output từ danh sách output. • Bạn có thể tùy chọn cấu hình từ danh sách Configuration. • ðể xoá Project output thì chọn một project output và chọn Delete trong menu Edit. - Thêm files: • Chọn một folder trong File System Editor. • Trong menu Action, chọn Add File • Trong hộp thoại Add Files, chỉ ñường dẫn ñến file mà bạn muốn thêm vào và chọn nó • ðể xoá file thì chọn file và chọn Delete trong menu Edit. - ðặt ñiều kiện cài ñặt cho 1 file: • Chọn một file trong File System Editor • Trong cửa sổ Properties, chọn thuộc tính Condition và ñặt ñiều kiện vào thuộc tính này - Thêm và xoá các Assemblies: • Chọn một folder trong File System Editor • Trong menu Action, chọn Add Component • Trong hộp thoại Component Selector, chỉ ñường dẫn tới Assembly và chọn nó • ðể xoá một Assembly ta chọn nó rồi chọn Delete trong menu Edit. b. Registry Editor: Cho phép bạn tạo các khóa registry và giá trị của nó ñể add vào registry trong máy ñích. - Thêm và xoá Registry Keys trong Registry Editor: • Chọn một key node trong Registry Editor • Trong menu Action, chọn New Key

Created by THÁI NGỌC DUY MSDN based-written.

73 4/12/2007

• ðặt tên cho key và sửa ñổi các thuộc tính khác của key trong cửa sổ Properties nếu cần thiểt • ðể xoá một key trong Registry Editor, chọn một key và chọn Delete trong menu Edit. - Thêm và xoá Registry Values trong Registry Editor: • Chọn một key node (không phải là top-level key) trong Registry Editor • Trong menu Action, chọn New String Value, Binary Value hoặc DWORD Value. • ðặt tên cho value • Trong cửa sổ Properties, Gõ vào giá trị value trong thuộc tính Value. • ðể xoá một registry value, ta chọn một value và chọn Delete trong menu Edit - Tạo một Default Registry Value: • Chọn tên value trong Registry Editor • Trong menu File, chọn Rename • Chọn Delete trong menu Edit • Nhấn Enter, giá trị ñược thay bằng “(Default)” - Import Registry Files vào Registry Editor • Chọn node Registry on Target Machine trong Registry Editor • Trong menu Action, chọn Import • Trong hộp thoại Import Registry File, chỉ ñường dẫn tớI registry file và chọn Open c. File Types Editor: Dùng ñể thiết lập sự kểt hợp file trong máy ñích, bằng cách kểt hợp phần mở rộng của file với ứng dụng và chỉ ra các hoạt ñộng cho phép với mỗi loại file. - Thêm, xoá Document Types và Associated File Extensions trong File Types Editor: • ðể thêm một Document Type, chọn node File Types on Target Machine trong File Types Editor. • Trong menu Action, chọn Add File Type • Gõ tên mô tả cho File Type mới • ðể kết hợp phần mở rộng của file, chọn một node Document Type trong File Types Editor. • Trong cửa sổ Properties, chọn thuộc tính Extensions và gõ vào phần mở rộng. • ðể kết hợp một File thực thi, chọn node Document Type trong File Types Editor • Trong cửa sổ Properties, click nút Ellipsis bên cạnh thuộc tính Command • Trong hộp thoại Select Item in project, click nút Add File • Chọn một file thực thi kết hợp với file type. • ðể xoá một Document Type, chọn nó và chọn Delete trong menu Edit - Thêm và xoá Actions trong File Type Editor • Chọn node File Type trong File Types Editor • Trong menu Action, chọn Add Action • Gõ vào tên cho action, ñây là tên action hiển thị trong context menu của file • Trong cửa sổ Properties, chọn thuộc tính Verb và gõ vào ñộng từ. ðây là tên ñược dùng ñể lập trình cho ứng dụng thực thi code khi action ñuợc gọi

Created by THÁI NGỌC DUY MSDN based-written.

74 4/12/2007

- Chỉ rõ Default Action trong File Types Editor: • Chọn 1 node Document Type trong File Types Editor • Trong menu Action, chọn Set As Default - Thay ñổi Display Order của Action trong File Types Editor • Chọn 1 node Document Verb trong File Types Editor • Trong menu Action, chọn Move Up hoặc Move Down d. User Interface Editor:

ñược ñịnh nghĩa trước trình cài ñặt.

Dùng ñể chỉ rõ và ñặt các thuộc tính cho các hộp thoại ñược hiển thị trong quá User Inteface Editor là một cây có 2 section là Install và Admin. Phần Install chứa các hộp thoại ñược hiển thị khi end user chạy cài ñặt ứng dụng. Phần Admin chứa các hộp thoại ñược hiển thị khi người quản trị hệ thống upload bộ cài ñặt lên mạng. Những hộp thoại ñược ñịnh nghĩa trước ñược chia thành 3 loại: Các hộp thoại Start ñược hiển thị trước khi quá trình cài ñặt bắt ñầu (dùng ñể tập hợp thông tin người dùng hay thay ñổi ñường dẫn mà ứng dụng ñược cài vào). Hộp thoại Progess, và các hộp thoại End ñược hiển thị khi ứng dụng ñã cài ñặt thành công. - Thêm và xoá Installation Dialog Boxes trong User Interface Editor • ðể thêm một dialog box, chọn node Start, Progess hoặc Finish trong phần Install của User Interface Editor. • Trong menu Action, chọn Add Dialog. • Trong hộp thoại Add Dialog, chọn một dialog box mà bạn muốn thêm vào • ðể thay ñổi thứ tự hiển thị của Dialog box, chọn một node dialog box • Trong menu Action, chọn Move Up hoặc Move Down. • ðể xoá một Dialog box, chọn một Dialog box trong User Interface Editor và chọn Delete trong menu Edit - Thay ñổi Dialog box: • ðể thay ñổi các thuộc tính của Dialog box, chọn một node dialog box • Trong cửa sổ Properties, chỉnh sửa những thuộc tính của dialog box e. Custom Actions Editor: Cho phép bạn chỉ rõ những thực thi ñược thêm vào máy ñích vào cuối quá trình cài ñặt. Custom Actions ñược biên dịch thành file .dll hoặc .exe hoặc ñược thêm vào Project như là một script hoặc assembly trước khi nó có thể thêm vào dự án triển khai. Action chỉ có thể chạy vào cuốI quá trình cài ñặt. Custom Actions Editor có chứa 4 folder tương ứng với mỗi giai ñoạn của quá trình cài ñặt: Install, Commit, Rollback

Created by THÁI NGỌC DUY MSDN based-written.

75 4/12/2007

và Uninstall. Custom action ñược chạy trong các giai ñoạn này. - Thêm và xoá Custom Actions trong Custom Actions Editor: • ðể thêm một Custom Action, chọn một folder trong Custom Actions Editor • Trong menu Action, chọn Add Custom Action • Trong hộp thoại Select item in Project, chọn một folder và chọn file .dll. file .exe hoặc project output mà có chứa custom action • ðể thay ñổi thứ tự thực thi, chọn một Custom Action trong Custom Actions Editor • Trong menu Action, chọn Move Up hoặc Move Down • ðể xóa một custom action, chọn nó trong Custom Actions Editor và chọn Delete trong menu Edit - Thêm Predefined Custom Action trong Custom Actions Editor: • ðể thêm một Installation Component vào dự án triển khai, chọn một folder trong Custom Actions Editor. • Trong menu Action, chọn Add Custom Action • Trong hộp thoại Select item in Project, mở folder chứa installation component và chọn primary output. f.

Launch Conditions Editor: Cho phép bạn chỉ rõ ñiều kiện cần giúp cho quá trình cài ñặt ñược thành công. Ví dụ như bạn muốn kiểm tra phiên bản của hệ ñiều hành, tìm kiếm file… - Thêm một File Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add File Launch Condition • Chọn node Search for File. Trong cửa sổ Properties, chọn thuộc tính FileName và gõ vào tên file cần tìm. • Chọn thuộc tính Folder và gõ vào tên của Folder bắt ñầu tìm kiếm (ví dụ như [ProgramFilesFolder] hoặc C:\Program Files\MyProgram) • Bạn có thể tùy chọn các thuộc tính khác như depth (số cấp thư mục tìm kiếm), date, size và version. • Chọn node Condition, trong cửa sổ Properties, chọn thuộc tính Message và gõ vào thông báo hiển thị khi file không ñược tìm thấy - Thêm .NET Framework Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add .NET Framework Launch Condition • Chọn node Condition, trong cửa sổ Properties, thuộc tính Message chứa một thông báo chuẩn là [VSDNETMSG], bạn có thể thay thể giá trị này bằng một chuỗi thông báo khác. - Thêm một Registry Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor

Created by THÁI NGỌC DUY MSDN based-written.

76 4/12/2007

-

-

-

-

Created by THÁI NGỌC DUY MSDN based-written.

• Trong menu Action, chọn Add Registry Launch Condition • Chọn node Search for RegistryEntry. Trong cửa sổ Properties, chọn thuộc tính Root và chọn node registry cần tìm • Chọn thuộc tính RegKey và gõ vào tên của khoá registry cần tìm • Bạn cũng có thể tùy chọn thuộc tính Value ñể tìm một giá trị trong khoá registry • Chọn node Condition. Trong cửa sổ Properties, chọn thuộc tính Message và gõ vào thông báo hiển thị nểu Registry entry không ñược tìm thấy. Thêm một Windows Installer Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Windows Installer Launch Condition • Chọn node Search for Component. Trong cửa sổ Properties, chọn thuộc tính ComponentId và gõ vào giá trị ID của Component cần tìm • Chọn node Condition. Trong cửa sổ Properties, chọn thuộc tính Message và gõ vào thông báo hiển thị khi Component ID không ñưọc tìm thấy Thêm một Internet Information Services Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Internet Information Services Launch Condition • Chọn node Condition. Trong cửa sổ Properties, giá trị mặc ñịnh của thuộc tính Condition là REGISTRYVALUEn >= “#5”, có nghĩa là giá trị chứa trong registry key phải >=4 (IIS 4.0). Nếu bạn muốn tìm version khác thì thay ñổi giá trị thuộc tính này. • Bạn có thể tùy chọn thuộc tính Message, nó chứa một giá trị mặc ñịnh là [VSDIISMSG], bạn có thể thay thế nó nếu cần Thêm một File Search trong Launch Conditions Editor: • Chọn node Search Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add File Search • Trong cửa sổ Properties, gõ tên file vào thuộc tính FileName mà bạn muốn tìm • Bạn có thể tùy chọn nơi tìm kiếm và các thuộc tính tìm kiếm • ðể xoá một File Search, chọn nó ở trong Launch Conditions Editor và chon Delete trong menu Edit. Thêm một Registry Search trong Launch Conditions Editor: • Chọn node Search Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Registry Search • Trong cửa sổ Properties, ñặt các thuộc tính Root và RegKey cho registry key mà bạn muốn tìm • Bạn có thể tùy chọn thuộc tính Value ñể tìm một giá trị nào ñó

77 4/12/2007

-

-

-

-

Created by THÁI NGỌC DUY MSDN based-written.

• ðể xoá một Registry Search, chọn nó trong Launch Conditions Editor và chọn Delete trong menu Edit. Thêm một Windows Installer Search trong Launch Conditons Editor: • Chọn node Search Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Component Search • Trong cửa sổ Properties, ñặt giá trị cho thuôc tính ComponentId (số GUID) mà bạn muốn tìm • ðể xoá một Windows Installer Search, chọn nó trong Launch Conditions Editor và chọn Delete trong menu Edit Thêm một Launch Condition cho Microsoft Data Access Components: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Registry Launch Condition • Chọn node Search for RegistryEntry1. Trong cửa sổ Properties, chọn thuộc tính RegKey và gõ vào Software\Microsofr\DataAccess • Gõ vào giá trị vsdrrHKLM cho thuộc tính Root • Gõ vào giá trị FullInstallVer cho thuộc tính Value • Gõ vào giá trị MDACSEARCH cho thuộc tính Property • Chọn node Condition1 trong Launch Conditions Editor, trong cửa sổ Properties, Gõ vào giá trị MDACSEARCH >= “2.6” • Chọn thuộc tính Message và gõ vào MDAC version 2.6 or higher must be installed prior to installing this application. You can install MDAC from the Microsoft Web site http://www.microsoft.com Thêm một Launch Condition trong Launch Conditions Editor: • Chọn node Launch Condition trong Launch Conditions Editor • Trong menu Action, chọn Add Launch Condition • Gõ vào tên cho condition • Trong cửa sổ Properties, gõ vào ñiều kiện cho thuộc tính Condition • Chọn thuộc tính Message, và gõ vào nộI dung thông báo khi ñiều kiện trả về false. • ðể xoá một Launch Condition, chọn nó trong Launch Conditions Editor và chọn Delete trong menu Edit Sử dụng Registry Launch Condition ñể chỉ ra Target Directory • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Registry Launch Condition • Chọn node Search for RegistryEntry. Trong cửa sổ Properties, chọn registry root trong thuôc tính Root

78 4/12/2007

• Gõ vào tên của registry key trong thuộc tính RegKey • Gõ vào giá trị registry trong thuộc tính Value • Gõ vào tên cho thuộc tính Property, ví dụ như SearchForIE • Chọn node Condition. Trong cử sổ Properties, chọn thuộc tính Condition và gõ vào ñiều kiện tìm kiếm • Chọn thuộc tính Message, và gõ vào thông báo hiển thị nếu giá trị registry không ñược tìm thấy • Trong menu View, chọn Editor File System • Chọn node File System on Target Machine trong File System Editor • Trong menu Action, chọn Add Special Folder hoặc Custom Folder • Trong cửa sổ Properties, chọn thuộc tính DefaultLocation và gõ vào giá trị chỉ vị trí (Giá trị của thuộc tính Property ở trên: [SearchForIE]) 5. Ví d s d ng Custom Action ñ to database trong quá trình cài ñt: Trong ví dụ sau, chúng ta sẽ sử dụng custom action và thuộc tính CustomActionData ñể tạo CSDL và các bảng trong quá trình cài ñặt. a. Tạo một Installer Class: • Trong menu File, chọn New Project • Trong hộp thoại New Project, chọn Visual C# Projects trong khung Project Type và chọn Class Library trong khung Templates. Gõ vào DBCustomAction trong ô Name và nhấn OK. • Trong menu Project, chọn Add New Item • Trong hộp thoại Add New Item, chọn Installer Class. Gõ vào DBCustomAction trong ô Name. b. Tạo một ñối tượng Data Connection: • Trong Server Explorer, chọn Data Connections, nhấp phảI chuột và chọn Add Connection • Trong hộp thoại Data Link Properties, nhập vào Server name, user name và password. Trong ô database, gõ vào master và ñánh dấu chọn Allows saving password • Kéo Connection vừa tạo và thả nó vào phần thiết kế của DBCustomAction.cs ñể tạo ñối tượng sqlConnection1 c. Tạo file text chứa câu lệnh SQL ñể tạo Database: • Trong Solution Explorer, chọn project DBCustomAction. Trong menu Project, chọn Add New Item • Trong hộp thoại Add New Item, chọn Text File. Gõ vào sql.txt trong ô Name (phải gõ chữ thường) • Gõ nội dung sau vào file sql.txt: CREATE TABLE [dbo].[Employees] ( [Name] [char] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Rsvp] [int] NULL , [Requests] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY]; ALTER TABLE [dbo].[Employees] WITH NOCHECK ADD CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED

Created by THÁI NGỌC DUY MSDN based-written.

79 4/12/2007

( [Name] ) ON [PRIMARY]; • Trong Solution Explorer, chọn sql.txt. Trong cửa sổ Properties, ñặt giá trị cho thuộc tính BuildAction là Embedded Resource d. Thêm code vào installer class ñể ñọc file text: • Trong Solution Explorer, chọn project DBCustomAction.cs. Trong menu View, chọn Code • Thêm vào câu lệnh sau vào phần ñầu của module: using System.IO; using System.Reflection; • Thêm ñoạn code sau vào class: private string GetSql(string name) { try { //Get the current assembly Assembly Asm= Assembly.GetExecutingAssembly(); //Resources are named using a qualified name Stream Strm =Asm.GetManifestResourceStream(Asm.GetName().Name + "." + name); //Read the contents of the embedded file StreamReader reader=new StreamReader(Strm); return reader.ReadToEnd(); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show("In GetSQL: " + ex.Message ); throw ex; } } private void ExecuteSql(string DatabaseName,string sql) { System.Data.SqlClient.SqlCommand Command= new System.Data.SqlClient.SqlCommand(sql, sqlConnection1); Command.Connection.Open(); Command.Connection.ChangeDatabase(DatabaseN ame); try { Command.ExecuteNonQuery(); } finally { //Finally, block are a great way to ensure that the //connection is always closed Command.Connection.Close(); }

Created by THÁI NGỌC DUY MSDN based-written.

80 4/12/2007

} protected void AddDBTable(string strDBName) { try { //create the database ExecuteSql("master","CREATE DATABASE " + strDBName); //create the tables ExecuteSql(strDBName,GetSql("sql.txt")); } catch (Exception ex) { //report any errors and abort System.Windows.Forms.MessageBox.Show("In exception handler: " + ex.Message); throw ex; } } public override void Install(System.Collections.IDictionary stateSaver ) { base.Install(stateSaver); AddDBTable(this.Context.Parameters["dbname"]); } • Trong menu Project, chọn Add Reference.., chọn System.Windows.Forms.dll, nhấn Select và nhấn OK. • Trong menu Build, chọn Build DBCustomAction. e. Tạo một dự án triển khai: • Trong menu File, chọn Add Project New Project • Trong hộp thoại Add Project, chọn Setup and Deployment Projects trong khung Project Type và chọn Web Setup Project trong ô Templates. Gõ vào DBCustomAction Installer trong ô Name. • Trong cửa sổ Properties, gõ vào DB Installer cho thuộc tính ProductName. • Trong File System Editor, chọn thư mục Web Application Folder. Trong menu Action, chọn Add Project Output • Trong hộp thoại Add Project Output Group, chọn primary output cho project DBCustomAction f.

Tạo một custom installation dialog: • Chọn project DBCustomAction Installer trong Solution Explorer. Trong menu View, chọn Editor User Interface • Trong User Interface Editor, chọn node Start ngay dưới node Install. Trong menu Action, chọn Add Dialog • Trong hộp thoại Add Dialog, chọn dialog Textboxes (A) • Trong menu Action, chọn Move Up, lặp lại cho tới khi Textboxes (A) ñứng trước node Installation Folder • Trong cửa sổ Properties, chọn thuộc tính BannerText và gõ vào Specfy Database Name.

Created by THÁI NGỌC DUY MSDN based-written.

81 4/12/2007

• Chọn thuộc tính BodyText và gõ vào: This dialog allows you to specify the name of the database to be created on the database server. • Chọn thuộc tính Edit1Label và gõ vào Name of DB: • Chọn thuộc tính Edit1Property và gõ vào CUSTOMTEXTA1. • ðặt giá trị false cho các thuộc tính Edit2Visible, Edit3Visible và Edit4Visible. g. Tạo Custom Action: • Chọn project DBCustomAction Installer trong Solution Explorer. Trong menu View, chọn Editor Custom Actions • Trong Custom Action Editor, chọn node Install. Trong menu Action, chọn Add Custom Action • Trong hộp thoại Select item in project, nhấp ñúp thư mục Web Application Folder • Chọn Primary output from DBCustomAction(Active) • Trong cửa sổ Properties, chọn thuộc tính CustomActionData và gõ vào /dbname=[CUSTOMTEXTA1] • Trong menu Build, chọn Build DBCustomActionInstaller. h. Install ứng dụng vào chính máy của bạn: • Chọn project DBCustomAction Installer trong Solution Explorer. Trong menu Project, chọn Install. i.

Triển khai ứng dụng ở một máy khác: • Trong Windows Explorer, tìm tới thư mục của project và tìm file ñã cài ñặt • Copy file DBCustomAction Installer.msi và các file, thư mục con khác vào một máy khác • Khi ñã copy xong, chạy file Setup.exe ở máy vừa ñược chép vào

j.

Uninstall ứng dụng: • Mở Control Panel Add/Remove Programs • Trong hộp thoại Add/Remove Programs, chọn DBCustomAction Installer và click Remove. (ðể Uninstall trong chính máy của bạn, trong menu Project, chọn Uninstall)

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &

CÁC PHƯƠNG PHÁP LƯU TRỮ TRẠNG THÁI. Nội dung: - Tổng quan về các phương pháp lưu trữ trạng thái trong ASP.NET. - ASP.NET Application. - Managing Application State. - Managing Session State. - ViewState. - Cách cấu hình thẻ <sessionState> trong file web.config. Created by THÁI NGỌC DUY MSDN based-written.

82 4/12/2007

-

Cấu hình web server chạy trên nhiều server (ñáp ứng yêu cầu của nhiều client truy cập cùng lúc).

I.

Tổng quát về các phương pháp lưu trữ trạng thái trong Web: ........................................................... I.1 Các tuỳ chọn phía Client:......................................................................................................... I.1 Các tuỳ chọn phía server: ........................................................................................................ II. ASP.NET Application:...................................................................................................................... II.1 ASP.NET Application là gì? ....................................................................................................... II.1 Tạo một Application: ............................................................................................................... II.1 Thời gian sống của một Application: ......................................................................................... II.1 Các chú ý về luồng (thread): ................................................................................................... III. Managing Application State: ........................................................................................................ III.1 Application State:.................................................................................................................... III.1 Sử dụng:................................................................................................................................ IV. Managing Session State: ............................................................................................................. IV.1 Xác ñịnh một session: ............................................................................................................. IV.1 Lưu trữ Session State:............................................................................................................. IV.1 Sử dụng:................................................................................................................................ V. Managing Client-side Cookies:........................................................................................................ VI. ViewState: ................................................................................................................................ VI.1 Khái niệm: ............................................................................................................................ VI.1 Sử dụng:............................................................................................................................... VI.1 Các hạn chế của ViewState:.................................................................................................... VI.1 Làm tăng hiệu suất khi sử dụng ViewState:.............................................................................. VI.1 Disabling ViewState: .............................................................................................................. VII. Cấu hình tag <sessionState> trong file web.config:...................................................................... VII.1 Khái niệm: ............................................................................................................................ VII.1 Sử dụng:............................................................................................................................... VIII. Cách cấu hình cho web server chạy trên nhiều server: ................................................................

9

Tổng quát về các phương pháp lưu trữ trạng thái trong Web: - Ta cần lưu trữ các thông tin có trong trang web do người sử dụng cung cấp ñể sử lí trong một số trường hợp cần thiết. ASP.NET cung cấp rất nhiều phương pháp ñể lưu trữ data trong quá trình hoạt ñộng của trang web. Việc chọn lựa phương pháp nào là tuỳ thuộc vào ứng dụng web của ta và nên dựa vào một số tiêu chí ñánh giá sau: + Số lượng thông tin cần lưu trữ nhiều hay ít? + Các client có chấp nhận các cookies (có thể chiếm chổ trong bộ nhớ của họ) không? + Người phát triển trang web muốn lưu thông tin ở client hay server? + Hiệu suất của trang web mà bạn mong ñợi (tốc ñộ). ASP.NET cung cấp rất nhiều tuỳ chọn cho việc lưu trữ data ở các phía client và server. - Các tuỳ chọn phía Client: + Sử dụng các thuộc tính ViewState. + Sử dụng các trường ẩn (hidden field). + Sử dụng Cookies. Created by THÁI NGỌC DUY MSDN based-written.

83 4/12/2007

-

+ Sử dụng QueryString Các tuỳ chọn phía server: + Application State + Session state + Database Sau ñây là các mô tả về các tuỳ chọn trên. 9.1

Các tuỳ chọn phía Client:

Việc lưu trữ data ở phía client không làm tốn nhiều tài nguyên của server. Do lưu trữ ở client nên sẽ không ñược an toàn về mặt data nhưng hiệu suất của server sẽ cao do các yêu cầu về tài nguyên sẽ không quá cao. Tuy nhiên do phải gửi data về client ñể lưu nên sẽ bị hạn chế về số lượng data mà ta gửi ñi. View State: -

-

-

Mỗi trang web trong ASP.NET tồn tại sẵn một thuộc tính là ViewState dùng ñể chứa các giá trị của một trang. Ta có thể dùng ViewState ñể lưu một giá trị nào ñó của một trang. Ưu ñiểm: + Không yêu cầu tài nguyên của server. + Cài ñặt ñơn giản. + Tự ñộng ghi nhớ trạng thái trang và control. + Làm tăng khả năng bảo mật do dữ liệu ñược ghi ñã ñược mã hoá. Khuyết ñiểm: + Hiệu suất thấp, bởi vì các giá trị ñược lưu giữ trong chính trang ñang sử dụng nó do ñó nếu data lớn sẽ làm cho trang bị chậm khi hiển thị hay trao ñổi data với server. + Bảo mật. ViewState ñược lưu trữ trong các field ẩn trong trang. Mặc dù ñã ñược biến ñổi ñịnh dạng (mã hoá) nhưng nó vẩn có thể bị phá hoại.

Hidden fields: -

-

-

Ta có thể lưu trữ thông tin trên các trường ẩn của trang web. Nên sử dụng các trường ẩn khi có nhu cầu lưu các thông tin nhỏ nhưng có tần suất thay ñổi nhiều từ phía client. ASP.NET cung cấp control HtmlInputHiden cho các trường này. Khi sử dụng các trường ẩn thì phải dùng phương thức Post ñể chuyển dữ liệu Ưu ñiểm: + Không yêu cầu tài nguyên từ server. + ðược hỗ trợ rộng rãi từ hầu hết các trình duyệt (browser) và client. + Cài ñặt ñơn giản. Khuyết ñiểm: + Tính bảo mật. Các trường ẩn có thể bị nhìn thấy khi view source của trang. + Bị hạn chế về cấu trúc lưu trữ. Không thể lưu trữ một cấu trúc trong các field ẩn trừ khi ta phải ghép lại thành một chuổi và có cơ chế phân tích ngược trở lại thích hợp.

Created by THÁI NGỌC DUY MSDN based-written.

84 4/12/2007

+ Hiệu suất. Giống như View State do lưu trữ cùng với trang. Cookies: -

-

Cookies ñược dùng ñể lưu trữ các thông tin nhỏ thường xuyên thay ñổi phía client. Các thông tin này sẽ ñược truyền cùng với yêu cầu về cho server. Ưu ñiểm: + Không yêu cầu tài nguyên phía server. Cookies ñược lưu trữ phía client và ñược ñọc từ server khi yêu cầu gửi ñi + ðơn giản. Cookies có cấu trúc dựa trên text và các khoá là các text. + Có thể cấu hình thời gian tồn tại. Cookies có thể mất khi phiên trình duyệt kết thúc hay có thể tồn tại trên máy client. Khuyết ñiểm: + Hạn chế về kích thước. Hầu hết các trình duyệt hạn chế kích thước của Cookies là 4096 bytes, nhưng cũng có một số trình duyệt mới hỗ trợ 8192 bytes. + Client có thể cấu hình ñể không cho phép các cookies ghi xuống máy của họ. Do ñó ta không thể sử dụng Cookie. + Tính bảo mật. Cookies là mục tiêu ñể phá hoại. Người sử dụng có thể chỉnh sửa cookies trên máy của họ dẩn ñến các khả năng về bảo mật và các ứng dụng dựa trên cookies có thể bị hỏng. More Introduction to Web Application Security + Tính lâu dài. Các cookies thường ñược dùng cho từng user, nội dung sẽ khác nhau ñối với các user. Trong hầu hết trường hợp việc ñịnh danh (identification) sẽ ñược chú trọng hơn là ñịnh quyền (authentication), do ñó chỉ lưu trữ một số thông tin như user name, acount name hoặc GUID ñể xác ñịnh các user.

Query String: -

-

-

Query String là các thông tin ñược nối vào sau chuổi URL của trang web. Ta có thể dùng query string ñể submit dữ liệu về một trang nào ñó thông qua URL. Query String cung cấp cách thức ñơn giản ñể truyền thông tin giữa các trang với nhau nhưng không ñọc các thông tin này từ một trang ñược submit cho server. Ưu ñiểm: + Không yêu cầu tài nguyên server. + ðược hổ trợ rộng rãi. + Cài ñặt ñơn giản. ASP.NET cung cấp các phương thức hỗ trợ ñầy ñủ ñể làm việc với Query String: HttpRequest.Params. Khuyết ñiểm: + Tính bảo mật. Thông tin trong query string hiện trực tiếp lên giao diện của trình duyệt (ñi kèm với ñịa chỉ URL). + Hạn chế về kích thước. Hầu hết trình duyệt chỉ hỗ trợ tối ña 255 kí tự cho URL.

Tuỳ chọn View State

Dùng khi Ta cần lưu trữ thông tin ñược giữ lại cho chính trang ñó.

Created by THÁI NGỌC DUY MSDN based-written.

85 4/12/2007

Hidden fields

Cookies Query string

9.2

Ta cần lưu trữ thông tin có kích thước nhỏ cho một trang ñể gửi lại cho trang ñó hay cho các trang khác và vấn ñề bảo mật không ñược chú ý. Ta chỉ có thể dùng hidden field cho các trang ñược submit về server. Ta cần lưu trữ các thông tin nhỏ trên máy client và vấn ñề bảo mật không ñược chú ý nhiều. Dùng khi chuyển một lượng nhỏ thông tin giữa các trang và vấn ñề bảo mật không ñược quan tâm.

Các tuỳ chọn phía server:

Việc lưu trữ thông tin phía server làm tăng khả năng bảo mật hơn phía server nhưng nó sẽ yêu cầu nhiều hơn tài nguyên của server có thể dẫn tới nhiều vấn ñề khi thông tin lưu trữ lớn. ASP.NET cung cấp một vài các tuỳ chọn ñể lưu trữ data trên server. Application State: -

-

-

-

ASP.NET cung cấp các phương thức lưu trữ thông tin toàn cục cho toàn ứng dụng thông qua lớp HttpApplicationState. Các biến Application state là toàn cục cho ứng dụng ASP.NET. Ta có thể lưu trữ các thông tin lên các biến Application state ñể sau ñó xử lý bởi server. Dữ liệu trong các biến Application State ñược chia sẽ cho nhiều session và thường không ñổi. Ta cần phải có các chuyển ñổi kiểu thích hợp trước khi sử dụng các giá trị trong các biến application. Ưu ñiểm: + Dễ cài ñặt. + Có phạm vi toàn cục. Các biến Application ñược truy suất trong tất cả các trang của ứng dụng do ñó giá trị lưu trữ trong các biến application là duy nhất cho toàn ứng dụng trái với việc lưu trữ thông tin trong session state hay trong các trang riêng lẽ. Khuyết ñiểm: + Phạm vi toàn cục. Tính toàn cục ñôi khi cũng là một bất lợi. Các biến lưu trữ trên application state chỉ toàn cục cho process mà application ñó ñang chạy và mỗi process của application sẽ có một giá trị khác nhau. Do ñó ta không thể dựa trên application state ñể lưu trữ các giá trị duy nhất hay cập nhật trên các ứng dụng ñược cấu hình chạy trên nhiều server hay nhiều process khác nhau. + Tính bền vững. Các thông tin lưu trữ sẽ bị mất nếu web server sử lí nó bị ngưng chạy hay trục trặc. + Yêu cầu tài nguyên. Application state dùng bộ nhớ của server nên có khả năng ảnh hưởng ñến hiệu suất của server cũng như của ứng dụng. Việc thiết kế và cài ñặt tốt các biến Application có thể làm tăng hiệu suất của ứng dụng. Ví dụ, ñặt những thứ thường sử dụng, những dữ liệu tương ñối tĩnh trong application state có thể làm tăng hiệu suất vì làm giảm một lượng lớn

Created by THÁI NGỌC DUY MSDN based-written.

86 4/12/2007

yêu cầu truy suất database. Tuy nhiên có một sự cân bằng về hiệu suất. Khi thông tin lưu trữ nhiều thì sẽ làm giảm hiệu suất của server và ứng dụng. Bộ nhớ sử dụng cho các biến Application sẽ không ñược giải phóng cho tới khi nào mà nội dung biến thay ñổi hoặc bị xoá. Do ñó các biến application chỉ nên dùng khi thao tác với các biến dữ liệu nhỏ và ít khi thay ñổi. Session State: -

-

-

ASP.NET cung cấp các phương thức ñể thao tác với các biến mức phiên (session) thông qua lớp HttpSessionState. Dữ liệu ở các biến này chỉ có nghĩa cho từng session. Dữ liệu lưu trữ trong session ñược quản lí bởi server, có thời gian sống ngắn và chỉ ñại diện cho từng session riêng biệt. Ưu ñiểm: + Dễ dàng cài ñặt. + Các event của session rõ ràng. Ta có thể bắt các event của session ñể sử lí trong chương trình. + Tính lâu bền. Dữ liệu ñặt trên các biến session có thể vẫn tồn tại sau khi IIS restart hay tiến trình hiện tại restart bởi nếu data ñược lưu trữ ở một tiến trình khác (ta cần cấu hình lại file web.config ñể có ñược chức năng trên). Nhưng khi client ñóng trình duyệt thì dữ liệu sẽ mất. + Khả năng chạy trên nhiều cấu hình khác nhau của web server. Có thể dùng trên web server cấu hình trên nhiều server hay nhiều tiến trình. + Session state làm việc với các trình duyệt không hỗ trợ cookies, mặc dù session state làm việc dựa trên cookies (ñể lưu trữ và truyền session ID giữa server và client). Khuyết ñiểm: + Hiệu suất. Các biến session state tồn tại trong bộ nhớ cho ñến khi chúng bị thay thế hoặc xoá bỏ và do ñó có thể làm giảm hiệu suất của server. Các biến session state chứa những khối data lớn có thể ảnh hưởng ñến quá trình load dữ liệu của server.

Database: -

Trong một số trường hợp, ta có nhu cầu dùng các hỗ trợ database ñể quản lý các state trên trang web. Thông thường việc hỗ trợ database thường ñược dùng kết hợp với các cookies và các session state. Một vài web site thương mại ñiện tử sử dụng cơ sở dữ liệu quan hệ ñể lưu trữ các thông tin vì các lí do: + Tính bảo mật (Security) + Tính cá nhân (Personalization) + Tính nhất quán (consistency) + Tính khai thác dữ liệu (Data mining) Tính bảo mật (Security): Client cung cấp tên account và password ñể ñăng nhập vào một site trên trang logon. Sau ñó site sẽ tìm kiếm trên database xem cilent ñó có ñược phép ñăng nhập vào site hay không?. Nếu tìm thấy user ñó trên database web site sẽ tạo một cookies chứa một số ñịnh danh duy nhất cho user ñó trên máy của client. Site sẽ gán quyền truy cập cho client. Tính cá nhân (Personalization): với các thông tin bảo mật, site của chúng ta có thể phân biệt từng user bằng cách ñọc các cookies trên máy client.

Created by THÁI NGỌC DUY MSDN based-written.

87 4/12/2007

Thông thường các thông tin trong database chứa các phần liên quan ñến client (ñược xác ñịnh bởi một số ñịnh danh duy nhất ID). Mối liên hệ giữa ID trên cookies với database ñược coi như là tính các nhân. Site của ta có thể nghiên cứu các thông tin mà client thường quan tâm thông qua ID trên cookies và ñặt các thông tin ñó vào trang web khi user trở lại lần nữa. Tính nhất quán (consistency): nếu bạn tạo một web site thương mại, bạn cần theo dõi các lần giao dịch của hàng hoá và dịch vụ trên site của bạn. Các thông tin ñó có thể ñược lưu một cách ñáng tin cậy xuống database và ñược tham chiếu tới các user ID tương ứng. Các thông tin này có thể ñược dùng ñể xác ñịnh xem việc mua bán ñã hoàn tất hay chưa, hay là nên huỷ bỏ. Các thông tin này cũng có thể ñược dùng ñể báo cho người sử dụng biết trạng thái của các ñơn hàng của họ trên site của ta. Tính khai thác dữ liệu (data mining): các thông tin về site của ta, về các khách hàng viếng thăm, các lần giao dịch sản phẩm có thể ñược lưu một cách ñáng tin cậy vào database. Phòng phát triển kinh doanh có thể dùng các thông tin thu thập ñược từ site ñể quyết ñịnh việc sản xuất các sản phẩm cho năm tới hay chính sách phân phối cho phù hợp. Phòng kinh doanh có thể tìm hiểu các thông tin về người sử dụng trên site của ta. Các kỹ sư và các phòng hỗ trợ có thể muốn xem các lần giao dịch và ghi chú các khu vực nào mà sản phẩm của ta có thể ñược phát triển (có số lượng sản phẩm tiêu thụ mạnh). Hầu hết các hệ quản trị cơ sở dữ liệu quan hệ như MS SQL ñều hổ trợ một tập các công cụ ñể khai thác các dữ liệu ñó. - Ưu ñiểm: + Tính bảo mật. Việc truy cập database thông thường rất an toàn, yêu cầu rất khắc khe về việc thẩm ñịnh ñịnh quyền. + Dung lượng. Ta có thể lưu các thông tin tuỳ ý xuống database. + Sự ổn ñịnh. Các thông tin có thể lưu trữ bao lâu là do ta quyết ñịnh. + Toàn vẹn dữ liệu và an toàn. Các database bao gồm rất nhiều yếu tố ñể quản lý tốt dữ liệu bao gồm các trigger, các ràng buột toàn vẹn,… Bằng cách lưu giữ các thông tin về các giao dịch trên database, ta có thể dễ dàng phục hồi từ các lỗi dễ dàng. + Khả năng truy cập. Dữ liệu ñược lưu trữ trên database có thể ñược truy suất bằng các công cụ hổ trợ sẵn. + Hỗ trợ rộng rãi. - Khuyết ñiểm: + Phức tạp. Sử dụng các hỗ trợ về database sẽ phức tạp hơn về việc cấu hình phần cứng và phần mềm + Hiệu suất. Việc xây dựng một CSDL không tốt có thể dẫn ñến vô số vấn ñề. Việc ñể quá nhiều truy vấn trên database có thể làm bất lợi ñến hiệu suất của server. Tuỳ chọn Application state

Session state

Dùng khi Lưu trữ các thông tin ít khi thay ñổi, các thông tin toàn cục ñược dùng bởi nhiều user, vấn ñề bảo mật không ñược quan tâm. Không nên lưu trữ một lượng lớn thông tin lên các biến Application. Lưu trữ các thông tin có thời gian sống ngắn riêng biệt cho từng phiên và vấn ñề bảo mật ñược quan tâm.

Created by THÁI NGỌC DUY MSDN based-written.

88 4/12/2007

Database support

Không lưu trữ dữ liệu lớn trên các biến session. Chú ý là các ñối tượng session state ñược tạo và ñược duy trì trong suốt thời gian của mổi session trong ứng dụng. Trong các ứng dụng có nhiều user, ñiều này có thể chiếm ñáng kể tài nguyên của server. Lưu trữ một lượng lớn thông tin, quản lí các giao tác (transaction), các thông tin cần lưu khi application và session restart. Việc khai thác dữ liệu ñem lại lợi ích và bảo mật là một vấn ñề.

Link : mshelp://MS.VSCC/MS.MSDNVS/vbcon/html/vbconChoosingServerStateOption.htm

10 -

ASP.NET Application: ðó là tổng quan về các tuỳ chọn ta có thể dùng ñể lưu trữ trạng thái của dữ liệu trên trang web. Sau ñây ta chỉ tìm hiểu về các tuỳ chọn cho server. Trước khi tìm hiểu chi tiết về các cách thức lưu trữ thông tin của người sử dụng khi họ thao tác với các trang web của một site nào ñó ta cần tìm hiểu các khái niệm như: ASP.NET Application là gì? Tạo một application. Thời gian sống của một Application. Các chú ý về luồng (thread) 10.1

-

ASP.NET Application là gì?

ASP.NET ñịnh nghĩa một Application như là một tập các files, các pages, các handlers, các modules, và các executable code có thể ñược gọi ñể chạy trong phạm vi của một thư mục ảo (Virtual Directories) trên một Web application Server. 10.2

Tạo một Application:

Khi ta tạo một ứng dụng Web bằng ASP.NET là ta ñã bắt ñầu tạo một Application. File global.asax: - Dùng ñể sử lí các event của ñối tượng Application, và Session như: Start, End … - File này ñược ñặt ở thư mục gốc của Web Application trong IIS. Global.asax mở rộng từ HttpApplication và ñược ASP.NET phân tích và dịch tự ñộng vào .NET framework lần ñầu tiên khi có bất kì yêu cầu truy suất nào từ client. - File Global.asax ñược cấu hình ñặc biệt ñể ngăn không cho client truy suất trực tiếp nội dung file hay download hay view source của file ñó. - Môi trường soạn thảo ASP.NET ñã hổ trợ sẳn các event của các ñối tượng trên ta chỉ cần mở code của file Global.asax là có thể viết code cho các event ñó. -

10.3

-

Thời gian sống của một Application:

Một application ñược tạo lần ñầu tiên khi có một yêu cầu ñược gởi tới server. Khi ñó event ñầu tiên là Application_Start, các instances của HttpApplication ñược tạo ñể sử lí các yêu cầu ñến khi instance cuối cùng ñược sử lí xong thì phát event Application_End.

Created by THÁI NGỌC DUY MSDN based-written.

89 4/12/2007

Chú ý các phương thức Init và Dispose của ñối tượng HttpApplication ñược gọi mổi khi có một yêu cầu client.

-

10.4

Các chú ý về luồng (thread):

Nếu ta sử dụng các object mức Application thì cần phải lưu ý là ASP.NET sử lí các yêu cầu ñồng thời do ñó các object Application có thể ñược truy suất bởi nhiều client, và tại mỗi thời ñiểm một số command có thể ñược truy suất ñồng thời bởi nhiều client ñiều này nguy hiểm nếu command ñó liên quan ñến việc cập nhật dữ liệu. Ví dụ không nên viết -

<% Application["counter"] = (Int32)Application["counter"] + 1; %>

Nên dùng cơ chế lock và unlock của object Application <% Application.Lock(); Application["counter"] = (Int32)Application["counter"] + 1; Application.Unlock();

%> -

Như vậy sẽ an toàn hơn vì trước khi thao tác update thì biến này ñã bị khoá và client khác không thể truy suất ñược, khi thao tác xong thì biến ñược mở khoá và các client khác có thể truy suất bình thường.

Tóm lại: ASP.NET Application bao gồm mọi thứ trong một thư mục ảo của web server. Thời gian sống của một ASP.NET application bắt ñầu từ sự kiện Application_Start và kết thúc bằng sự kiện Application_End. Việc truy cập vào một object mức Application phải ñảm bảo an toàn cho việc truy suất ña luồng (multithread). Link : http://localhost/quickstart/aspplus/

11

Managing Application State: Việc quản lí trạng thái của trang web bao gồm các mục: 11.1

-

-

-

Application State:

Các biến mức Application là các biến toàn cục ñược ñưa ra bởi ASP.NET. Ta phải luôn luôn quan tâm ñến tầm ảnh hưởng của việc lưu trữ dữ liệu lên các biến Application. Bộ nhớ dùng ñể lưu trữ các biến Application. Bộ nhớ ñược sử dụng bởi các biến này sẽ không bị giải phóng khi giá trị của chúng thay ñổi hay ñược xoá ñi. Do ñó cần quan tâm ñến việc sử dụng các biến Application, không nên sử dụng các biến có nhu cầu bộ nhớ lớn ví dụ dùng biến ñể lưu trữ một recordset có kích thước 10MB. ðối với các trường hợp này nên sử dụng Cache. Các tác ñộng của việc truy cập và lưu trữ các biến Application ñồng thời trong môi trường ña luồng. Trong môi trường ña luồng (nhiều client truy suất trang web cùng một lúc) ta phải chú ý là dữ liệu có thể ñược yêu cầu truy suất ñồng thời cùng một lúc, do ñó khi lập trình bạn phải ñảm bảo ñược là không có sự ñụng ñộ hay chồng chéo dữ liệu giữa các client với nhau, phải có cơ chế ñồng bộ hoá dữ liệu với nhau. ASP.NET hỗ trợ 2 phương thức là : Lock và Unlock ñể giải quyết vấn ñề này.

Created by THÁI NGỌC DUY MSDN based-written.

90 4/12/2007

-

-

-

-

Thời gian sống của Application cũng ảnh hưởng ñến các thông tin lưu trong các biến mức Application. ASP.NET application hay web server có thể bị hỏng bất cứ lúc nào trong quá trình ñang chạy (bị hỏng , do web server ñang ñược update, ...). Các dữ liệu lưu trữ trong các biến Application là không bền vững, dữ liệu sẽ bị mất nếu host ñang quản lí nó bị huỷ (ngưng chạy). Nếu muốn lưu trữ các giá trị này lâu dài phải lưu xuống database hay các thiết bị lưu trữ khác. Khi ta restart IIS thì các giá trị trong biến Application bị mất ñi (nếu ta chạy trang nào có yêu cầu truy suất giá trị các biến này sẽ bị lỗi) ñiều này cũng xảy ra khi ta stop IIS và sau ñó start lại IIS (trong quá trình stop thì giá trị vẩn truy suất ñược chỉ lỗi khi start trở lại) Các biến mức Application không ñược chia sẽ thông qua các ứng dụng web như: một web application chạy trên nhiều server, một web application ñược sử lí bởi nhiều tiến trình trên một server. Các biến toàn cục mức Application chỉ toàn cục trong ngữ cảnh của tiến trình ñang chạy ứng dụng. Do ñó ta không thể dựa trên các biến toàn cục mức ứng dụng ñể lưu trữ các giá trị có tác dụng làm mốc chung cho toàn ứng dụng như: biến ñếm … trên các loại ứng dụng web trên. Khi cần sử lí với các dữ liệu lớn nên sử dụng Cache sẽ có hiệu quả tốt hơn. 11.2

-

Sử dụng:

Các biến Application ñược dùng trong các trang, các lệnh bắt sự kiện, file Global.asax

Mô tả Dùng ñể ghi giá trị cho một biến mức application. Giá trị ñược lưu có thể là chuổi, số hay là một lớp (ñối tượng) nhưng ñối tượng này phải có thuộc tính serializable. Dùng lấy Lấy giá trị Var1 = Application[“var2”]; giá trị của của một Var1: tên biến chứa một biến biến mức mức application. giá trị lấy ñược. Var2: tên biến chứa application, giá trị cần lấy. cần thực hiện một số việc ép Ghi giá trị lên biến

Cú pháp Application["var"] = value; Var: tên biến cần lưu xuống application. Value: giá trị cuả biến.

Created by THÁI NGỌC DUY MSDN based-written.

Ví dụ Application["Name"] = "Thanh";

string name; name = Application["Name"].ToString();

91 4/12/2007

kiểu cần thiết. -

ASP.NET cung cấp một lớp ñể làm việc với các biến Application State: HttpApplicationState. Lớp này bao gồm các phương thức và các thuộc tính như sau:

Thuộc tính AllKeys

Kiểu dữ liệu string[] (mảng chuổi)

Loại Get

Contents

HttpApplicationState

Get

Count

Int

Get

Item

HttpApplicationState

Get/set

Keys

KeysCollection

Get

StaticObjects

HttpStaticObjectsCol lection

get

Created by THÁI NGỌC DUY MSDN based-written.

Mô tả Dùng lấy tất cả các tên biến mức application của một trang. Chỉ lấy các key dựa vào các key này ta sẽ lấy ñược giá trị. Lấy về một ñối tượng application của trang hiện tại.

Ví dụ HttpApplicationState app = Application; string[] arrAppKey = new string[app.Count]; arrAppKey = app.AllKeys; HttpApplicationState app; app = Application.Contents; string[] arrAppKey = new string[app.Count]; arrAppKey = app.AllKeys;

Lấy tổng số biến (ñối tượng) ñang ñược lưu trong Application. Mặc ñịnh là 0. Dùng lấy về một biến (ñối tượng) application và thiết lập giá trị cho biến. Trong C# tương ñương toán tử []

string temp; //Get giá trị của biến Ho temp = Application["Ho"].ToString() ; //Let giá trị của biến Ho Application["Ho"] = "Pham"; Lấy về một tập các HttpApplicationState app = Application ; khoá (tên biến) của ñối tượng Application int n; //khai báo biến ñể chứa tập hiện tại. Phải tham chiếu ñến namespace: các key System.Collection NameObjectCollectionBase. s.Specialized KeysCollection keyCol; // lấy tập các key keyCol = app.Keys; // lấy tổng số key hiện có n = keyCol.Count; for(int i=0;i"); Lấy tất cả các object HttpStaticObjectsCollection ñược khai báo bởi tag PageObjs = ở mức Application.StaticObjects; application trong file if(PageObjs.Count>0) Global.asax. {

92 4/12/2007

... } IsReadOnly

Phương thức Add

Clear

Equals Get

Protected bool

Tham số String name,object value Name: tên (khoá) của biến (ñối tượng) ñược thêm vào tập hợp. Value: giá trị của biến. Void

Object obj Obj: ñối tượng cần so sánh Int index Index: chỉ số của biến muốn lấy. String name Name: tên biến muốn lấy. Chỉ sử dụng một trong 2 tham số trên

GetEnume Void

Get/set

Kiểu trả về

Xem tại : mshelp://MS.VSCC.200 3/MS.MSDNQTR.20 03APR.1033/cpref/ht ml/frlrfsystemcollecti onsspecializednameo bjectcollectionbasecla ssisreadonlytopic.htm

Mô tả

Ví dụ

Void

Thêm một biến (ñối tượng) vào tập hợp application state hiện tại.

HttpApplicationState app Application; // ghi vào biến Ho app.Add("Ho","Pham"); // ghi vào biến Ten app.Add("Ten","Thanh");

Void

Xoá bỏ tất cả các biến hiện có trong tập hợp Application.

// tạo ñối tượng Application HttpApplicationState app = Application; // xoá bỏ tất cả các biến hiện có app.Clear();

Bool object

So sánh ñối tượng hiện tai với ñối tượng khác. Phương thức này kế thừa từ ñối tượng Object. Trả về một biến trong tập các biến Application hiện tại. Ta có thể ñưa vào tên biến hay chỉ số của biến.

IEnumerator

Dùng liệt kê tất cả các khoá của

Created by THÁI NGỌC DUY MSDN based-written.

// lấy ñối tượng Application HttpApplicationState app = Application ; object myObj; // gán giá trị cho một biế Ho app["Ho"] = "Pham"; // lấy biến Ho vào biến myObj myObj = app.Get("Ho"); // xuất ra Response.Write(myObj.To String() + "
"); // ---- output : Pham // lấy ñối tượng Application

93 4/12/2007

rator

các biến trong tập hợp Application. Ta không thể dựa vào các biến nhận ñược ñể thay ñổi giá trị của các biến tương ứng trong tập Application. Phải tham chiếu ñến namespace: System.Collections.Speciali zed.

GetHashC ode

Void

Int

GetKey

Int index String Index: Chỉ số của biến application state cần lấy.

Trả về mã băm (hash code) của ñối tượng hiện tại. Xem thêm : mshelp://MS.VSCC.2003/MS.MSD NQTR.2003APR.1033/cpref/htm l/frlrfsystemobjectclassgethashco detopic.htm Trả về tên của biến ñược lưu trong tập hợp Application State ứng với chỉ số của biến ñó. Giá trị trả về không phải là giá trị của biến.

GetObject Data

SerializationInf o info, StreamingConte xt context

Xem thêm tại : mshelp://MS.VSCC.2003/MS.MSD NQTR.2003APR.1033/cpref/htm l/frlrfsystemcollectionsspecialize

Created by THÁI NGỌC DUY MSDN based-written.

HttpApplicationState app = Application ; // biến giữ tập các khoá tr về IEnumerator iEnum; // khởi tạo giá trị cho 2 bi là Ho và Ten app["Ho"] = "Pham"; app["Ten"] = "Thanh"; // lấy các khoá có trong tậ hợp iEnum = app.GetEnumerator(); while(iEnum.MoveNext()) Response.Write(iEn um.Current.ToString() + "
"); // ---- > output : Ho // Ten

// lấy ñối tượng Application HttpApplicationState app = Application ; string nameObj; // khởi tạo giá trị cho 2 bi là Ho và Ten app["Ho"] = "Pham"; app["Ten"] = "Thanh"; for(int i=0 ; i"); } // ----- > output : Ho // Ten

94 4/12/2007

GetType

Void

Type

Lock

Void

Void

OnDeseria Object sender lization

Void

Remove

String name Name: tên của biến cần huỷ bỏ RemoveAl Void l

Void

RemoveAt Int index Index: chỉ số của biến cần huỷ bỏ Set String name, object value Name: tên của biến cần cập nhật giá trị. Value: giá trị mới của biến ToString Void

Void

Void

dnameobjectcollectionbaseclassg etobjectdatatopic.htm Trả về kiểu dữ liệu hiện tại của ñối tượng Application state hiện hành.

Khoá việc truy cập tới biến hiện tại. Sử dụng khi có nhu cầu cập nhật giá trị của biến. Sử dụng với UnLock() Xem thêm tại : mshelp://MS.VSCC.2003/MS.MSD NQTR.2003APR.1033/cpref/htm l/frlrfsystemcollectionsspecialize dnameobjectcollectionbaseclasso ndeserializationtopic.htm Huỷ bỏ một biến khỏi tập hợp Application State thông qua tên biến. Huỷ bỏ tất cả các biến hiện có trong tập hợp Application State. Phương thức này sẽ gọi phương thức Clear(). Huỷ bỏ một biến khỏi tập hợp Application State thông qua chỉ số của biến.

Void

Cập nhật lại giá trị của một biến thông qua tên của biến.

String

Kế thừa từ ñối tượng object. Trả về chuổi ñại diện cho ñối tượng

Created by THÁI NGỌC DUY MSDN based-written.

// lấy ñối tượng Application HttpApplicationState app = Application ; // khai báo biến kiểu Type Type typeName; // khởi tạo giá trị cho 2 biến_u108 ?à Ho và Ten app["Ho"] = "Pham"; app["Ten"] = "Thanh"; // lấy kiểu typeName = app.GetType(); Response.Write(typeName. ToString() + "
"); // ---- > output: System.Web.HttpApplicati onState

95 4/12/2007

Unlock

-

Void

Void

hiện tại. Trong trường hợp này trả về kiểu dữ liệu của ñối tượng Application State. Cho phép truy cập trở lại biến application state ñã bị khoá bằng phương thức Lock()

// lấy ñối tượng Application HttpApplicationState app = Application ; // khoá lại ñể cập nhật giá trị app.Lock(); // cập nhật app["Ho"] = "Pham"; app["Ten"] = "Thanh"; // mở khoá app.UnLock();

Ngoài ra còn có các phương thức ñể bắt các event ñược tạo sẵn cho ñối tượng Application ñược ñịnh nghĩa trong tập tin Gobal.asax.cs. Event

Mô tả Event này phát sinh System.Web.HttpApplicationFactory khi trang E: ñối tượng kiểu System.EventArgs web ñược gọi chạy lần ñầu tiên. Trong event này các ñối tượng Response, Session, Request chưa ñược khởi tạo bởi ASP.NET do ñó nếu sử dụng sẽ bị lổi, chỉ sử dụng ñược ñối tượng Application. Application_BeginRequest Object sender, EventArgs e Event này Sender: ñối tượng kiểu phát sinh ASP.Global_asax. khi client E: ñối tượng kiểu System.EventArgs gửi một yêu cầu ñến server. Application_AuthenticateRequest Object sender, EventArgs e Event này Sender: ñối tượng kiểu phát sinh Application_Start

Created by THÁI NGỌC DUY MSDN based-written.

Tham số

Object sender, EventArgs e Sender: ñối tượng kiểu

96 4/12/2007

ASP.Global_asax. E: ñối tượng kiểu System.EventArgs

Application_Error

Object sender, EventArgs e

Application_End

Object sender, EventArgs e

khi chứng thực client gửi yêu cầu có ñược cấp quyền hay không. Event này chưa bắt ñược. Event này phát sinh khi ứng dụng kết thúc.Client cuối cùng thoát khởi ứng dụng hay khi ta restart IIS.

Ví dụ:

12

Managing Session State: 12.1

-

-

12.2

-

Xác ñịnh một session:

Mỗi một phiên trên ASP.NET ñược ñịnh danh và theo dõi bằng một chuổi có 120 bits (16 kí tự)(Session ID) gồm các kí tự ASCII hợp lệ cho phép trong chuổi URL. Session ID ñược tạo bằng một thuật toán ñặc biệt ñể ñảm bảo rằng nó ñược tạo ngẫu nhiên và không bị trùng nhau do ñó những người sử dụng có ý ñồ xấu sẽ không thể dựa vào một session ID ñể tính ra một session ID khác hiện có. Chuổi Session ID ñược truyền giữa client và server thông qua cookies hoặc chuổi URL ñược thay ñổi ñể nhúng session ID kèm theo tuỳ theo ta cấu hình ứng dụng của mình. Việc cấu hình ñược thực hiện trong file Global.asax.cs trong tag <sessionState>. Khi ta ñặt thuộc tính cookieless = “false” thì sessionID không hiện kèm theo ñịa chỉ URL, khi cookieless = “true” thì sessionID hiện kèm theo ñịa chỉ URL. Lưu trữ Session State:

ASP.NET cung cấp một mô hình ñơn giản và dễ sử dụng ñể lưu trữ dữ liệu bất kì và các object trong nhiều yêu cầu web khác nhau. Thay vì giữ các object trực tiếp, chế ñộ .NET state server ñơn giản lưu trữ các session state trong bộ nhớ. Trong chế ñộ này tiến trình (process) ñang làm việc giao tiếp trực tiếp với State server. Trong chế ñộ SQL, các session state lưu trữ trong CSDL SQL và tiến trình làm việc giao tiếp trực tiếp với SQL. Các tiến trình làm việc của ASP.NET có thể cải tiến các dịch vụ lưu trữ ñơn giản này bằng cách serializing và lưu tất cả object trong một tập các session của client tại ñầu cuối của mỗi yêu cầu. Khi client trở lại trang web lần nữa, các tiến

Created by THÁI NGỌC DUY MSDN based-written.

97 4/12/2007

-

-

-

trình ASP.NET có liên quan lấy các object này từ state server và de-serializes các object ñó thành các instance sau ñó ñặt chúng vào các tập hợp session mới ñược ñưa ra cho các yêu cầu. Các chế ñộ của session state bao gồm: + Off: không hỗ trợ session state. + Inproc: các session state ñược lưu trữ cục bộ. ðây là chế ñộ mặc ñịnh. Cách lưu trữ này giống với ASP. Các thông tin ñược giữ trong tiến trình của ứng dụng ñang chạy, khi tiến trình khởi ñộng lại thì các giá trị này sẽ mất. Ưu ñiểm của chế ñộ này là hiệu suất cao. Việc truy suất các giá trị của session sẽ nhanh hơn so với 2 chế ñộ bên dưới. + StateServer: các session state ñược lưu trữ trên server ở xa. ðể chạy ñược chế ñộ này thì server phải chạy dịch vụ aspnet_state.exe. Và cuối cùng là phải thiết lập lại các cấu hình trong file Web.config ở tag <sessionState>. Các thông tin của session sẽ ñược lưu trong một tiến trình khác với tiến trình ñang chạy ứng dụng ASP.NET nhưng cũng vẫn nằm trong bộ nhớ chứ không ñược lưu lên database do ñó sẽ bị mất nếu restart lại máy. Các thông tin lưu trong session vẫn không bị mất khi ta restart hay stop IIS lại. Thông tin bị mất khi ta ñóng trình duyệt và mở lại ñể truy cập vào các thông tin ñã lưu trước ñó. + SQLServer: ñể chạy ñược mode này trên server phải chạy thêm một ñoạn script ñể tạo một database trong SQL, các session state ñược lưu trên database này trên SQL. ðối với bản .NET 2002 chỉ cung cấp ñoạn script ñể tạo table trên database tempdb do ñó không thể giữ lại các thông tin khi restart SQL Server. Bản .NET 2003 cung cấp ñoạn script ñể tạo table trên database ASPState do ñó sẽ không bị mất dữ liệu. Các mode trên ñược cấu hình trong file Web.config. Mỗi mode sẽ có một số thuộc tính kèm theo ñể cấu hình cho ñúng. Chi tiết sẽ ñược nêu trong phần sau. Bằng cách phân biệt rõ ràng dữ liệu trong các session của ứng dụng tạo ra nó (session), ASP.NET cung cấp rất nhiều ñiểm mới mà phiên bản ASP không hỗ trợ: + Có thể phục hồi khi Application bị down, bởi vì bộ nhớ dùng cho các session state không nằm trong tiến trình của ASP.NET hay nằm trên cơ sở dữ liệu. + Phân vùng một ứng dụng thông qua nhiều tiến trình làm việc. + Phân vùng ứng dụng cho các ứng dụng ñược cấu hình chạy trên nhiều server (web farm). + Phần cấu hình chi tiết sẽ ñược trình bày ở phần sau. 12.3

-

Sử dụng:

ASP.NET cung cấp lớp HttpSessionState ñể làm việc với các biến session trong một site. Lớp HttpSessionState gồm các phương thức và thuộc tính sau:

Thuộc tính CodePage

Kiểu giá trị Int

Created by THÁI NGỌC DUY MSDN based-written.

Loại Get/set

Mô tả Lấy hoặc thiết lập mã trang cho phiên hiện tại. Thuộc tính này ñược cung cấp ñể tương thích với các phiên bản ASP trước, ASP.NET không lưu CodePage

Ví dụ // lấy ñối tượng Sesion HttpSessionState ses = Session; int n; // các biến này ñược dung ch

98 4/12/2007

trong session state. Nên dung Response.ContentEncoding.C odePage

Contents

HttpSessionState

Get

Count

int

get

IsCookieless

Bool

Get

IsNewSessio n

Bool

Get

IsReadOnly

Bool

Get

IsSynchroniz ed

Bool

Get

Item

Object

Get/set

Keys

KeysCollection

Get

Created by THÁI NGỌC DUY MSDN based-written.

Trả về ñối tượng session hiện tại. Trả về tổng số biến hiện có trong session. Mặc ñịnh là 0

toàn bộ các ví dụ bên dướ n = ses.CodePage; // hay n = Response.ContentEncoding. odePage; Response.Write(n.ToString( + "
"); // ---- > output: 65001

ses["Ho"] = "Pham"; ses["Ten"] = "Thanh"; n = ses.Count; // hay n = Response.ContentEncoding. odePage; Response.Write(n.ToString( + "
"); // ---- > output: 2 bool ret; ret = ses.IsCookieless; Response.Write(ret.ToString ) + "
"); // ---- > output: False do ta không ñặt cookiesless = TRUE

Cho biết session hiện tại có ID ñược nhúng trong ñịa chỉ URL hay nhúng trong cookie. Liên quan ñến việc ta ñặt thuộc tính cookiesless trong tag <sessionState> ở file Global.asax. TRUE: ñược nhúng trong ñịa chỉ URL FALSE: trong cookie Trả về giá trị cho biết session có bool ret; ñược tạo với yêu cầu hiện tại ret = ses.IsNewSession; Response.Write(ret.ToString hay không. ) + "
"); // ---- > output: TRUE Trả về giá trị cho biết session có bool ret; phải là chỉ ñọc hay không?. ret = ses.IsReadOnly; TRUE: read-only Response.Write(ret.ToString ) + "
"); Trả về giá trị cho biết việc truy bool ret; ret = ses.IsSynchronized; cập vào tập các biến trong session state có ñược ñồng bộ Response.Write(ret.ToString ) + "
"); hay không (an toàn luồng)? // ---- > output: false TRUE: thread safe Trả về một biến trong tập Sesion State. Trong C# sử dụng toán tử [] ñể thay thế. Trả về tập các khoá (tên biến) ses["Ho"] = "Pham"; hiện có trong session state. ses["Ten"] = "Thanh"; n = ses.Keys.Count; 99 4/12/2007

LCID

Int

Get/set

Mode

SessionStateMod e

Get

SessionID

String

Get

StaticObjects

HttpStaticObjects Collection

get

SyncRoot

Object

Get

Timeout

Int

Get/set

Phương thức Abandon

Tham số Void

Created by THÁI NGỌC DUY MSDN based-written.

Lấy và trả về số chỉ thông tin về vùng của một session. Xem thêm: mshelp://MS.VSCC.2003/MS.MS DNQTR.2003APR.1033/cpref/h tml/frlrfsystemwebsessionstateht tpsessionstateclasslcidtopic.htm trả về chế ñộ của session hiện tại do ta thiết lập trong tập tin cấu hình web.config ở tag <sessionState>. Khi ta thiết lập mode= Off thì không thể lấy ñối tượng session ñể kiểm tra ñược thuộc tính này Trả về session ID của session hiện tại. Trả về tập các object ñược khai báo trong tag trong file Global.asax. Xem thêm : mshelp://MS.VSCC.2003/MS.MS DNQTR.2003APR.1033/cpref/h tml/frlrfsystemwebsessionstateht tpsessionstateclassstaticobjectsto pic.htm Trả về ñối tượng dung ñể truy suất toàn bộ các ñối tượng có trong session State.

for(int i=0;i"); // ---- > output: Ho // Ten n = ses.LCID; Response.Write(n.ToString( + "
"); // ---- > output: 1033 (tuỳ máy)

Response.Write(ses.Mode.T String() + "
"); // ---- > output: SQLServer (tuỳ thiết lập mode)

Response.Write(ses.SyncRo .ToString() + "
"); // ---- > output: System.Web.SessionState.H pSessionState Lấy hoặc thiết lập thời gian hết // thiết lập thời gian hết hạ hạn của session (tính bằng phút). 12 phút sau mỗi lần gửi y cầu Thời gian hết hạn ñược tính ses.Timeout = 12; bằng thời gian ngay sau khi Response.Write(ses.Timeou client gửi một yêu cầu cộng ToString() + "
"); thêm Timeout . // ---- > output: 12

kiểu trả về Void

Mô tả Huỷ session hiện tại. Các dữ liệu trong session này sẽ

100 4/12/2007

Ví dụ

Add

bị mất. Gọi phương thức này sẽ làm phát sinh event Session_End trong file Global.asax. Chú ý: là event Session_End() chỉ phát sinh trong mode InProc không phát sinh trong mode StateServer và SQLServer. Thêm một biến mới mức session vào tập hợp session state hiện tại.

String name, Object value Name: tên biến ñược thêm vào session. Value: giá trị của biến. Void

Void

Void

Equals

Array array, Int index Array: mảng dung ñể chứa các khoá (tên biến) trả về. Index: chỉ số ñể bắt ñầu chép vào trên của mảng array (không phải chỉ số của các biến trong session state) Object

Bool

GetEnumerator

Void

IEnumerator

Clear CopyTo

Created by THÁI NGỌC DUY MSDN based-written.

Void

Xoá tất cả các biến hiện có trong session state. Chép tất cả các biến trong session state vào một mảng. Nếu số phần tử của mảng tính từ vị trí index nhỏ hơn số biến hiện có trên mảng sẽ gây ra lỗi.

// thêm một biến Ho ses.Add("Ho","Pham"); // thêm một biến Ten ses.Add("Ten","Thanh"); // tương ñương với // ses["Ho"] = "Pham"; // ses["Ten"] = “Thanh";

string[] arrValue = new // thêm một biến Ho ses.Add("Ho","Pham"); // thêm một biến Ten ses.Add("Ten","Thanh"); ses.CopyTo(arrValue,0); n = ses.Count; for(int i=0;i"); // ---- > output: Ho // Ten

So sánh 2 object. Xem thêm : mshelp://MS.VSCC.2003/MS. MSDNQTR.2003APR.103 3/cpref/html/frlrfsystemobj ectclassequalstopic.htm Lấy tập các biến trong IEnumerator enumSes; session state thông qua một // thêm một biến Ho giao tiếp IEnumerator ses.Add("Ho","Pham"); // thêm một biến Ten ses.Add("Ten","Thanh"); enumSes = ses.GetEnumer while(enumSes.MoveNext Response.Write(enu urrent.ToString() + "
" // ---- > output: Ho

101 4/12/2007

GetHashCode

Void

Int

GetType

Void

Type

Remove

Void

RemoveAll

String name. Name: tên biến cần xoá bỏ khỏi session state. Void

ToString

Void

String

RemoveAt

Int index. Index: chỉ số của biến cần loại bỏ ra khỏi session state.

Void

-

Ten // Trả về khoá băm của ñối tượng. Phương thức kế thừa từ lớp Object. Xem thêm: mshelp://MS.VSCC.2003/MS. MSDNQTR.2003APR.103 3/cpref/html/frlrfsystemobj ectclassgethashcodetopic.ht m Trả về kiểu của ñối tượng. Response.Write(ses.GetTy tring() + "
"); // ---- > output: System.Web.SessionState. ionState Xoá bỏ một biến ra khỏi session state thông qua tên biến.

Void

Xoá bỏ tất cả các biến ra khỏi session state. Phương thức này sẽ gọi phương thức Clear() Trả về một chuổi ñại diện cho object

Response.Write(ses.ToStri "
"); // ---- > output: System.Web.SessionState. ionState

Loại bỏ một biến ra khỏi session state thông qua chỉ số của biến.

Ngoài ra còn có các event do ASP.NET cung cấp ñược cài ñặt sẵn trong file Global.asax.cs. Event

Session_Start

Session_End

Tham số

Mô tả Event phát sinh khi có một client System.Web.SessionState.SessionStateModule truy cập tới trang E: System.EventArgs web. Object sender, EventArgs e Event này phát sinh khi hết thời gian timeout ño ta thiết lập trong tag Object sender, EventArgs e Sender:

Created by THÁI NGỌC DUY MSDN based-written.

102 4/12/2007

<sessionState>, hoặc ta gọi phương thức Abandon(). Chú ý: event này chỉ phát sinh khi mode=InProc. Còn các mode còn lại :StateServer, SQLServer không phát sinh event này.

Ví dụ:

13 -

-

Managing Client-side Cookies: Phương pháp lưu trữ bằng cookies là tương tự như của ASP. Các thông tin sẽ ñược lưu thành một file text trên máy của client gọi là cookies. Chỉ những site nào ghi cookies xuống thì mới có thể ñọc cookies ñó lên. ASP.NET cung cấp một lớp ñể làm việc với cookies là: HttpCookie với các phương thức và thuộc tính sau:

Thuộc tính Domain

String

Kiểu

Loại Get/set

Mô tả Dùng ñể thiết lập hoặc lấy về tên miền gán với cookies.

Expires

Datatime

Get/set

HasKeys

Bool

get

Item

String

Get/set

Dùng thiết lập hoặc lấy về ngày hết hạn của cookies. Xác ñịnh xem cookies có chứa nhiều item con không. True nếu có nhiều, false không chứa item con. Dùng ñể lấy hoặc thiết lập giá trị cho một item

Created by THÁI NGỌC DUY MSDN based-written.

Ghi chú Thiết lập tên miền ñể hạn chế chỉ truyền các cookies của các client trong domain ñó. Có thể thiết lập ñến từng phút. Mặc ñịnh là false.

103 4/12/2007

Name

string

Get/set

Path

String

Get/set

Secure

Bool

Get/set

Value

String

Get/set

Values

NameValueCollection Get

trong trong cookies. Trong C# dung toán tử [] thay thế. Dùng thiết lập Mặc ñịnh là hoặc ñặt tên cho rổng trừ khi ta cookies. khởi tạo có tên. Lấy hoặc thiết lập ñường dẩn ảo ñể lưu cookies. Lấy hoặc thiết lập Mặc ñịnh là thông tin cho biết false việc truyền cookies có bảo mật hay không. lấy hoặc ñặt giá trị cho cookies lấy về một tập các Dùng ñể gán item con của nhiều giá trị cookies hiện tại. cho cookies.

Phương thức HttpCookie

Tham số String name Name: tên của cookies

Trả về Void

Mô tả Phương thức khởi tạo của lớp. Dùng ñể khởi tạo một biến cookie.

HttpCookie

void

Phương thức khởi tạo cho lớp ñồng thời gán giá trị cho biến

Equals

String name,string value Name: tên của cookies Value: giá trị Object

Bool

GetHashCode

Void

Int

GetType

void

type

ToString

Void

String

Dùng so sánh 2 ñối tượng. Xem thêm: mshelp://MS.VSCC.2003/MS. MSDNQTR.2003APR.103 3/cpref/html/frlrfsystemobj ectclassequalstopic.htm trả về mã băm của ñối tượng hiện tại trả về kiểu của ñối tượng hiện tại. Phương thức này kế thừa từ lớp Object. trả về chuổi ñại diện cho cookies

Created by THÁI NGỌC DUY MSDN based-written.

Ví dụ // khởi tạo với 1 tham số là tên cookie HttpCookie cok1 = new HttpCookie("test1"); // khởi tạo với 2 tham số là tên cookie và giá trị HttpCookie cok2 = new HttpCookie("test2","Value");

HttpCookie cok = new HttpCookie("test"); Response.Write(cok.ToString( + "
");

104 4/12/2007

// ---- > output: System.Web.HttpCookie Ví dụ :

14

ViewState: 14.1

-

-

-

Khái niệm:

ðây là một cơ chế của ASP.NET dùng ñể lưu lại các vết giá trị của các server control. Ví dụ: chuổi text hiển thị trên label control ñược lưu mặc ñịnh trên viewstate. Ta có thể gán giá trị lúc thiết kế hoặc bằng code chỉ một lần lúc trang ñược load, và sau mỗi lần submit trang chuổi text của label ñược tự ñộng lấy ra từ ViewStates. ViewState là một trong các thuộc tính có sẵn của server control. Dùng khi thiết kế control trên web. ViewState là một hidden field ñược quản lí bởi ASP.NET framework. Khi ASP.NET thực thi một trang, giá trị của trang và của tất cả các control ñược thu thập và ñược ñịnh dạng thành một dòng ñược mã hoá và gán cho thuộc tính value của control hidden ñặc biệt trên form. Giá trị này ñược truyền ñi theo mỗi yêu cầu của client cho server. Ta cần phân biệt giữa hidden field là control HTML, và hidden field lưu giá trị của ViewState.

Loại ViewState

ID/Name chỉ có một tên (name) duy nhất cho ViewState là : __VIEWSTATE

Value Ví dụ bất cứ một phương pháp mã hoá nào. HTML ID do người phát Thuộc tính Value Hidden field triển trang web ñặt không tự ñộng mã khi họ thiết kế hoá do ño ta có thể trang. Có thể có thấy ñược chính xác nhiều tên khác nội dung khi view nhau. source. - Khi sử dụng ViewState ta phải chú ý một số ñiểm sau ñây: + Bắt buột phải có thẻ form phía server (
) trên trang aspx. + Một trang sẽ tự ñộng lưu khoảng 20 bytes hoặc nhiều hơn các thông tin vào ViewState. Do ñó nếu ta không cho phép chế ñộ ViewState của một trang hay của cả ứng dụng thì ta vẫn thấy một số giá trị trong thuộc tính value của tag ViewState. + Trong trường hợp trang không có nhu cầu trao ñổi dữ liệu với server (trang tĩnh), ta có thể loại bỏ ViewState trong trang bằng cách bỏ ñi tag . + ViewState chỉ có tác dụng trên trang mà nó ñược sử dụng ta không thể truy cập giá trị của biến trên ViewState từ một trang khác.

Created by THÁI NGỌC DUY MSDN based-written.

105 4/12/2007

14.2

Sử dụng:

Cú pháp Ví dụ Ghi giá trị xuống ViewState[“var”] = value; ViewState["T1"] = "test1"; ViewState Var: tên biến ñể chứa giá trị. Value: giá trị cần lưu Lấy giá trị ra Var = ViewState[“Var2”]; string str; Var: tên biến cần lưu giá str = trị. ViewState["T1"].ToString(); Var2: tên biến chứa giá trị cần lấy ra trong ViewState. Ngoài ViewState còn ñược sử dụng khi thiết kế control cho web. Phần này sẽ nói ñến khi thiết kế web control. 14.3

-

Các hạn chế của ViewState:

Trong một số trường hợp sử dụng ViewState không phải là lựa chọn tốt vì một số lý do: + Khả năng lưu trữ dữ liệu lớn. Khi ñó sẽ làm cho kích thước trang và kích thước của form tăng lên khi gửi cho trình duyệt. + Sự an toàn dữ liệu. Mặc dù dữ liệu trong ViewState ñã ñược mã hoá nhưng sẽ an toàn hơn nếu dữ liệu ñó client không thể xem ñược. + Hạn chế các kiểu dữ liệu ghi trong ViewState. ViewState chỉ chứa ñược các kiểu dữ liệu cơ bản. Các kiểu có cấu trúc không lưu ñược. 14.4

Làm tăng hiệu suất khi sử dụng ViewState:

Khi sử dụng ViewState nên lưu ý một số ñiểm sau: + Disable ViewState khi ta không có nhu cầu sử dụng. Phần sau sẽ nói rõ một số cách ñể disable ViewState. + Không sử dụng nhiều biến trong ViewState. + Chỉ sử dụng ViewState trong các trường hợp cần thiết. Ví dụ ta có một trang chỉ hiển thị một lưới chứa dữ liệu thì không nên dùng ViewState vì thông thường kích thước dữ liệu của một lưới sẽ rất lớn do ñó sẽ làm tăng kích thước của trang lên rất nhiều. -

14.5

Disabling ViewState:

Trong một số trường hợp không dùng ViewState cho một số ñối tượng thì ta phải disable thuộc tính ViewState cho ñối tượng ñó. Phạm Nơi cấu hình Mô tả Ví dụ vi Mở form ở chế ñộ thiết kế control (design), chọn phần xem mã của trên control html (nhấn Ctrl + form PageDown), tìm ñến tag ñịnh hiện tại. Các giá trị nghĩa control cần cấu hình, của thêm thuộc tính EnableViewState=false. control sẽ không ñược tự ñộng lưu lại trong Created by THÁI NGỌC DUY MSDN based-written.

106 4/12/2007

ðối với một trang.

ViewState cuả form. <%@ Page Tắt chế Trong thẻ cấu hình trang. EnableViewState="False" … ñộ Cũng mở form ở chế ñộ %> ViewState HTML như trên, tìm ñến thẻ <%@Page ... > (thường ở ñầu cho toàn trang. file) , thêm thuộc tính EnableViewState=false.

ðối với toàn ứng dụng.

15

Trong file web.config, mở file ở chế ñộ soạn thảo, tìm tag <pages> (nếu không thấy có thể thêm vào), tìm thuộc tính enableViewState (nếu chưa có thì thêm vào) ñặt giá trị = false (enableViewState=false).

Cấu hình tag <sessionState> trong file web.config: 15.1

-

<pages Tắt chế enableViewState="false"/> ñộ ViewState cho toàn ứng dụng.

Khái niệm:

Việc chọn lưu các thông tin trong trang web ở ñâu là do ta cấu hình trong file web.config. Mở tập tin web.config ở chế ñộ soạn thảo trong IDE. Tìm tag <sessionState> (nếu chưa có thì thêm vào). Sau ñó ta có thiết lập các thông số sau:

Thuộc tính mode

Giá trị

Off InProc

StateServer

SQLServer

cookieless

Created by THÁI NGỌC DUY MSDN based-written.

Ý nghĩa Chỉ nơi ñể lưu giữ các thông tin về session. Có thể là client hay server. Thuộc tính này bắt buộc phải có nếu ta cấu hình tag <sessionState> Không lưu lại các session state trên trang web. Session state ñược lưu trên máy client. Mode này có lợi thế là tốc ñộ nhanh hơn v không phải kết nối database hay kết nối vớ máy khác. Nhưng chỉ nên dùng ñể lưu những dữ liệu nhỏ và không có nhu cầu lư giữ lại. Session state ñược lưu trên server, có thể nằm cùng với server ñang chạy ứng dụng hay là một server nào ñó trong hệ thống củ ta. Session state ñược lưu trên SQL server. Mode này sẽ chậm hơn 2 mode trên nhưng có lợi thế là thông tin lưu trữ lớn và có tính lâu dài. Xác ñịnh xem session có sử dụng cookie ñể lưu thông tin session ID hay không.

107 4/12/2007

true

false timeout

Số nguyên

stateConnectionString chuổi chứa thông tin kết nối. Cú pháp: “tcpip=server:port” server: tên server sẽ chứa các thông tin về session (có thể là tên máy hoặc ñịa chỉ IP của máy). Port: cổng kết nối. Mặc ñịnh là 42424 sqlConnectionString

stateNetworkTimeout

15.2

chuổi chứa thông tin kết nối. Cú pháp: Giống như khi ta thiết lập một chuổi connectionString ñể kết nối ñến SQL Số nguyên.

Session không sử dụng cookie, do ñó session ID sẽ ñi kèm với ñịa chỉ URL. ðối với session không sử dụng Cookies (cookieless = true) thì các ñường dẩn của tậ tin trong trang web phải sử dụng ñường dẫ tương ñối không sử dụng ñược ñường dẫn tuyêt ñối. Session sử dụng cookie. ðây là giá trị mặc ñịnh. Xác thời gian hết hạn của một session. Nế khoảng thời gian giữa 2 lần gửi yêu cầu củ client lớn hơn timeout thì session sẽ tự ñộ phát sinh event session_end. Tính bằng phút. Mặc ñịnh là 20 phút. Sau mổi lần client gử yêu cầu thì thời gian timeout sẽ ñược tính lại. Chỉ ñến server và cổng ñể chứa các session state. Thuộc tính này có tác dụng nếu mode=StateServer.

Chuổi chứa thông tin kết nối ñến database chứa session state. Thuộc tính này có tác dụng khi mode = SQLServer. Dùng khi mode = StateServer. Xác ñịnh số giây kết nối nối mạng giữa web server và state server (server giữ trạng thái) có thể rãnh trước khi session bị huỷ. Mặc ñịnh là 10 giây.

Sử dụng:

-

ðối với mode Off và InProc thì ta không cần hiệu chỉnh tới file web.config vì ñây là các thiết lập mặc ñịnh. Do ñó cơ chế lưu giữ trạng thái sẽ giống như ASP.

-

ðối với mode StateServer: + ðể chạy ñược chế ñộ này ta trước tiên ta phải cho chạy service “ASP.NET State Service” (ñây là một dịch vụ khi cài .NET Framework sẽ có). Cách chạy: Mở cửa sổ quản lý services trên máy sẽ chứa các thông tin về session (vào menu Start -> Programs -> Administrative Tools -> Services > Enter). Tìm service “ASP.NET State Service” nếu service này chưa ñược Start thì Start service ñó. + Tiếp theo là thiết lập cấu hình trong file web.config: mở file web.config -> tìm tag <sessionState> (nếu chưa có thì thêm vào) -> thiết lập thuộc tính mode=StateServer và thiết lập thuộc tính stateConnectionString. Ví dụ stateConnectionString=”tcpip=azweb80:42424”.

Created by THÁI NGỌC DUY MSDN based-written.

108 4/12/2007

+ Ví dụ: <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20" />

-

ðối với mode SQLServer: + ðể chạy mode này thì không cần phải chạy service giống như trên. + Ta cần tạo một database trên SQL server ở máy cần lưu các thông tin. Trước khi tạo database này ta cần khởi ñộng service “SQL Server Agent” vì service này quản lý một số dịch vụ của SQL cung cấp việc thực hiện các job. Mở SQL Query Analyzer. Sau ñó mở ñoạn script InstallSqlState.sql (ñối với .NET framework v1.0) hoặc InstallPersistSqlState.sql (ñối với .NET framework v1.1) sau ñó cho thực thi (nhấn F5). + Lưu ý: + Cả 2 ñoạn script trên mặc ñịnh nằm ở vị trí: :\[Winnt]\Microsoft.NET\Framework\version (số phiên bản của .NET framework) \ . + Khi chạy ñoạn script InstallSqlState.sql sẽ tạo một database ASPState nhưng các table ñể chứa thông tin sẽ ñược tạo trong database Tempdb do ñó các thông tin sẽ mất nếu ta khởi ñộng lại SQL Server. + Khi chạy ñoạn script InstallPersistSqlState.sql cũng tạo database ASPState nhưng các table sẽ ñược tạo trên database này do ñó các thông tin sẽ không bị mất. + Ta cũng có thể xoá database ASPState bằng cách chạy các ñoạn script UninstallSqlState.sql và UninstallPersistSqlState.sql (tìm thấy cùng vị trí với các file script trên) tương ứng. Nhưng trước khi chạy phải stop service “ASP.NET State Service” nếu không sẽ bị lổi. + Khi thao tác với file web.config thì các tag và các thuộc tính ñều phân biệt chữ hoa và chữ thường do ñó phải gõ chính xác. + Ví dụ:

<sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20" />

16

Cách cấu hình cho web server chạy trên nhiều server: Phần này chưa tìm ñược tài liệu nên chứa trình bày ñược.

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Báo cáo nghiên cứu các vấn ñề xung quanh ASP.NET: Ưu ñiểm, HighPerformace… Trực tiếp nghiên cứu : Trương Hiền. Module: Hệ thống, C#. Ngày bắt ñầu:18/12/2003 Ngày hoàn thành: 31/12/2003 Ngày cập nhật: 06/01/2003

I./ Các ñặc ñiểm mới của ASP.NET so với ASP:

Created by THÁI NGỌC DUY MSDN based-written.

109 4/12/2007

ASP.NET là phiên bản mới của ASP,ngoài những ưu ñiểm của ASP, ASP.NET có những ñặc ñiểm khác và mạnh hơn so với ASP: 



















Pages: sử dụng các thành phần ñiều khiển có khả năng hoạt ñộng và tương tác với nhau ngay trên trình chủ Server. ðặc ñiểm này giảm thiểu thời gian viết code tương tác giữa các trang. Lập trình trong môi trường ASP.NET tương tự như lập trình trong Form, do ñó các ứng dụng của ASP.NET còn ñược gọi là Web Form. HTML Server Side Controls: các thành phần ñiều khiển HTML có khả năng xử lý ngay trên trình chủ(Server) dựa trên thuộc tính và phương thức tương tự như cách thức hoạt ñộng của trình khách(client). Những thành phần ñiều khiển này còn cho phép ta kết hợp mã xử lý của pages ASP.NET với một sự kiện nào ñó phát sinh phía client ñược xem như ñang diễn ra trên trình server(mô hình chuyển giao- deligate). Rich controls: tập các ñiều khiển ña năng.Các Rich Controls chạy trên server và có thể tạo ra các phần tử cũng như các ñối tượng HTML phức hợp trên client (Grid, calendar,table, view,…). Rich controls còn cho phép bạn ràng buộc dữ liệu và xử lý dữ liệu tương tự như bạn ñang viết một ứng dụng desktop thật sự. Xoá ñi biên giới mô hình Client/server. Web Service: các dịch vụ Web. Trang ASP.NET có thể không cần hiển thị kết xuất cho client. Chúng hoạt ñộng như những chương trình xử lý yêu cầu ở hậu cảnh. VD trang ASP.NET nào ñó có thể là ñối tượng cung cấp phương thức trả về giá trị nào ñó khi nhận ñược yêu cầu từ client. Cấu hình & phân phối: ñơn giản và dễ dàng với các file cấu hình theo ñịnh dạng văn bản của XML.Không cần phải ñăng ký hệ thống khi sử dụng nữa(Quên ñi regsrv32.exe!). Chúng ta chỉ cần copy các trang ASP.NET hay các ñối tượng lên máy chủ, chỉ ra vị trí của chúng và thế là chương trình cũng như dịch vụ của chúng ta ñã sẵn sàng!. Tự ñộng quản lý trạng thái của ñối tượng Session hay Aplication. Chúng ta có thể lưu nội dung của Session hay Aplication của một ứng dụng ñặc thù nào ñó xuống một file trên ñĩa sau ñó dùng lại. Debug, Tracing: Các công cụ debug ñược nâng cấp ñáng kể. Mỗi trang tài liệu có thể sử dụng một trang xử lý lỗi riêng biệt và kết xuất nội dung của biến ñể theo dõi ngay trong quá trình thực thi trang. Các trình Debug ñược tích hợp sẵn trong môi trường ña ngôn ngữ VB.NET,C++,C#. Security management: Chúng ta có thể tận dụng các dịch vụ ñăng nhập(login) tuỳ biến cho trang tài liệu ASP.NET theo phong cách của Web hoặc cơ chế ñăng nhập và dựa trên hệ thống bảo mật của HðH. Tùy biến vùng ñệm trên Server (Customer Server Caching): vùng ñệm của kiến trúc ASP.NET ñược quản lý rất linh ñộng. Chúng ta có thể tạo ra các vùng ñệm riêng biệt chứa một kiểu giá trị và ñối tượng trong quá trình hoạt ñộng của trang nhằm tăng tốc cho ứng dụng. Một tập các ñối tượng phong phú: ASP.NET hỗ trợ một tập phong phú các thư viện và các ñối tượng phục vụ hầu hết những gì mà những nhà ứng dụng cần ñến. Bằng những thư viện này công việc viết ứng dụng cho Web trở nên dễ dàng hơn.VD: bạn có thể sử dụng các thành phần ñối tượng “Send mail ” ñể gửi nhận thư, ðối tượng mã hoá ñể giải mã thông tin, Web Counter(ñếm số người truy cập),ADO.NET,…

Các ñối tượng nội tại khác như Request, Response, Form, Cookies, ServerVaribles, ñều ñược giữ lại và hoàn toàn tương thích với ASP. Tuy nhiên, ASP.NET ñã cung cấp thêm cho những ñối tượng này rất nhiều những thuộc tính và phương thức mới giúp nâng cao khả năng xử lý các ứng dụng. Một ứng dụng ñược triển khai bằng ASP.NET sẽ thừa hưởng ñược các thế mạnh của ASP.NET như: tốc ñộ nhanh, linh ñộng, an toàn và có tính thực thi cao. ðiều này dựa trên các ưu ñiểm nổi bật sau của ASP.NET(ñứng ở góc ñộ lập trình.): 1. 2.

Thành phần ñiều khiển ñóng gói các chức năng thường xuyên sử dụng rất tiện lợi như: quản lý trạng thái (State), kiểm tra dữ liệu nhập(validate), … những công việc này trứơc ñây thường phải viết rất thủ công. Mã nguồn dễ dùng, dễ ñọc: Mọi công việc thao tác hay xử lý không cần thiết trước ñây(như kiểm tra tính hợp lệ của dữ liệu, bảo vệ trạng thái của session,…) ñều ñược chuyển giao cho kiến trúc và bộ khung ASP.NET xử lý. Trang ASP.NET viết mã ít hơn, ngắn gọn hơn ñồng thời cũng thực thi nhanh hơn trang ASP do trang ASP.NET ñã ñược biên dịch và ñược ñưa vào vùng ñệm bộ nhớ trong suốt quá trình thực thi.

Created by THÁI NGỌC DUY MSDN based-written.

110 4/12/2007

3. 4.

Với trang ASP.NET chúng ta có thể tạo trang tài liệu HTML kết xuất phía ñầu cuối ñẹp mắt bằng một tập phong phú các thành phần ñiều khiển giao diện thân thuộc trong Windows ñã ñược xây dựng lại. Trong ASP.NET không còn phụ thuộc vào ngôn ngữ phi ñịnh kiểu như VBScript nữa, mà nó cho phép sử dụng ngôn ngữ trung lập.Trang ASP.NET có thể viết bằng rất nhiều ngôn ngữ lập trình hiện ñại: C++, C#, VB.NET, Perl,…

Ngoài ra, còn có những ưu ñiểm khác so với ASP thường: Ở trang ASP mã lệnh và giao diện trộn lẫn với nhau. Khi phát triển những ứng dụng Web lớn, thường các dự án cần ñược tách ra làm 2 phần. Một nhóm thiết kế giao diện(Web Designer) và một nhóm viết lệnh lập trình(coder). Kết quả cuối cùng thường là một sự trộn lẫn giữa phần thiết kế giao diện và mã lệnh ASP ñể tạo thành một file chương trình duy nhất. Các trang ASP của ứng dụng ñó rất khó bảo trì khi bạn muốn thêm vào các mã lập trình mới hay thay ñổi giao diện. ASP.NET cho phép tách rời giữa mã lập trình và nội dung tài liệu. Ngày nay, các thiết bị cầm tay: ðTDð, máy Palm,… thay ñổi rất nhanh, ñòi hỏi nhu cầu sử dụng Internet ngày càng cao. Vấn ñề là các trang tài liệu thiết kế cho những thiết bị này yêu cầu phải nhỏ gọn và không thể sử dụng cách ñịnh dạng cho tài liệu như trên những trình duyệt hiện ñại. Một trong những cách giải quyết vấn ñề trên ñó là ta sẽ xây dựng 2 site khác nhau ñể hướng ñến 2 ứng dụng khác nhau hoặc là trong cùng một site chúng ta code nhận dạng từng loại thiết bị rồi viết mã từng site cho phù hợp(Select case …) Cách này lập trình rất khó, chi phí cao và hiện ñang ñược sử dụng nhiều nhất. Tuy nhiên, với ASP.NET chúng ta không cần viết mã lệnh, các thành phần ñiều khiển hoạt ñộng trên Server có khả năng nhận dạng và phát sinh mã tuỳ theo yêu cầu sử dụng cuối cùng của Client….. II./ Các vấn ñề về nâng cao tốc ñộ thực thi một trang Web viết bằng ASP.NET: Cũng giống như những mô hình lập trình khác, khi viết code trong một ứng dụng ASP.NET cũng có một số vấn ñề cần lưu ý, ñôi khi rất nguy hiểm cho ứng dụng của chúng ta: 1. Cần Disable Session state khi không dùng nó nữa.

Trong ứng dụng sẽ có trang dùng , trang không dùng các session. Vì vậy chúng ta cần disable các session lại khi không dùng chúng nữa. Cú pháp: Ví Dụ:

<%@ Page attribute="value" [attribute="value"…] %> <%@ Page EnableSessionState="false" %>

Nếu một trang nào ñó ñòi hỏi cần truy cập vào một biến session nào ñó mà không cần hay create nó, ta set EnableSessionState trực tiếp vào trong @Page với thuộc tính ReadOnly. Session state cũng có thể Disable ở những phương thức dịch vụ Web XML, ñể biết thêm nhiều chi tiết các bạn hãy tham khảo ở trang:XML Web Services Created Using ASP.NET and XML Web Service Clients. Một cách khác ñể Disable Session state trong ứng dụng, trong file Web.config , ta set mode của sessionstate sang off. VD: <sessionstate mode="off" />. 2. Chọn cách cấp session–state một cách cẩn thận. ASP.NET cung cấp 3 cách khác nhau ñể lưu trữ dữ liệu session trong một ứng dụng: in-Process session-state, out of Process session-state trong dịch vụ Window (Window sercice) và out of Process session-state trong SQL Server Database. Mỗi cách ñều có ưu ñiểm riêng, tuy nhiên in-Process session-state là giải pháp nhanh nhất. Nếu chúng ta chỉ lưu trữ một số ít dữ liệu lưu ñộng trong session state thì nên dùng in-Process session-state ,còn out-Process session-state thường ñược dùng trên môi trường nhiều máy tính hoặc các loại dữ liệu hay bị mất ñi khi chúng ta restart. modify

Created by THÁI NGỌC DUY MSDN based-written.

111 4/12/2007

Các bạn có thể tham khảo thêm : mshelp://MS.VSCC/MS.MSDNVS/cpguide/html/cpconaspstatema♦nagement.htm 3. Tránh những kết nối vòng (Round Trips) không cần thiết ñến Server. Khi một ứng dụng Web ñược triển khai, vấn ñề thời gian cũng là một phần rất quan trọng. Thông thường, khi ứng dụng của chúng ta truy cập hay lưu trữ cơ sở dữ liệu thì ta mới kết nối tới Server. Hầu hết các thao tác dữ liệu ñều thực hiện trên Client, VD các trường hợp nhập dữ liệu, ta có sự kiện Validation ở Form Input (Client) ñể kiểm tra dữ liệu nhập có hợp lệ hay không trước khi Submit…, tức là những gì xử lý ñược ở Client thì nên xử lý, ñiều này sẽ giảm thời lượng ñáng kể. Ta nên dùng sự kiện Page.IsPostBack ñể ngăn chặn thực thi các tiến trình không cần thiết trên một Round Trip. Có những tình huống chỉ cần thực hiện một thao tác nào ñó ở lần chạy ñầu tiên, các lần sau không cần biên dịch lại, ta dùng thuộc tính Page.IsPostBack bẫy chúng lại.VD : void Page_Load(Object sender, EventArgs e) { // ...Set up a connection and command here.... if (!Page.IsPostBack) { String query = "select * from Authors where FirstName like '%JUSTIN%'"; myCommand.Fill(ds, "Authors"); myDataGrid.DataBind(); } }

Ở sự kiện trên, ta thấy trước hết nó sẽ kiểm tra thuộc tính Page.IsPostBack tra nếu False thì sẽ tiếp tục thực thi các câu lệnh bên trong, ngược lại thì không. Tham khảo thêm: Ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfSystemWebUIPageClassIsPostBackTopic.htm

4. Sử dụng Server Controls ñúng lúc, ñúng nơi. Xem xét kỹ ứng dụng của chúng ta, thật sự có cần thiết hay không khi sử dụng ASP.NET Server Control, ñừng nên thấy chúng dễ dùng mà “lạm dụng” nó,chỉ khi nào có sử dụng ñến tài nguyên Server. Một số trường hợp hiển thị dữ liệu hay binding data ñơn giản thì chúng ta nên sử dụng chúng. Trong ví dụ sau, chúng ta sẽ thấy việc dùng Server Control sẽ không phải là phương pháp hiệu quả ñể ñưa những giá trị vào trang HTML(Client). Mỗi phương thức gửi một ñường dẫn của một image từ Server ñến Client bằng việc lựa chọn Server Control sẽ làm chậm quá trình xử lý của ứng dụng. <script language="C#" runat="server"> public String imagePath; void Page_Load(Object sender, EventArgs e) { //...Retrieve data for imagePath here... DataBind(); } <%-- The span and img server controls are unecessary...--%> The path to the image is: <span innerhtml='<%# imagePath %>' runat="server"/>


<%-- Use data binding to substitute literals instead...--%> The path to the image is: <%# imagePath %>


Created by THÁI NGỌC DUY MSDN based-written.

112 4/12/2007



<%-- Or use a simple rendering expression...--%> The path to the image is: <%= imagePath %>


Tuy nhiên, nếu biết vận dụng, khai thác các thuộc tính của Server Control, nắm bắt các sự kiện, các ưu ñiểm của việc lưu trữ ViewState thì Server Control vẫn là cách lựa chọn thích hợp. 5. Chỉ lưu những Server Control ViewState khi nào cần. Tự ñộng quản lý viewstate là một ñiểm ñặc biệt của ServerControls ñể phục hồi những giá trị thuộc tính trên một Round Trip mà không cần viết code.Thuộc tính Enable Viewstate luôn mặc ñịnh True. Tuy nhiên, chúng ta cần biết khi nào nó lợi và khi nào nó gây cản trở cho ứng dụng của chúng ta. Ví dụ, khi ta binding data vào một Server Controls trên mỗi Round Trip, các giá trị của ViewState sẽ ñược lưu những giá trị mới từ thao tác data-binding. Trong trường hợp này ta nên Disable quá trình Saves viewstate. Mặc ñịnh tất cả các Server control ñều set ebnable = true, ñể disable chúng ta có các phương pháp sau. VD ở DataGrid Server Controls như sau:

Disable viewstate toàn bộ một trang ta dùng như sau : <%@ Page EnableViewState="false" %>

Chú ý thuộc tính viewstate có thể gán trực tiếp vào trong controls : <%@ Control attribute="value" [attribute="value" … ] %>

6. Dùng phương thức Response.Write cho những chuỗi kết nối (Concat). Nên dùng HttpResponse.Write trong một trang hay trên các User Control cho chuỗi kết nối, phương pháp này cung cấp dịch vụ ñệm và kết nối rất hiệu quả. Tuy nhiên, nếu thực thi việc kết nối chuỗi ở diện rộng nên dùng nhiều câu lệnh Response.Write VD: Response.Write("a"); Response.Write(myString); Response.Write("b"); Response.Write(myObj.ToString()); Response.Write("c"); Response.Write(myString2);

7. ðừng quá tin tưởng vào công việc bẫy lỗi Exceptions của hệ thống. Khi chương trình quá lớn, phức tạp , chúng ta sẽ rất khó quản lý ñược chúng. Nếu có thể, ta nên detect những ñiều kiện gây ra exception. Khi ta biết ñược các ñiều kiện gây ra exception, ñừng nên ñể tự nó catch exception, phải chủ ñộng bẫy lỗi theo cách của chúng ta. Thông thường nhất là các sự kiện Check Null, ép kiểu từ chuỗi sang số(parsed), hay kiểm tra một giá trị ñặc biệt nào ñó trước khi thực hiện một phép toán,…VD: // Consider changing this... try { result = 100 / num; } catch (Exception e) { result = 0; } // to this... if (num != 0) result = 100 / num; else result = 0;

Hai ví dụ trên sẽ cho ra cùng một kết quả, tuy nhiên ở VD sau chúng ta có phần chủ ñộng hơn trong việc catch lỗi.

Created by THÁI NGỌC DUY MSDN based-written.

113 4/12/2007

8. Dùng store procedure ñể truy cập data. Trong tất cả những phương thức truy cập dữ liệu mà .Net FrameWork cung cấp thì truy cập bằng SQL Server có tính thực thi cao, nhất là các ứng dụng Web. Tuy nhiên, khi ñã quản lý CSDL bằng SQL Server truy cập dữ liệu chúng ta nên dùng Store Procedure thay vì dùng những câu truy vấn. Khi dùng Store procedure, các câu lệnh ñược biên dịch lần ñầu rồi lưu vào bộ nhớ do ñó những lần sau sẽ truy cập nhanh hơn. ðồng thời, Store procedure ñược thực thi ở Server sẽ nhanh hơn rất nhiều so với những câu lệnh SQL thực thi từ Client. ðiều này sẽ giảm chi phí về thời gian thực thi rất ñáng kể. 9. Dùng Class SlqDataReader cho những loại dữ liệu Forward - Only. Class SlqDataReader cung cấp một phương tiện ñể ñọc các luồng dữ liệu Forward – Only truy cập từ SQL Server- DataBase. Nếu những tình huống nảy sinh khi chúng ta tạo một ứng dụng bằng ASP.NET mà có dùng Forward – Only data, thì SlqDataReader có tính thực thi nhanh hơn DataSet Class, bởi vì Class SlqDataReader dùng các ñịnh dạng truyền tải dữ liệu qua mạng có sẵn của SQL Server ñể ñọc trực tiếp dữ liệu từ sự kết nối Database. Bên cạnh ñó, Class SlqDataReader thực hiện ñầy ñủ các chức năng giao diện IEnumerable cho phép chúng ta bind data ñến Server rất tốt. 10. Cache data và Page Output khi có thể. ASP.NET có rất nhiều kỹ thuật ñể caching page output và data không cần thiết cho những trang, hay những sự tính toán ñộng nào ñó. Tuy nhiên, nếu thiết kế page hay data, ñặc biệt là những Areas có sự truyền tải dữ liệu rất lớn, mà cache không ñúng lúc, ñúng nơi sẽ rất nguy hiểm. Vì vậy, nếu biết cách Cache sẽ tăng khả năng thực thi rất lớn cho Web Site, ñồng thời giảm chi phí ñáng kể. 11. Phải ñảm bảo disable Debug mode. Luôn nhớ là phải disable Debug Mode trước khi triển khai một ứng dụng hay kiểm tra thực thi một phần ño lường nào ñó.

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

Báo cáo nghiên cứu : những ñiểm khác biệt giữa C++ và C# Ở ñây tôi trình bày trên cơ sở chúng ta ñã biết C++ ========================================================== ================ I./ ðối tượng và Lớp : • Thế giới thực: - Các ví dụ về ñối tượng: Con người (anh là một ñối tượng người , tôi là một ñối tượng người), Con chó, Con mèo, Computer, Xe máy, Máy bay … - Lớp: khi nhiều ñối tượng cùng loại và có cùng tính chất với nhau sẽ tạo thành một lớp ñối tượng. Ví dụ: Máy tính PIII, máy tính PIV... sẽ hợp thành một lớp các ñối tượng máy tính… • Thế giới tin học (cụ thể là C#): - Một lớp trong C# ñược xem là những khái niệm cơ sở của ngôn ngữ. ðiều này có nghĩa là mỗi khi viết một chương trình bằng C# bạn sẽ tạo ra các lớp ñể cấu thành một chương trình. Chúng ta sử dụng lớp như là khuôn mẫu ñể ñặt tất cả những thuộc tính và những chức năng hay hành vi vào trong một khối cho một nhóm ñối tượng nào ñó, sau ñó chúng ta sẽ dùng lớp ñó ñể tạo những ñối tượng mà chúng ta cần. - Có 2 loại lớp: loại dựng sẵn của .NET Framework (Framework Class Library), và loại do người dùng ñịnh nghĩa.

Created by THÁI NGỌC DUY MSDN based-written.

114 4/12/2007

-

Lớp chứa dữ liệu(dưới dạng biến và thuộc tính ) và các hành vi (dưới dạng phương thức ñể xử lý dữ liệu ñó). Khi chúng ta khai báo một biến trong một lớp ta gọi ñó là một biến thành viên(member data). - Khi tạo một ñối tượng , chúng ta sẽ thiết lập các thuộc tính cho ñối tượng ñó. Nghĩa là nếu tôi là một ñối tượng, bạn cũng là một ñối tượng thì tôi và bạn sẽ có những thuộc tính khác nhau( màu mắt , màu tóc…). Bây giờ chúng ta sẽ tìm hiểu về Thuộc tính(Properties) và Biến(Variable). Biến ñược khai báo trong một lớp chứa dữ liệu cho từng ñối tượng cụ thể. ðiều này có nghĩa là khi bạn tạo một ñối tượng từ một lớp, ñối tượng sẽ cấp phát một vùng nhớ ñể chứa dữ liệu của biến ñó. Ví dụ: class Nguoi { public int tuoi; public string mautoc; }

Ta ñã có một lớp Nguoi có 2 biến tuoi, mautoc.Ta sẽ tạo một vài ñối tượng trên Class ñó static void Main(string[] args) { Nguoi Thanh =new Nguoi(); Nguoi Hien =new Nguoi(); // Thiết lập thuộc tính cho các ñối tượng vừa tạo. Thanh.tuoi=21; Thanh.mautoc="Vàng"; Hien.tuoi=22; Hien.mautoc="Nâu"; // Xuất ra màn hình. System.Console.WriteLine("Tuổi của Thạnh:{0},và của Hiền là:{1}",Thanh.tuoi,Hien.tuoi); Console.ReadLine(); }

Trong ví dụ trên ta ñã tạo ra 2 ñối tượng Thanh, Hien thuộc lớp Nguoi.Khi tạo ñối tượng Thanh bộ nhớ sẽ cấp phát một vùng nhớ cho 2 biến thành viên(tuoi, mautoc), tương tự như ñối tượng Hien.Bây giờ mỗi ñối tượng ñều có dữ liệu khác nhau và có thể gán bất kỳ giá trị nào nếu chúng ta muốn. Một vấn ñề ñặt ra là nếu chúng ta gán giá trị cho biến tuoi là 315, hay 450 thì sao?. ðể giải quyết vấn ñề này, chúng ta sử dụng thuộc tính. Thuộc tính là cách ñể truy xuất biến của lớp một cách an toàn.Chúng ta tiến hành xét ñến VD: class Nguoi { // ðặt Properties cho tuoi public int tuoi { get { return tuoi; } set { if (value >=18 && value<=65) { tuoi=value; } else {

Created by THÁI NGỌC DUY MSDN based-written.

115 4/12/2007

tuoi=18; } } } //ðặt Properties cho mautmautoc public string mautoc { get { return mautoc; } set { mautoc=value; } }

ðoạn code trên ñã ñược thay ñổi, hãy chú ý ñến các thuộc tính mà chúng ta vừa tạo ra ở trên. Một thuộc tính bao gồm 2 phương thức truy xuất. Phương thức get có nhiệm vụ lấy giá trị của biến, còn phương thức set có nhiệm vụ thay ñổi giá trị của biến. Do ñó ñoạn mã cho phương thức get khá ñơn giản, chúng ta sử dụng từ khoá return với tên biến mà cần lấy giá trị. Sau khi hoàn thành phần thuộc tính, ta ñặt chúng vào chương trình như sau: static void Main(string[] args) { Nguoi Thanh =new Nguoi(); Nguoi Hien =new Nguoi(); // Thiết lập thuộc tính cho các ñối tượng vừa tạo. Thanh.tuoi=21; Thanh.mautoc="Vàng"; Hien.tuoi=22; Hien.mautoc="Nâu"; // Xuất ra màn hình. System.Console.WriteLine("Tuổi của Thạnh:{0},và của Hiền là:{1}",Thanh.tuoi,Hien.tuoi); Console.ReadLine(); }

Ở ñây các bạn thấy rất giống với ñoạn code trước, tuy nhiên về bản chất chúng khác nhau hoàn toàn. Ở ñoạn trên chúng ta truy xuất trực tiếp ñến các biến, còn ñoạn dưới, chúng ta truy xuất thông qua các thuộc tính của các ñối tượng. Khi bạn gán một giá trị vào thuộc tính, C# sẽ dùng phương thức set. Ưu ñiểm của việc dùng phương thức này là chúng ta có thể ñiều khiển ñược các giá trị gắn vào và kiểm tra xem có hợp lệ hay không, thậm chí trong vài trường hợp chúng ta có thể thay ñổi giá trị ñó. Khi bạn gán một giá trị vào thuộc tính, C# thay ñổi giá trị trong biến và bạn có thể truy xuất giá trị của biến bằng cách sử dụng từ khoá value như ñã dùng ở trên: set { if (value>=18 && value<=65) { tuoi=value; } else { tuoi=18;

Created by THÁI NGỌC DUY MSDN based-written.

116 4/12/2007

} }

Ta thấy trong ñoạn code trên sử dụng câu lệnh if ñể kiểm tra giá trị ñược gán vào vì trong một lý do nào ñó chúng ta muốn bất kỳ ñối tượng nào ñó của lớp người ñều phải có tuổi từ 18->65. Ở ñây ta kiểm tra giá trị và nếu chúng nằm trong khoảng quy ñịnh, ta sẽ lưu vào biến tương ứng, nếu không chúng sẽ ñổi thành 18. ðây chỉ là một VD ñơn giản về thuộc tính. Cách tạo Lớp và ðối tượng: Dùng từ khoá class tương tự như ví dụ trên. Còn ở ñối tượng, ngoài cách trên chúng ta có thể dùng phương thức khởi dựng ñối tượng gán giá trị mặc ñịnh cho ñối tượng: Nguoi Thanh =new Nguoi(20,”Den”);

Ở ñây chúng ta khai báo các giá trị của biến trong khi tạo ñối tượng. Nhưng ñể vấn ñoạn code này làm việc, chúng ta cần khai báo constructor trong lớp Nguoi, ñề này khá ñơn giản các bạn có thể tham khảo trong MSDN.

17

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfpropertiespg.htm

18 19 II./ Các phương thức trong C# : Các chương trình máy tính luôn tồn tại ñể giải quyết một vấn ñề nào ñó, và luôn có phương thức ñể giải quyết. Tất cả các chương trình ñều ñược xây dựng từ một vài lớp. Và những lớp này ñều chứa những phương thức ñể giải quyết những vấn ñề của chương trình.VD phương thức chuyển chuỗi thành số : private int[] toARR(string s) { int o=s.Length(); int[] iarray=new int[o]; for (int i=0 ;i<s.Length;i++) { iarray[i]=Convert.ToInt32( s.Substring(i,1)); } return iarray; }

Như vậy với phương thức toARR() vấn ñề của chúng ta ñã ñược giải quyết. Các bạn cần lưu ý chúng ta ñang sử dụng các phương thức của .NET Framework Class Library(FCL) như ToInt32(), subString() ñể tạo ra những phương thức mới. ðiều này làm cho công việc lập trình trở nên nhẹ nhàng hơn. Khi bạn khai báo một biến trong phương thức thì nó là biến cục bộ của phương thức ñó. Và không có phương thức nào có thể truy xuất ñến biến cục bộ của phương thức ñó. Các phương thức rất có ích khi chương trình của bạn lặp ñi lặp lại nhiều lần. Khi ñó chúng ta có thể biến ñoạn mã ñó thành phương thức và gọi phương thức mỗi khi sử dụng. Về cơ bản ta ñã hiểu phương thức là gì, các tham số (parameter), và trị trả về (return value), thế còn trong C# thì sao. Giả sử chúng ta có một ñoạn mã và cần ñặt chúng vào một phương thức : Console.WriteLine(Math.Sqrt(9));. Created by THÁI NGỌC DUY MSDN based-written.

117 4/12/2007

Dòng mã này dùng phương thức Sqrt() của lớp Math ñể lấy căn bậc 2 của 9. Chúng ta cần viết một phương thức ñể ghi ra màn hình console căn bậc 2 của 9 : static void sqrtConsole(double x) { Console.WriteLine(Math.Sqrt(9)); }

ðể hiểu rõ vấn ñề chúng ta ñi tìm hiểu khái niệm tham số và trị tham số . Hầu hết các phương thức ñều cần có một vài thông tin gì ñó ñể hoàn thành công việc. VD: toARR() thì cần một tham số kiểu string. Như vậy tham số sẽ ñại diện cho giá trị thực sự mà chúng ta truyền vào cho phương thức mỗi khi ñược gọi. Và những giá trị truyền vào ñó ñược gọi là trị tham số. Mỗi tham số ñều thuộc một kiểu dữ liệu nào ñó và các trị tham số truyền vào phải cùng kiểu dữ liệu của tham số ñó. Sau mỗi phương thức, chúng ta ñều nhận ñược giá trị của phương thức ñó, gọi là trị trả về VD: return iarray; Cuối cùng ta ñi ñến một khái niệm phương thức : “Tập hợp gồm Tên phương thức, danh sách các ñối số, kiểu trị trả về gọi là khai báo phương thức ñó”. Chúng ta ñều biết phương thức Main là ngõ nhập chính của tất cả các chương trình C#. ðó là phương thức ñầu tiên mà trình biên dịch sẽ gọi. Do ñó, tất cả các phương thức (do người dùng tạo & FCL) sẽ ñược gọi trong phương thức Main .VD: Giả sử ta có 2 phương thức sau : 1. public void A() { //Coding for A... }

2.public void B( int x) { //Coding for B... }

Và từ phương thức Main() ta gọi chúng như sau : static void Main(string [] args) { A(); B(1001); //.......... }

III./ Cấu trúc chương trình : C# là một ngôn ngữ lập trình mang ñặc ñiểm của C++, phong cách của Java và có mô hình ứng dụng của Visual Basic. Nếu ñã biết C++ thì bạn sẽ mất khoảng 1 giờ ñể tìm hiểu cú pháp của C#. Cấu trúc chương trình Java, khái niệm về gói(Package), garbage collection… chắc chắn sẽ giúp bạn học C# nhanh hơn. 1. Cấu trúc một chương trình C#

C# là một chương trình thuộc dạng case-sensitive( phân biệt chữ hoa, chữ thường), tương tự như cú pháp của C++. Tuy nhiên, C# không giống như C++ ở chỗ, trong C# không chó sự phân chia giữa phần khai báo(header) và phần hiện thực (cpp).Mọi ñoạn mã (class và hiện thực) ñều ñược ñặt trong một file có phần mở rộng .cs. Chúng ta xét một ví dụ quen thuộc với tất cả các ngôn ngữ lập trình - Hello: namespace WindowsApplication1 { public class Hello {

Created by THÁI NGỌC DUY MSDN based-written.

118 4/12/2007

static void Main(string [] args) { Console.WriteLine("Hello Everybody!!!"); } } }

Trong C# tất cả các câu lệnh, phương thức… ñược “gói” trong một class, tất cả các ñược “gói ” trong một namespace.Cũng giống như C++, có một chương trình chính chứa những ñiểm nhập cho chương trình nhập của bạn – ñó là “Main”. Không cần ñặt dấu chấm phẩy sau một khối class hay sau ñịnh nghĩa struct. ðó là quy ñịnh của C++, C# không cần.

class

2. namespace

Mỗi class ñược gói trong một namespace. Thật ra namespace là một khái niệm trong C++, nhưng trong C# chúng ta dùng thường xuyên hơn. Các bạn có thể truy cập một class trong namespace thông qua toán tử dấu chấm(.). Bây giờ chúng ta sẽ viết lại chương trình Hello bằng cách truy xuất lớp Hello từ một lớp khác trong một namespace khác: namespace AnotherNamespace { class Anotherclass { public void Func() { Console.WriteLine("Hello Everybody!!!"); } } }

Bây giờ từ lớp Hello , chúng ta có thể truy xuất tới nó: namespace Mynamespace { class Hello { static void Main(string [] args) { Anotherclass obj =new Anotherclass(); obj.Func(); Console.ReadLine(); } } }

Trong thư viện .NET, system là namespace cấp cao nhất trong các namespace.Trong C#, bằng cách mặc ñịnh tồn tại một namespace toàn cục, một class ñịnh nghĩa bên ngoài một namespace sẽ ñược lưu trực tiếp trong namespace toàn cục này và do ñó có thể truy xuất lớp này mà không cần bất kỳ một qualifier (bổ từ ) nào. Chúng ta cũng có thể ñịnh nghĩa những namespace lồng nhau . ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfNamespace.htm

3. Biến (Variables)

Biến trong C# hầu hết ñều giống như C++, ngoại trừ những ñiểm khác biệt sau: Created by THÁI NGỌC DUY MSDN based-written.

119 4/12/2007

-

Biến trong C# luôn cần khởi tạo trước khi bạn truy xuất tới nó, nếu không bạn sẽ bị báo lỗi trong khi biên dịch. Do ñó bạn cần nhớ rằng không thể truy xuất một biến chưa ñược khởi tạo. Bạn không thể truy xuất một con trỏ không trỏ vào ñâu cả trong C#. Một biểu thức không thể gọi một phần tử của mảng (array) mà chỉ số của nó vượt khỏi kích thước của mảng. Không có khái niệm biến toàn cục hay hàm toàn cục trong C# và những khái niệm về toàn cục ñược biễu diễn thông qua hàm và biến static.

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfStaticPG.htm 4. Kiểu dữ liệu (Data structs)

Tất cả các những kiểu dữ liệu của C# ñược ñịnh nghĩa trong Object. Có 2 loại kiểu dữ liệu: - Kiểu dữ liệu cơ bản (dựng sẵn) . - Kiểu dữ liệu do người dùng ñịnh nghĩa. Dưới ñây là những kiểu dữ liệu dựng sẵn: Kiểu Byte Sbyte Short Ushort Int Uint Long Ulong Float Double Decimal String Char Bool

Kích thước 1 1 2 2 4 4 8 8 4 8 8

true, false

Mô tả Unsigned byte Signed byte Signed short Unsigned short Signed integer Unsigned integer Signed Long Unsigned Long Float pointing Double precision Fixed precision Unicode string Unicode char Boolean

CHÚ Ý : Các kiểu dữ liệu trong C++ và C# không giống nhau, ví dụ: kiểu long trong C++ là 4 bytes, trong C# là 8 bytes. Kiểu bool và string cũng khác, kiểu bool trong C# chỉ chấp nhận giá trị true, false không chấp nhận kiểu integer. Kiểu dữ liệu do người dùng ñịnh nghĩa bao gồm: - Class. - struct. - interface. Nếu phân chia theo kiểu dữ liệu theo sự cấp phát bộ nhớ thì ta có thể chia làm hai loại: - Kiểu giá trị. - Kiểu tham khảo. Kiểu giá trị: là những dữ liệu ñược cấp phát bộ nhớ trong stack. Các loại dữ liệu này bao gồm : + Tất cả những kiểu dữ liệu dựng sẵn, ngoại trừ kiểu string Created by THÁI NGỌC DUY MSDN based-written.

120 4/12/2007

+ Struct + Kiểu liệt kê. Kiểu tham khảo: ñược cấp phát bộ nhớ trên heap và sẽ trở thành rác khi chúng không còn sử dụng nữa. ðể khai báo kiểu dữ liệu loại này chúng ta dùng từ khoá new, và không như C++, không có từ khoá delete. Trong C#, chúng tự ñộng gom lại nhờ công cụ “garbage collection”. Kiểu tham khảo bao gồm: + class + Interface + Kiểu tập hợp như mảng. + String. Kiểu liệt kê (Enumeration): Kiểu liệt kê trong C# hoàn toàn giống C++, chúng ñược ñịnh nghĩa thông qua từ khoá enum.VD: enum Weekdays { Sat,Sun,Mon,Tue,Wed,Thur,Fri }

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vcrefintegraltypes.htm 5. Class & Struct

Class & Struct cũng tương tự như trong C++ chỉ khác nhau về sự cấp phát bộ nhớ. Class ñược cấp phát bộ nhớ trong heap thông qua cách dùng new, Struct ñược cấp phát bộ nhớ trong stack. Struct trong C# là kiểu dữ liệu rất nhẹ và nhanh. Do ñó, với những kiểu dữ liệu nặng, chúng ta nên khai báo class.Xét VD: struct Date { int day; int month; int year; }// không có dấu chấm phẩy ở ñây. class Date { int day; int month; int year; string Weekday; string monthName; public int Getday() { return day; } public int Getmonth() { return month; } public int Getyear() { return year; } public int SetDay(int Day) { day=Day; } public int SetMonth(int Month) {

Created by THÁI NGỌC DUY MSDN based-written.

121 4/12/2007

month=Month; } public int SetYear(int Year) { year=Year; } public void SetDate(int day, int month, int year) { ……… } } class: ms-help://MS.VSCC/MS.MSDNVS/csref/html/vcrefTheClassType.htm struct:ms-help://MS.VSCC/MS.MSDNVS/csref/html/vcrefStructTypes.htm

6. Properties

Nếu các bạn ñã quá quen thuộc với hướng ñối tượng trong C++, chắc chắn bạn sẽ am hiểu về properties(thuộc tính). Trong C# cung cấp những cách thuận tiện, ñơn giản và trực tiếp ñể truy xuất những thuộc tính. Ta viết lại VD trên như sau: class Date { public int Day { get { return Day; } set { Day=value; } } int day; public int Month { get { return Month; } set { Month=value; } } int month; public int Year { get { return Year; } set { Year=value; } } int year; public bool IsLeapYear(int year)

Created by THÁI NGỌC DUY MSDN based-written.

122 4/12/2007

{ return year %4==0? true:false; } public void SetDate(int day, int month, int year) { this.day=day; this.month=month; this.year=year; } }

Và cách thiết lập thuộc tính: class User { public void Main(string[] args) { Date date=new Date(); date.Day=27; date.Month=12; date.Year=2003; Console.WriteLine("Date is : {0}/{1}/{2}" ,date.Day,date.Month,date.Year); Console.ReadLine(); } }

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfpropertiespg.htm 7. Modifier (Bổ từ) (mshelp://MS.VSCC/MS.MSDNVS/csref/html/vclrfcsharpkeywords_pg.htm)

Trong C++ chúng ta ñã quá quen thuộc các bổ từ thông dụng như: public, private, protected. Chúng ta có một số từ mới trong C#: * readonly: chỉ ñược dùng cho những dữ liệu thành viên của class. Dữ liệu kiểu readonly chỉ có thể ñọc khi chúng ñã ñược khởi tạo trực tiếp hay gán giá trị cho chúng trong constructor.Sự khác nhau giữa dữ liệu kiểu readonly và const là khi khai báo hằng, ta phải khởi tạo giá trị cho nó một cách trực tiếp.VD: class Myclass { const int constInt=100; // khai báo trực tiếp. readonly int myInt1; public Myclass() { myInt1=13; } public void Func() { Console.WriteLine(myInt1.ToString()); } }

* sealed: Khi sử dụng từ khoá này ñể khai báo một class sẽ không cho phép bạn lấy bất kỳ một class nào từ nó. Do ñó chúng ta nên sử dụng sealed cho những lớp mà chúng ta không muốn những lớp con thừa kế chúng. sealed class pppp { int d=1000; }

Created by THÁI NGỌC DUY MSDN based-written.

123 4/12/2007

* unsafe: Chúng ta có thể ñịnh nghĩa một ngữ cảnh không an toàn trong C# bằng từ khoá unsafe. Trong ngữ cảnh không an toàn chúng ta có thể viết một ñoạn mã không an toàn, VD con trỏ trong C++ chẳng hạn.VD: class UnsafeTest { unsafe static void SquarePtrParam (int* p) // unsafe method: takes pointer to int { *p *= *p; } unsafe public static void Main() // unsafe method: uses address-of operator (&) { int i = 5; SquarePtrParam (&i); Console.WriteLine (i); } } ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfUnsafe.htm

*interface: Nếu bạn ñã có khái niệm về COM, bạn sẽ dễ dàng hiểu ñược nội dung của phần này. một interface là một lớp trừu tượng cơ bản, trong ñó chỉ chứa những ký hiệu của hàm, sự hiện thực những hàm này ñược cung cấp bởi những lớp con. Trong C# bạn có thể ñịnh nghĩa những class như những interface thông qua từ khoá interface. .NET có nền tảng từ nhiều interface. Trong C# bạn không thể dùng nhiều lớp thừa kế, ñiều mà trong C++ cho phép, nhưng thực ra bản chất của sự thừa kế ñược thực hiện thong qua interface. Những lớp con của bạn cũng có thể thực hiện ña interface. interface myDrawing { int originx { get; set; } int originy { get; set; } void Draw(object shape); } class shape:myDrawing { int Orix; int Oriy; public int originx { get{ return Orix; } set { Orix=value;

Created by THÁI NGỌC DUY MSDN based-written.

124 4/12/2007

} } public int originy { get { return Oriy; } set { Oriy=value; } } public void Draw(object shape) { //..... } } ms-help://MS.VSCC/MS.MSDNVS/csref/html/vcrefTheInterfaceType.htm

8. Array

Mảng trong C# có nhiều tính năng vượt trội hơn C++ rất nhiều. Mảng ñược cấp phát bộ nhớ trong heap và do ñó nó ñược truyền bằng tham khảo. Chúng ta không thể truy xuất một phần tử vượt ngoài giới hạn trong một mảng(Có chỉ số lớn hơn số phần tử trong mảng). Do ñó C# ñã khắc phục ñiều này. Ngoài ra C# còn cung cấp một số hàm hổ trợ giúp ñể xử lý các phần tử trong mảng. Ta có thể thấy rõ sự khác nhau giữa cú pháp của mảng trong C# và C++: + Dấu [] ñựơc ñặt sau tên kiểu chứ không phải sau tên biến. + Bạn có thể tạo vùng nhớ cho phần tử trong mảng bằng cách dùng từ khoá new. Ngoài ra C# còn hỗ trợ việc hiện thực mảng một chiều (single dimension), ña chiều (multi dimension) và mảng của mảng (jagged dimension). // Mảng một chiều int[] array=new int[10]; for(int i=0;i<array.Length;i++) array[i]=i; // Mảng 2 chiều int[,] array2=new int[5,10]; array2[2,10]=1234; // Mảng 3 chiều int [,,] array3=new int[2,3,6]; array3[1,1,5]=51; // mảng của mảng int [][] arrayOfarray=new int[2]; arrayOfarray[0]=new int[4]; arrayOfarray[0]=new int[] {1,2,6};

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrf[]Operator.htm 9. Indexer

Created by THÁI NGỌC DUY MSDN based-written.

125 4/12/2007

indexer ñược dùng ñể viết một phương thức truy xuất trực tiếp một phần tử từ tập hợp bằng cách dùng dấu [], như trong mảng. Việc bạn cần làm là chỉ rõ chỉ số cần truy xuất một phần tử. Cú pháp của indexer cũng giống như của thuộc tính một class, ngoại trừ chúng cần một thông số nhập, ñó chính là chỉ số của phần tử cần truy xuất. Chúng ta tiếp tục xét VD, và sẽ gặp lớp CollectionBase, ñó là một lớp thư viện dùng ñể tạo ra những tập hợp. Danh sách (list) là một protected member của lớp CollectionBase, trong ñó lưu trữ tập hợp các danh sách. class shape:CollectionBase { public void add(Shape shp) { List.Add(shp); } //indexer public Shape this[int index] { get{ return (Shape) List[index]; } set{ List[index]=value; } } }

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrf[]Operator.htm 10. Boxing & Unboxing

Boxing là một khái niệm mới trong C#. Như ñã ñề cập ở trên, mọi kiểu dữ liệu do người dùng hay dựng sẵn ñều ñược lấy từ một lớp cơ bản là Object trong namespace system. Do ñó việc ñóng gói những kiễu dữ liệu căn bản hay nguyên thuỷ vào trong class Object ñược gọi là Boxing, và thao tác ngược lại gọi là unboxing. VD: class Test { static void Main() { int myInt=2; // boxing object Obj=myInt; // unboxing int myInt2=(int) Obj; } }

Trong ví dụ trên cho ta thấy hai thao tác boxing và unboxing. Một giá trị int có thể ñược chuyển thành kiểu Object và ñược chuyển ñổi ngược lại kiểu int. Khi một kiểu dữ liệu của một biến cần ñược chuyển thành một kiểu truyền bằng tham khảo, một kiểu box ñược tạo ra ñể chứa giá trị, và giá trị ñược lưu trong box. Unboxing chỉ là quá trình ngược lại. Khi một object box ñược trả về kiểu nguyên thuỷ, giá trị sẽ ñược chuyển từ box sang ô nhớ lưu trữ ban ñầu. mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfSystemReflectionPointerClassBoxTopic.htm

Created by THÁI NGỌC DUY MSDN based-written.

126 4/12/2007

11. Các thông số của hàm

Trong C# có 3 loại thông số: 1. Thông số in/ truyền bằng trị. 2. Thông số in-out / truyền bằng tham khảo. 3. Thông số out. Nếu bạn ñã hiểu về COM, interface và những kiểu thông số của nó, bạn sẽ dễ dàng hiểu ñược các thông số của C#. Thông số in/ truyền bằng trị: Khái niệm thông số truyền bằng trị cũng tương tự như C++. Giá trị truyền ñược chép vào một ô nhớ và ñược truyền vào hàm.VD: setDay(6); void setDay(int day) { //........ } Thông số in-out/ truyền bằng tham khảo: Thông số

truyền bằng tham khảo trong C++ ñược truyền thông qua con trỏ hay toán tử &. Trong C#, thông số truyền bằng tham khảo còn ñược gọi là in-out, vì khi bạn truyền một ñịa chỉ tham khảo của một ô nhớ, bạn ñã truyền một giá trị nhập và lấy một giá trị xuất từ hàm ñó. Chúng ta không thể truyền một thông số chưa khởi tạo từ một hàm.C# dùng từ khoá ref ñể chỉ thông số truyền bằng tham khảo. Chúng ta cũng có thể dùng từ khoá ref cho một ñối số trong khi truyền nó vào một hàm có thông số truyền bằng tham khảo. VD: int a=5; FunctionA(ref a); void FunctionA(ref int val) { //.......... } Thông số out: Là thông số

chỉ trả về giá trị là kết quả của một hàm, không ñòi hỏi giá trị nhập.C# dùng từ khoá out cho loại tham số này.VD: int val; getVal(val); bool getVal(out int val) { //.......... }

11. Số lượng các thông số và mảng

ðể truyền thông số là một mảng trong C#, người ta dùng từ khoá params. Chỉ có thể có một ñối số kiểu mảng. Bạn có thể truyền phần tử như là một ñối số của mảng ñó. VD: void Func(params int[] array) { Console.WriteLine("Số phần tử của mảng là : {0}",array.Length); } Func(); Func(5) Func(9); Func(new int[] {3,8,7}); int [] array=new int[8]; {1,2,3,4,5,7,2,8}; Func(array);

12. Toán tử và biểu thức

Created by THÁI NGỌC DUY MSDN based-written.

127 4/12/2007

Hầu hết các toán tử trong C# ñều giống như trong C++. Tuy nhiên C# còn bổ sung thêm một số mới và hữu ích. Toán tử is : Dùng ñể kiểm tra xem kiểu của các toán hạng có tương ñương nhau không. Toán tử is thường dùng trong kịch bản ña ngữ cảnh. Toán tử này có 2 toán hạng và trả về kiểu bool. void testis (object param) { if ( param is ClassA) //.......doing ... else if (param is myStruct) //.....doing something }

Toán tử as : Kiểm tra xem kiểu các toán hạng có khả ñổi hay không, nếu có thì kết quả trả về là một ñối tượng ñã ñược chuyển ñổi hay ñược box. Nếu ñ.tượng không ñược chuyển ñổi hay box ñược, kết quả trả về là Null. VD: Shape shp=new Shape(); Vehicle veh=new Vehicle(); Circle cir=new Circle(); Shape shp=cir; Circle cir2=shp as Circle; object[] objects=new object[2]; objects[0]="Aisha"; objects[1]=new Shape(); string str; for (int i=0; i&< objects.Length;i++) { str=objects[i] as string; if (str==null) Console.WriteLine("Không thể Convert !!"); else Console.WriteLine("{0}",str); }

ms-help://MS.VSCC/MS.MSDNVS/tsqlref/ts_oa-oz_3qpf.htm 13. Câu lệnh (Statement)

ða số các câu lệnh ñều giống C++, ngoài ra còn có một số câu lệnh mới bổ sung, và có một số sửa ñổi cho câu lệnh cũ. Sau ñây là một số câu lệnh mới: foreach: Dùng cho việc thực hiện vòng lặp cho tập hợp như mảng (ý nghĩa tương tự như for each .. trong VB).VD: foreach(string s in array) Console.WriteLine(s);

lock: Dùng ñể bao một ñoạn code thành một session. checked/unchecked: Dùng ñể kiểm tra tràn trong các toán tử có ñối số là số. VD: int x=Int32.MaxValue;x++; { x++; } unchecked { x++;

Created by THÁI NGỌC DUY MSDN based-written.

128 4/12/2007

}

Một số thay ñổi : -Switch: Trong C# switch có một số thay ñổi như sau: 1. Sau khi thực thi một câu lệnh case, chương trình sẽ không nhảy ñến câu lệnh kế tiếp .VD: int var=100; switch (var) { case 100: Console.WriteLine(""); // Không dùng break; case 200: Console.WriteLine(""); case ...: break;// kết thúc . }

Trong C++, kết quả sẽ là : , tuy nhiên trong C#,ta sẽ nhận ñược thông báo lỗi như sau: Error CS0163: Control cannot fall through from one case lable (‘case 100:’) to another Tuy nhiên, chúng ta sẽ làm lại như sau: int var=100; switch (var) { case 100: case 200: Console.WriteLine("100 or 200 "); case ... break;// kết thúc . }

2. Chúng ta cũng có thể dùng hằng trong giá trị case.VD: const string Weekend="Sun"; const string Weekday1="Mon"; //...... string Weekday=Console.ReadLine(); switch (Weekday) { case Weekend: Console.WriteLine("Hôm nay là cuối tuần "); break; case Weekday1: Console.WriteLine("Hôm nay là thứ hai"); case ... break;// kết thúc . }

-deletgate: Cho phép chúng ta lưu sự tham khảo hàm vào một biến.Trong C++ việc này giống như dùng và lưu con trỏ hàm và chúng ta hay dùng typedef.VD: delegate int Operation(int val1, int val2) public int Add(int val1, int val2) { return val1+val2; }

Created by THÁI NGỌC DUY MSDN based-written.

129 4/12/2007

public int Sub(int val1, int val2) { return val1-val2; } public void perform() { Operation Oper; Console.WriteLine("Nhập vào + hay -"); string op=Console.ReadLine(); Console.WriteLine("Nhập vào số thứ nhất :"); string val1=Console.ReadLine(); Console.WriteLine("Nhập vào số thứ hai :"); string val2=Console.ReadLine(); val1=Convert.ToInt32(val1); val2=Convert.ToInt32(val2); if (op=="+") Oper = new Operation(Add); else Oper = new Operation(Sub); Console.WriteLine("Result is : {0}",Oper(val1,val2)); Console.ReadLine(); }

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfStatements.htm 13. Tính thừa kế và tính ña hình

Trong C# chỉ cho kế thừa ñơn. Nếu muốn ña kế thừa chúng ta dùng interface.VD: class cha { } class con: cha

ms-help://MS.VSCC/MS.MSDNVS/midl/mi-laref_1hut.htm 14. Hàm ảo

Từ khái niệm hàm ảo ñến hiện thực khái niệm ña hình trong C# là như nhau, ngoại trừ việc dùng từ khoá override ñối với việc hiện thực hàm ảo trong class con. Lớp con vẫn sử dụng từ khoá virtual. Lớp nào override phương thức ảo cũng sử dụng từ khoá override. class Shape { public virtual void Draw () { Console.WriteLine("Shape.Draw"); } } class Rectangle:Shape { public override void Draw() { Console.WriteLine("Rectangle.Draw"); } } class Square:Rectangle { public override void Draw()

Created by THÁI NGỌC DUY MSDN based-written.

130 4/12/2007

{ Console.WriteLine("Square.Draw"); } } class MainClass { static void Main() { Shape[] shp=new Shape[3]; Rectangle rect=new Rectangle(); shp[0]=new Shape(); shp[1]=rect; shp[2]=new Square(); shp[0].Draw(); shp[1].Draw(); shp[2].Draw(); } }

Kết quả như sau: Shape.Draw Rectangle.Draw Square.Draw

Sau ñây chúng ta làm ẩn ñi lớp cha bằng cách dùng “new”. Trong một lớp con, chúng ta có thể ñịnh nghĩa một hàm mới, ẩn với lớp cha, bằng cách dùng từ khoá new.Ở VD trên, chúng ta ñổi từ khoá override thành new trong lớp Rectangle. class Shape { public virtual void Draw () { Console.WriteLine("Shape.Draw"); } } class Rectangle:Shape { public new void Draw() // ñược ñổi từ override ->new { Console.WriteLine("Rectangle.Draw"); } } class Square:Rectangle { public new void Draw() { Console.WriteLine("Square.Draw"); } } class MainClass { static void Main(string[] args) { Console.WriteLine("Using polymorphism: "); Shape[] shp=new Shape[3]; Rectangle rect=new Rectangle(); shp[0]=new Shape(); shp[1]=rect; shp[2]=new Square(); shp[0].Draw();

Created by THÁI NGỌC DUY MSDN based-written.

131 4/12/2007

shp[1].Draw(); shp[2].Draw(); Console.WriteLine("Using without polymorphism: "); Square sqr=new Square(); sqr.Draw(); } }

từ Kết quả trả về: Using polymorphism: Shape.Draw Shape.Draw Shape.Draw Using without polymorphism: Square.Draw

Trong VD trên, phương thức Draw() của lớp Rectangle không phải là dạng ña hình của phương thức Draw() trong lớp Shape. Thay vì vậy, nó ñược xem là một phương thức khác. Do ñó ñể tránh sự trùng lặp giữa lớp cha và lớp con ta nên dùng từ khoá new. Lưu ý : Chúng ta không nên dùng 2 phương thức cùng tên trong một lớp nếu một phương thức dùng từ khoá new, phương thức kia dùng từ khoá override hay virtual. Do ñó, trong lớp Square không thể override phương thức Draw của lớp Shape. Nếu lớp con có dữ liệu member cùng tên với dữ liệu ñó trong lớp cha, ñể tránh bị trùng tên, dữ liệu và hàm member của lớp cha ñược truy xuất thông qua từ khoá base. Trong VD sau, hãy xem cách constructor của lớp cha ñược gọi và dữ liệu member ñược dùng.VD: public Child(int Val):base(val) { myval=65; base.myval; }

hay public Child(int Val) { base(val); myval=65; base.myval; }

ms-help://MS.VSCC/MS.MSDNVS/vclang/html/_pluslang_Virtual_Functions.htm

Trên ñây chỉ là những kiến thức cơ bản trong ngôn ngữ lập trình C#. Các bạn có thể tìm hiểu thêm trong MSDN….. =================================================Hết======================================== ==================

Các cách hiển thị dữ liệu trong ASP.NET Như chúng ta ñã biết Web form là một control hiển thị dữ liệt trên ASP.NET. Ngoài web form ta còn có các control khác ñể hiển thị dữ liệu một các linh hoạt tuỳ vào yêu cầu của từ website nhất ñịnh mà ta có thể quyết ñịnh sử dụng loại control nào.

Created by THÁI NGỌC DUY MSDN based-written.

132 4/12/2007

I. Tạo Custom Tag (Web Custom Control)

Một trong những cách hiển thị và xử lý dữ liệu trong web là tạo ra các customTag. Ta có thể xem các ñối tượng UI trong web form là các customTag do ASP.Net hỗ trợ. Tạo một customTag: -

Trong C# customTag có tên là web Custom control.

-

ðể tạo 1 web Custom control ta phải tạo 1 project có tên web Control library.

-

Sau khi web Control library ñược tạo, thì web Custom control ñược tạo mặc ñịnh. Dịch file (.cs) thành (.dll).

-

ðể sử dụng dll. tạo 1 project mới (webApp).

ðăng ký 1 custom Control. -

Từ project vào menu Tool\customize Toolbox…

-

Trong tab .NET chọn brower. Chọn file dll vừa dịch, ấn OK.

-

Lúc này, ta ñã có 1 tool mới trên toolbar. Kéo tool này vào document.

1. Tạo project Web Control Library. -

Vào menu File\New\Project…

-

Trong hộp thoại New Project:

-

-

Chọn Web Control Library.

-

Nhập tên project mới (ta nhập CustomTag). (tên của project là tên namepase của các ñối tượng sau này).

-

Nếu project chính ñã ñược tạo và ñang mở thì chọn Add to Solution. Nếu chưa có project chính thì chọn Close Solution.

Created by THÁI NGỌC DUY MSDN based-written.

133 4/12/2007

-

Click vào OK. Dialog project ñược ñóng, trong cửa sổ Solution Explorer xuất hiện một project mới.

-

Một control ñược tạo có tên WebCustonControl1.cs.

2. Dịch control WebCustonControl1. -

Vào menu Build\Build CustomTag.

-

Lúc này CustomTag.dll ñã ñược tạo trong thư muc bin của project.

3. ðăng ký một Custom Control. -

Vào menu Tool\Customize ToolBox… hoăc ấn chuột phải lân toolbar chọn Customize ToolBox… .

-

Hộp thoại Customize ToolBox xuất hiện chọn .NET Framework Components.

-

Trong tab .NET Framework Components. Chọn nút Browse…

-

Thoại Open xuất hiện, chọn ñường dẫn ñến tập tin CustomTag.dll (thường tập tin này nằm trong Solution chứa project\tên project\bin\Debug).

Created by THÁI NGỌC DUY MSDN based-written.

134 4/12/2007

-

Click vào Open.

-

Trong hộp thoại Customize ToolBox có thêm dòng WebCustomControl1 ñược ñánh dấu.

Created by THÁI NGỌC DUY MSDN based-written.

135 4/12/2007

-

Click OK. Bậy giờ chúng ta ñể ý trên thanh ToolBar xuất hiện một control mới có tên WebCustomControl1.

4. Sử dụng một CustomControl. Created by THÁI NGỌC DUY MSDN based-written.

136 4/12/2007

-

Nếu muốn sử dụng control này ta cứ việc kéo control này vào WebForm.

-

Nhưng khi chúng ta sử dụng control này cần chú ý ñến vị trí ñặt của control, vì control ñược ñặt ñâu trong code HTML thì dữ liệu ñược in ở chỗ ñó. (ñể biết cách in dữ liệu trong web Custom, xen tiếp phần Nội dung của web Custom Control).

-

Từ cửa sổ HTML code ta thất xuất hiện dòng code ñược tô vàng:

<%@ Register TagPrefix="cc1" Namespace="CustomTag" Assembly="CustomTag" %>

-

ðây là dòng ñăng ký sử dụng dll CustomTag.

-

Ngoài dòng code ñể ñăng ký sử dụng dll, ta còn có một dòng code khác, thường dòng code này ñược ñặt trong nhãn :

-

ðây là dòng quyết ñịnh sử dụng control nào trong project ñã ñược ñăng ký.

5. Nội dung của một Web Custom Control. -

Một class Web Custom Control là class kế thừ lớp System.Web.UI.WebControls.WebControl. Khi ta kế thừa class WebControl thì từ class này ta cò truy xuất ñến các ñối tượng của web thông qua object Page.

Ví dụ: this.Page.Request Là truy xuất ñến ñối tượng request của webPage. -

Các lớp ñược sử dụng: using System; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel;

-

Cũng giống như những class bình thường ñầu tiên vẫn là khai báo namespace. namespace CustomTag

-

Rồi ñến khai báo class.

public class WebCustomControl1 : System.Web.UI.WebControls.WebControl -

Cuối cùng là phương thức: protected override void Render(HtmlTextWriter output)

-

ðây là phương thức default của một Web Custom Control. Nó sẽ ñược chạy khi Web Custom Control ñươc sử dụng và nhận vào một

Created by THÁI NGỌC DUY MSDN based-written.

137 4/12/2007

HtmlTextWriter (output). Output này dùng ñể in nội dụng ra khi sử dụng Web Custom Control. -

Nếu như trong phương thức ta có dòng: output.Write("AZ Solution");

-

Thì khi chay trang web có sử dụng Web Custom Control này sẽ in dòng “AZ Solution” ngay vị trí ñặt Web Custom Control.

Xây dựng thuộc tính cho Web Custom Control. -

Trước tiên ta xây dựng một thuộc tính ñể chứa dữ liệu. private string text;

-

Khai báo một thuộc tính. public string Text { get { return text; } set { text = value; } }

-

Từ ñây trong control ta có thể truy xuất ñến text hay Text ñều ñược.

-

Trong lúc khởi tạo control trong HTML ta gán thuộc tính cho control.

Xem ví dụ: http://azweb05/WebUIDemo/useCustomTag.aspx. Xem document: mshelp://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughcreatingcustomwe bcontrols.htm II. Tạo một Web User Control. 1. Tạo một Web User Control. -

Tạo một Web User Control ta không cần phải tạo một project mới như Web Custom Control, mà ta có thể sử dụng project chứa trong aspx, vì thực chất các Web User Control có thể ñược xem như là một web form.

-

Từ Solution Explorer click phải vào project chọn Add\Add Web User Control.

Created by THÁI NGỌC DUY MSDN based-written.

138 4/12/2007

-

Hộp thoại Add New Item xuất hiện, nhập tên control vào textbox Name, click Open.

Created by THÁI NGỌC DUY MSDN based-written.

139 4/12/2007

-

Lúc này trong cửa sổ Solution Explorer xuất hiện control WebUserControl1.ascx.

-

ðối tượng này gồm có hai file, WebUserControl1.ascx và WebUserControl1.ascx.cs.

-

Trong file WebUserControl1.ascx ta có thể tạo các control của web form hay HTML.

-

Trong file WebUserControl1.ascx.cs ta có thể tạo các thuộc tính và gán dữ liệu cho các control trên form.

2. Bắt ñầu tạo một control cho Web User Control. -

Từ form control (WebUserControl1.ascx) ta tạo một text box từ toolbar.

-

Trong code HTML xuất hiện dòng:

-

Trong file WebUserControl1.ascx.cs. ðây là một class kế thừa lớp System.Web.UI.UserControl .

-

ðể truyền dữ liệu cho textbox vừa tạo ta khai báo một thuộc tính value. public string values;

-

Sau ñó trong sự kiện load của control ta gán giá trị value này cho textbox. private void Page_Load(object sender, System.EventArgs e) { this.TextBox1.Text = values;

Created by THÁI NGỌC DUY MSDN based-written.

140 4/12/2007

}

3. Sử dụng Web User Control vào Web Form. -

Từ web form ta kéo Web User Control vừa tạo từ cửa sổ Solution Explorer vào web form.

-

ðể gán giá trị cho textbox trên Web User Control ta chỉ cần gán giá trị value của control vừa ñược tạo trên web form trong sự kiện load của web form protected WebUserControl1 Menu1; private void Page_Load(object sender, System.EventArgs e) { Menu1.values="AZ Solution"; }

-

ðối tượng Menu1 là control vừa ñược tạo từ trên. Nếu VS.NET không tự khởi tạo ñối tượng thì ta phải tự khởi tạo bằng tay.

-

Bây giờ chạy trang web thì Web User Control là một textbox có chứa dòng chữ “AZ Solution”.

Xem ví dụ: http://azweb05/WebUIDemo/use_userControl.aspx Xem document: mshelp://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughcreatingwebuse rcontrols.htm Kết luật: Trong lập trình web, Web Custom Control là một công cụ không thể thiếu. Ta có thể viết một lần và sử dụng cho tất cả các trang web, chỉ cần ñăng ký và sử dụng. Web Custom Control có thể ñược xem là một control trong web form mà do người lập trình ñịnh nghĩa. Ngoài Web Custom Control, MS còn hỗ trợ một công cụ khác nữa ñó là Web User Control. Công cụ này dễ sử dụng hơn, nó ñược sử dụng giống như web form và có thể viết code HTML, tương tác ñến sự kiện của các control nhưng không thể sử xây dựng thành một công cụ như Web CusTom Control vì nó ñược dịch trong lúc chạy. Với những khả năng và giới hạn của từng control mà có cách sử dụng tốt nhất như: -

Xây dựng Web Custom Control là có thể sử dụng không những cho website hiện tại mà có thể sử dụng cho các website khác sau này.

-

Còn sử dụng Web User Control là có thể sử dụng cho website hiện tại. Trong khi ñó Web Form chỉ chó thể sử dụng cho trang hiện tại. Vì thế,

Created by THÁI NGỌC DUY MSDN based-written.

141 4/12/2007

một Web Form có thể conver thành một Web User Control một các tự ñộng nhờ vào cộng cụ của VS.NET (xem mshelp://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughconvertingw ebformtousercontrol.htm. trong document). Xem tài liệu tổng quan: ms-help://MS.VSCC/MS.MSDNVS/vbcon/html/vboriWebUserControls.htm &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

Các ñối tượng cần biết trong WEB. I. Page. Page là một ñối tượng Servers. Nó chứa tất cả các control server page. Các thuộc tính cần quan tâm của ñối tượng Page: -

Application:

-

Request:

-

Response:

-

Session:

-

Server:

Xem Document: mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemwebuipagememberstopic. htm II. Response: 1. Lưu và ñọc một cookie: //Tạo thời gian lưu trữ DateTime dt = DateTime.Now; TimeSpan ts = new TimeSpan(0,0,10,0); //Cấp phát một Cookie. HttpCookie MyCookie = new HttpCookie("name"); MyCookie.Value = "AZ Solution"; MyCookie.Expires = dt.Add(ts); //Lưu giá trị Cookie Response.Cookies.Add(MyCookie); //ðọc giá trị Cookie String valueCookie = Response.Cookies["name"].Value; //In giá trị Cookie ra trang web Page.Response.Write(valueCookie);

Created by THÁI NGỌC DUY MSDN based-written.

142 4/12/2007

2. Phương thứa write(); Ví dụ: ta muốn in một câu thông báo hay một ñoạn script nào ñó trên trang web bằng các gọi một phương thức ñã ñược ñịnh nghĩa trong code của web form. Ta thực hiện như sau: - Tạo một phương thức có tên print_text(); public void print_text(String text) { Page.Response.Write(text);

} - Trong code HTML ta gọi phương thức print_text() vừa tạo. <% print_text("AZ Solution"); %>

* Nội dung ñược in ñúng ngay vị trí lúc gọi phương thức print_text(). Xem Document: mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemwebhttpresponsemembers topic.htm III. Request: 1. ðọc tất cả các giá trị có trong ñối tượng headers. public void printHeaders() { int loop1, loop2; System.Collections.Specialized.NameValueCollection coll; // Load Header collection vào ñối tượng NameValueCollection. coll=Request.Headers; // ðọc tên tất cả các thành phần vào mảng chuỗi. String[] arr1 = coll.AllKeys; for (loop1 = 0; loop1<arr1.Length; loop1++) { Response.Write("Key: " + arr1[loop1] + "
"); // Lấy tất cả các giá trị của tên. String[] arr2=coll.GetValues(arr1[loop1]); for (loop2 = 0; loop2<arr2.Length; loop2++) { Response.Write("Value " + loop2 + ": " + arr2[loop2] + "
"); } } }

2. ðọc tất cả các giá trị có trong QueryString. public void printQueryString() { int loop1, loop2; // Load ñối tượng NameValueCollection. System.Collections.Specialized.NameValueCollection coll=Request.QueryString;

Created by THÁI NGỌC DUY MSDN based-written.

143 4/12/2007

// ðọc tên tất cả các thành phần vào mảng chuỗi. String[] arr1 = coll.AllKeys; for (loop1 = 0; loop1 < arr1.Length; loop1++) { Response.Write("Key: " + arr1[loop1] + "
"); String[] arr2 = coll.GetValues(arr1[loop1]); for (loop2 = 0; loop2 < arr2.Length; loop2++) { Response.Write("Value " + loop2 + ": " + arr2[loop2] + "
"); } } }

QueryString là dữ liệu ñược truyền từ trang này qua trang khác bằng method get. Tức dữ liệu truyền ñi ñược hiển thị trong URL. Ví dụ: một cách truyền dữ liệu theo QueryString. http://azweb05/WebUIDemo/WebForm1.aspx?name=AZ Solution&value=1 ðể lấy giá trị của name và value. Ta viết: Page.Response.Write(Request.QueryString["name"]); Page.Response.Write(Request.QueryString["value"]);

3. ðọc tất cả các ñối tượng trong Form. public void printForms() { int loop1; System.Collections.Specialized.NameValueCollection coll; //Load Form variables vào ñối tượng NameValueCollection. coll=Request.Form; // ðọc tên tất cả các thành phần vào mảng chuỗi. String[] arr1 = coll.AllKeys; for (loop1 = 0; loop1 < arr1.Length; loop1++) { Response.Write("Form: " + arr1[loop1] + "
"); } }

Trong ASP.NET, ñối tượng Form là tập hợp các dữ liệu ñược truyền trong method Post. Ví dụ: ta có một form gồm một textbox và một nút submit. Thuộc tính action là liên kết ñến trang hiện tại (WebForm1.aspx). method = post.

Khi nút submit ñược click, dữ liệu trong text ñược truyền ñến trang WebForm1.aspx. Lúc này ñể lấy dữ liệu trong textbox ta phải dùng qua ñối tượng Form. Page.Response.Write(Request.Form["name"]);

Created by THÁI NGỌC DUY MSDN based-written.

144 4/12/2007

* name là id của textbox. 4. ðọc tất cả các biến server. public void printSerVerVariables() { int loop1, loop2; System.Collections.Specialized.NameValueCollection coll; // Load ServerVariable collection vào ñối tượng NameValueCollection. coll=Request.ServerVariables; // ðọc tên tất cả các thành phần vào mảng chuỗi. String[] arr1 = coll.AllKeys; for (loop1 = 0; loop1 < arr1.Length; loop1++) { Response.Write("Key: " + arr1[loop1] + "
"); String[] arr2=coll.GetValues(arr1[loop1]); for (loop2 = 0; loop2 < arr2.Length; loop2++) { Response.Write("Value " + loop2 + ": " + arr2[loop2] + "
"); } } }

Với ñối tượng Request ta có thể lấy tất cả các biến mội trường, thành phần dữ liệu, dữ liệu truyền từ các trang khác. Từ những ví dụ trên ta có thể lấy một thành phần dữ liệu khi ta biết ñược tên hay vị trí (index) bằng cách truy xuất trực tiếp với tên hay index. Page.Response.Write(Page.Request.Params["name"]);

IV. Application Các biến ñược lưu trong application có giá trị cho cả website. Tức các trang trong website ñều có thể truy xuất ñến các biến này. 1. Gán một biến vào Application. Page.Application.Set("name","AZ Solution");

Dữ liệu trong Application là một object. 2. ðọc dữ liệu trong Application. String valueApp = (String)Page.Application.Get("name");

Ngoài ra ta còn có các phương thức và các thuộc tính khác của Application. V. Session. Các biến trong Session có giá trị ñối với từng user một. 1. Gán một biến vào Session. Page.Session.Add("name","AZ Solution");

Trong Session không có phương thức Set giống như Application mà sử dụng phương thức Add. 2. ðọc dữ liệu trong Session. Created by THÁI NGỌC DUY MSDN based-written.

145 4/12/2007

String valueSes = (String)Page.Session["name"];

Trong Session cũng không có phương thức Get mà các phần tử trong Session là các item. Các item này ñược sử dụng như các một mảng. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&& Read XML private void Page_Load(object sender, System.EventArgs e) { XmlDocument doc = new XmlDocument(); doc.Load(Server.MapPath("application.xml")); XmlElement root = doc.DocumentElement["information"]; Page.Response.Write(root.GetAttribute("id")); root.SetAttribute("id","AZ Solution"); Page.Response.Write(root.GetAttribute("id")); //write xml. XmlTextWriter writer = new XmlTextWriter(Server.MapPath("application.xml"),System.Text.UTF8Encoding.UTF8); writer.Formatting= Formatting.Indented; doc.WriteTo(writer); writer.Flush(); Console.WriteLine(); writer.Close(); }

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&

Báo cáo xây dựng UI trên ASP.NET Tổng Quan: Khi chúng ta tạo những Web dùng Web Form page ñể làm giao diện thì chúng ta có thể sử dụng những loại Contorls sau và chúng ñã ñược Microsoft cung cấp trong môi trường VS.NET (C#): Khi chúng ta tạo mới một web Form cũng giống như tạo mới một Form trong Visual Basic, nhưng phần mở rộng của nó là (.aspx). Trên web form này cho chúng ta bố trí một giao diện người cho ứng dụng của chúng ta. Khi chúng ta double – Click vào web form thì nó ñưa ra file có phần mở rộng .aspx.cs cho chúng ta viết code của trang web form (.aspx). MốI liên hệ giữa hai tập tin trên là :Tập tin .aspx dùng ñể tạo giao diện người dùng, tập tin .aspx.cs dùng ñể viết code cho giao diện ñó. HTML server controls Web server controls Validation controls Web User controls

Cách sử dụng một control Web server trong C# Những control loại này thì chúng nằm trên tab Web Forms của ToolBox.

Created by THÁI NGỌC DUY MSDN based-written.

146 4/12/2007

Khi chúng ta tạo giao diện người dùng, sử dụng những control loại này thì chúng ñược lập trình trên trang server ñể thực hiện các chức năng của ứng dụng. I. Hai cách ñể ñưa một web server control vào trang (Web

form page)

1. Sử dụng môi trường Designer của C# Trong cách tạo này thì chúng ta ñến tab Web Form và Click một control sau ñó vẽ nó vào trang (web form) và ñặt thuộc tính , lập trình các sự kiện cho nó. ở trên server thì các controls này chủ yếu là sự kiện Click và có một số control khác có thêm sự kiện Change( vd: radiobutton textbox…). Trong cách thứ nhất này sau khi chúng ta vẽ một control thì trong môi trường Design của C# tự ñộng viết code cho việc khai báo một control trong cả hai môi trường C# và ASP.NET và ñược ñặt tên mặt ñịnh trong file có phần mở rộng .aspx.cs (C#) cho nên chúng ta phải ñặt tên lại theo cách của mình và nó cũng tự ñộng viết tag trong cú pháp ASP.NET cho các control trong phần view HTML (góc trái bên dướI của màn hình).Trong cách này thì chúng ta cũng có quyền tự khai báo một control trong file có phần mở rộng .aspx.cs hay trong file aspx (View HTML) và ñặc thuộc tính lập trình cho nó, nghĩa là không cần kéo thả từ ToolBox. 2. Tạo một control theo cú pháp của ASP.NET Trong cách này thì chúng ta tự viết code theo cú pháp của ASP.NET qui ñịnh trong phần view HTML như sau : Một web server control ñược khai báo với tag XMl theo một tiếp ñầu ngữ (hay còn gọI là không gian tên) asp Một control server thì phải có thuộc tính runat=”server” Và ñặt thuộc tính ID cho control ñó. Một control có tag ñóng hoặc nó tự ñóng Ví dụ : Một textbox server control có thẻ ñóng Một textbox server control tự ñóng. control Web DropDownList ,chứa các con như comboBox 0 1 Created by THÁI NGỌC DUY MSDN based-written.

147 4/12/2007

2 3
3. Có bao nhiêu Web server controls ? Có 30 web controls server mặt ñịnh có sẳn từ ToolBox trừ những control mà chúng ta có thể thêm vào ToolBox như : ScrollBar,ToolBar….(là những control không mặc ñịnh) Và những control do chúng ta tự tạo ra (còn gọi là Web custom control) cũng ñược thêm vào trong ToolBox. Trong số ñó có những control rất quen thuộc với các bạn như : Textbox, button, label,radio…..mà các bạn ñã từng biết chức năng của chúng trong các ngôn ngữ khác như VB, ngoài ra ñối với Web thì chúng có các chức năng khác. Và có những control khác (mới lạ) như : Calendar, XML, CrystalReportViewer, RequiredFieldValidator, literal, CompareValidator, AdRotator, PlaceHolder, panel, CustomValidator

II. Sau ñây là chúng ta khảo sát chi tiết về một web server control cùng

các

thuộc

tính



các

sự

kiện

của

nó.

1. Label Tạo trong môi trường Designer thì click control và vẽ lên Form và nó tự viết code theo mặt ñịnh ở trong hai môi trường C# và ASP.NET như ñã nói ở trên. Chúng ta nên sửa tên những control theo ý logic của ngườI lập trình cho dễ nhớ và dễ lập trình. Cú pháp: + Trong C# : Protected System.Web.WebControls.Label Label1; + Trong ASP.NET : Chức năng : Nó dùng ñể chứa dữ liệu và ñược lập trình thông qua các control khác trên server bằng C# ñể thực hiện một chức năng nào ñó hay chứa một dữ liệu khác. Các thuộc tính : + DataBindings : Created by THÁI NGỌC DUY MSDN based-written.

148 4/12/2007

+ ID: thuộc tính này là duy nhất cho mỗI control trên trang ñể nhận biết chúng khi lập trình. + Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó. + BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + BorderColor : thuộc tính này màu ñường viền xung quanh một control. + BorderStyle : thuộc tính này nhận một kiểu ñường viền xung quanh một control chúng ta chỉ chọn một kiểu trong danh sách các kiểu ñã cung cấp sẳn. + BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều rộng ñường viền của một control. + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + Enabled : thuộc tính này nhận hai giái trị True hay False - nếu là True : thì nhận focus và dữ liệu ñược sửa trên control ñó. - Nếu là False : thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + Font :có các thuộc tính con sau: - Name: chỉ tên font và có kiểu kèm theo - Bold: Nhận hai giá trị True: thì chữ in ñậm,false :chữ bình thường. - Italic: nhận True:chữ in nghiêng, nhận False :chữ bình thường. - Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính Name và tự ñộng khi chúng ta chọn thuộc tính Name. - Overline: nhận giá trị True: thì có một ñường thẳng nằm ngang phía trên text sát biên của control. Nếu nhận False thì không có ñường này. - Size: thuộc tính này nhận kích thước của font có sẳn cho chúng ta chọn. - Strikeout: Nhận giá trị True: thì vẽ một ñường thẳng nằm ngang nằm giữa text của control. Nếu nhận False thì không có ñường này. - Underline: Nếu nhận giá trị True thì có một ñường thẳng gạch dướI text của control. Nếu nhận là False thì không. - ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. Created by THÁI NGỌC DUY MSDN based-written.

149 4/12/2007

+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + Text : Nhận giá trị text do chúng ta gõ vào ban ñầu. + ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện ra. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control. Các sự kiện : - DataBinding - Disposed - Init - Load : Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control - PreRender - Unload

2.

Textbox Tạo trong môi trường Designer thì click control vẽ lên Form và nó tự viết code theo mặt ñịnh ở trong hai môi trường C# và ASP.NET như ñã nói ở trên. Chúng ta nên sửa tên những control theo ý logic của ngườI lập trình cho dễ nhớ và dễ lập trình. a) Cú pháp: + Trong C# : Protected System.Web.WebControls.TextBox TextBox1; + Trong ASP.NET b) Chức năng: Dùng ñể chứa dữ liệu và ñược lập trình trên sever ñể thay ñổi dữ liệu của nó thông qua các control khác hay chính nó (thuộc tính AutoPosBack=true vớI sự kiện Onchange). c) Các thuộc tính: + Databindings : + ID: thuộc tính này là duy nhất cho mỗi control trên trang ñể nhận biết chúng khi lập trình. + Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó.

Created by THÁI NGỌC DUY MSDN based-written.

150 4/12/2007

+ AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của control này ngay lập tức ñược gởi về server khi có sự thay ñổI dữ liệu của control này. ðược gởi về server trước các sự kiện click hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu không ñược gởi về ngay lập tức. + BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + BorderColor : thuộc tính này màu ñường viền xung quanh một control. + BorderStyle : thuộc tính này nhận một kiểu ñường viền xung quanh một control chúng ta chỉ chọn một kiểu trong danh sách các kiểu ñã cung cấp sẳn. + BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều rộng ñường viền của một control. + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + Columns: Nhận giá trị nguyên nhưng không thấy có sự thay ñổi. + Enabled : thuộc tính này nhận hai giái trị True hay False - nếu là True : thì nhận focus và dữ liệu ñược sửa trên control ñó. - Nếu là False : thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + Font :có các thuộc tính con sau: - Name: chỉ tên font và có kiểu kèm theo - Bold: Nhận hai giá trị True: thì chữ in ñậm,false :chữ bình thường. - Italic: nhận True:chữ in nghiêng, nhận False :chữ bình thường. - Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính Name và tự ñộng khi chúng ta chọn thuộc tính Name. - Overline: nhận giá trị True: thì có một ñường thẳng nằm ngang phía trên text sát biên của control. Nếu nhận False thì không có ñường này. - Size: thuộc tính này nhận kích thước của font có sẳn cho chúng ta chọn. - Strikeout: Nhận giá trị True: thì vẽ một ñường thẳng nằm ngang nằm giữa text của control. Nếu nhận False thì không có ñường này. - Underline: Nếu nhận giá trị True thì có một ñường thẳng gạch dướI text của control. Nếu nhận là False thì không.

Created by THÁI NGỌC DUY MSDN based-written.

151 4/12/2007

- ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. + MaxLength: thuộc tính nhận giá trị nguyên chỉ chiều dài củaTextBox, số ký tự có thể chứa. + ReadOnly: Thuộc tính này nhận giá trị True thì giá trị text của TextBox chỉ ñọc không thể hiệu chỉnh nghĩa là không focus ñược. + Rows: chỉ số dòng của TextBox + TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + Text : Nhận giá trị text do chúng ta gõ vào ban ñầu. + TextMode: Thuộc tính nhận một trong ba thuộc giá trị có sẳn: - singleLine: chỉ một dòng text - MultiLine: nhiều dòng text - Password: dữ liệu nhập vào hiển thị như dấu ******** + ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện ra. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control. + Wrap : Thuộc tính này nhận một trong hai giá trị - Nếu là True: Thì text box không có thanh trượt ngang. - Nếu False và thuộc tính TextMode là Mutiline thì Text Box có thanh trược ngang ñể chúng ta kéo xem dữ liệu trong TextBox d)Các sự kiện + DataBinding + Disposed + int + Load:Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control + PreRender + TextChanged + Unload

3.

Button Là một nút lệnh, tạo trong môi trường Designer thì click control này vẽ lên Form và nó tự viết code theo mặt ñịnh trong hai môi trường C# và ASP.NET như ñã nói ở trên. Chúng ta nên sửa tên những control theo ý logic của ngườI lập trình cho dễ nhớ và dễ lập trình.

Created by THÁI NGỌC DUY MSDN based-written.

152 4/12/2007

a) Cú pháp: + Trong C#: protected System.Web.UI.WebControls.Button Button1; + Trong ASP.NET b) Chức năng: Là nút lệnh nên chức năng dùng ñể click ñối với ngườI dùng, còn ñối với ngườI lập trình thì lập trình cho nó thực hiện một công việc gì ñó sau khi nó ñược click. c) Các thuộc tính: + Databindings : + ID: thuộc tính này là duy nhất cho mỗI control trên trang ñể nhận biết chúng khi lập trình. + Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó. + BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + BorderColor : thuộc tính này màu ñường viền xung quanh một control. + BorderStyle : thuộc tính này nhận một kiểu ñường viền xung quanh một control chúng ta chỉ chọn một kiểu trong danh sách các kiểu ñã cung cấp sẳn. + BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều rộng ñường viền của một control. + CausesValidation: thuộc tính này nhận hai giá trị True hay False + CommandArgument: ðây là một thuộc tính tùy chọn ñể gởI tới sự kiện Command của Button và nó kết hợp vớI thuộc tính CommandName. VD: Nếu bạn ñặc thuộc tính CommandName là Sort chẳn hạn và bạn ñặc thuộc tính CommandArgument là Ascending thì bạn ñã chỉ ra một lệnh sắp sếp tăng dần. + CommandName: cung cấp một tên lệnh. Nhưng ở ñây mình chưa rõ sự phối hợp giữa thuộc tính CommandArgument và thuộc tính CommandName vớI sự kiện command + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + Enabled : thuộc tính này nhận hai giái trị True hay False - nếu là True : thì nhận focus và dữ liệu ñược sửa trên control ñó. Created by THÁI NGỌC DUY MSDN based-written.

153 4/12/2007

- Nếu là False : thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + Font :có các thuộc tính con sau: - Name: chỉ tên font và có kiểu kèm theo - Bold: Nhận hai giá trị True: thì chữ in ñậm,false :chữ bình thường. - Italic: nhận True:chữ in nghiêng, nhận False :chữ bình thường. - Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính Name và tự ñộng khi chúng ta chọn thuộc tính Name. - Overline: nhận giá trị True: thì có một ñường thẳng nằm ngang phía trên text sát biên của control. Nếu nhận False thì không có ñường này. - Size: thuộc tính này nhận kích thước của font có sẳn cho chúng ta chọn. - Strikeout: Nhận giá trị True: thì vẽ một ñường thẳng nằm ngang nằm giữa text của control. Nếu nhận False thì không có ñường này. - Underline: Nếu nhận giá trị True thì có một ñường thẳng gạch dướI text của control. Nếu nhận là False thì không. + ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. + TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + Text : Nhận giá trị text do chúng ta gõ vào ban ñầu. + ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện ra. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control. d) Các sự kiện ♦ Click :Lập trình ñể thực hiện chức năng khi ngườI dùng click ♦ Command ♦ DataBinding ♦ Disposed ♦ Int ♦ Load:Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender Created by THÁI NGỌC DUY MSDN based-written.

154 4/12/2007

♦ Unload

4.

LinkButton

Control này giống hoàn toàn như control Button nhưng chỉ khác một ñiểm là cách nó thể hiện khi ứng dụng chạy cụ thể là nó giống như một hyperlink khi chúng ta ñưa chuột ñến thì con chuột trở thành hình bàn tay. a) Cú pháp: + Trong C#: protected System.Web.UI.WebControls.LinkButton LButton1; + Trong ASP.NET b) chức năng giống như trên. c) Các thuộc tính Giống như trên không khác một thuộc tính nào cả. d) Các sự kiện ♦ Click: Lập trình ñể thực hiện chức năng khi ngườI dùng click ♦ Command ♦ DataBinding ♦ Disposed ♦ Int ♦ Load:Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload

5.

ImageButton Control này giống hai control trên như chỉ khác một ñểm là nó lấy một ảnh làm nền cho Button chứ không có text và nó cũng không có thuộc tính Text a) Cú pháp: + Trong C#: protected System.Web.UI.WebControls.ImageButton IBttn1; + Trong ASP.NET b) chức năng Giống hai loại trên Ngoài ra nó còn có chức năng khi chúng ta rê chuột lên thì chuột ñổi thành hình bày tay. c) Các thuộc tính

Created by THÁI NGỌC DUY MSDN based-written.

155 4/12/2007

+ Databindings : + ID: thuộc tính này là duy nhất cho mỗI control trên trang ñể nhận biết chúng khi lập trình. + Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó. + BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + BorderColor : thuộc tính này màu ñường viền xung quanh một control. + BorderStyle : thuộc tính này nhận một kiểu ñường viền xung quanh một control chúng ta chỉ chọn một kiểu trong danh sách các kiểu ñã cung cấp sẳn. + BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều rộng ñường viền của một control. + CausesValidation: thuộc tính này nhận hai giá trị True hay False + CommandArgument: ðây là một thuộc tính tùy chọn ñể gởI tới sự kiện Command của Button và nó kết hợp vớI thuộc tính CommandName. VD: Nếu bạn ñặc thuộc tính CommandName là Sort chẳn hạn và bạn ñặc thuộc tính CommandArgument là Ascending thì bạn ñã chỉ ra một lệnh sắp sếp tăng dần. + CommandName: cung cấp một tên lệnh. Nhưng ở ñây mình chưa rõ sự phối hợp giữa thuộc tính CommandArgument và thuộc tính CommandName vớI sự kiện command + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + Enabled : thuộc tính này nhận hai giái trị True hay False - nếu là True : thì nhận focus và dữ liệu ñược sửa trên control ñó. - Nếu là False : thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. + ImageAlign: thuộc tính này thực hiện việc canh ảnh như : left, top, … có sẳn các thuộc tính chúng ta chỉ chọn một trong các giá trị ñã cho. + ImageUrl: thuộc tính này nhận một file ảnh làm nền cho control này.

Created by THÁI NGỌC DUY MSDN based-written.

156 4/12/2007

+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện ra. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control. . a) Các sự kiện ♦ Click ♦ Command ♦ DataBinding ♦ Disposed ♦ Int ♦ Load:Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload

6.

HyperLink Control này nó chứa một liên kết ñến một trang khác khi chúng ta Click chuột vào nó. a) Cú pháp + Trong C#: protected System.Web.UI.WebControls.HyperLink link1; + Trong ASP.NET b) chức năng Dùng ñể liên kết ñến một trang khác, ngoài ra chúng ta còn lập trình cho nó thông qua các control khác ñể tùy vào trường hợp nào ñó mà nó link ñến một trang thích hợp chứ không phảI cố ñịnh chỉ link ñến một trang như Hyperlink trong html. c) thuộc tính + Databindings : + ID: thuộc tính này là duy nhất cho mỗI control trên trang ñể nhận biết chúng khi lập trình. + Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó.

Created by THÁI NGỌC DUY MSDN based-written.

157 4/12/2007

+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + BorderColor : thuộc tính này màu ñường viền xung quanh một control. + BorderStyle : thuộc tính này nhận một kiểu ñường viền xung quanh một control chúng ta chỉ chọn một kiểu trong danh sách các kiểu ñã cung cấp sẳn. + BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều rộng ñường viền của một control. + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + Enabled : thuộc tính này nhận hai giái trị True hay False - nếu là True : thì nhận focus và dữ liệu ñược sửa trên control ñó. - Nếu là False : thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + Font :có các thuộc tính con sau: - Name: chỉ tên font và có kiểu kèm theo - Bold: Nhận hai giá trị True: thì chữ in ñậm,false :chữ bình thường. - Italic: nhận True:chữ in nghiêng, nhận False :chữ bình thường. - Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính Name và tự ñộng khi chúng ta chọn thuộc tính Name. - Overline: nhận giá trị True: thì có một ñường thẳng nằm ngang phía trên text sát biên của control. Nếu nhận False thì không có ñường này. - Size: thuộc tính này nhận kích thước của font có sẳn cho chúng ta chọn. - Strikeout: Nhận giá trị True: thì vẽ một ñường thẳng nằm ngang nằm giữa text của control. Nếu nhận False thì không có ñường này. - Underline: Nếu nhận giá trị True thì có một ñường thẳng gạch dướI text của control. Nếu nhận là False thì không. + ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. + ImageUrl : thuộc tính này chứa ảnh làm nền của control + NavigateUrl: thuộc tính này chứa ñịa chỉ trang mà ngườI sử dụng click vào thì chúng liên kết tớI trang ñó, chúng ta có thể thay ñổI ñịa chỉ này bằng cách lập trình từ các control khác.

Created by THÁI NGỌC DUY MSDN based-written.

158 4/12/2007

+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + Target: có sẳn các lưạ chọn cho chúng ta chọn. mình có thử nhưng không thấy có hiệu ứng gì ? các bạn tìm xem + Text : Nhận giá trị text do chúng ta gõ vào ban ñầu. + ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện ra. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control. d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load:Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload

7.

DropDownList

a) cú pháp + Trong C#: protected System.Web.UI.WebControls.DropDownList dlist1; + Trong ASP.NET

b) chức năng Control này dùng ñể chứa một tập các lựa chọn sẳn có. Ngoài ra nó còn có một chức năng tự ñộng giở dữ liệu về server khi chúng ta ñặt thuộc tính AutoPosBack=true. có nghĩa là khi chúng ta chọn một sự lựa chọn trong danh sách ñổ xuống trên giao diện thì của control này nó thực hiện công việc nào ñó nằm trong sự kiện SelectedIndexChanged,(giống ComboBox trong VB)

c) các thuộc tính + DataBindings : + ID: thuộc tính này là duy nhất cho mỗI control trên trang ñể nhận biết chúng khi lập trình.

Created by THÁI NGỌC DUY MSDN based-written.

159 4/12/2007

+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó. + AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của control này ngay lập tức ñược giở về server khi có sự thay ñổI dữ liệu của control này. ðược giở về server trước các sự kiện click hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu không ñược giở về ngay lập tức. + BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + DataMember + DataSource: + DataTextField + DataTextFormatString + DataValueField + Enabled : thuộc tính này nhận hai giái trị True hay False - nếu là True : thì nhận focus và dữ liệu ñược sửa trên control ñó. - Nếu là False : thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + Font :có các thuộc tính con sau: - Name: chỉ tên font và có kiểu kèm theo - Bold: Nhận hai giá trị True: thì chữ in ñậm,false :chữ bình thường. - Italic: nhận True:chữ in nghiêng, nhận False :chữ bình thường. - Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính Name và tự ñộng khi chúng ta chọn thuộc tính Name. - Overline: nhận giá trị True: thì có một ñường thẳng nằm ngang phía trên text sát biên của control. Nếu nhận False thì không có ñường này. - Size: thuộc tính này nhận kích thước của font có sẳn cho chúng ta chọn. - Strikeout: Nhận giá trị True: thì vẽ một ñường thẳng nằm ngang nằm giữa text của control. Nếu nhận False thì không có ñường này. - Underline: Nếu nhận giá trị True thì có một ñường thẳng gạch dướI text của control. Nếu nhận là False thì không.

Created by THÁI NGỌC DUY MSDN based-written.

160 4/12/2007

- ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. + Items: thuộc tính này chứa các mục cố ñịnh cho danh sách ñổ xuống. Thông thường thì chúng ta lập trình nếu những mục này là ñộng (có sự thay ñổi). Trong thuộc tính mỗI Item nó có hai giá trị thứ nhất là Text và thứ hai là Value. + TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control.

d) các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload ♦ SelectedIndexChanged :

e) Ví dụ // Lấy thuộc tính giá trị của thuộc tính Text this.Textbox1.Text= this.DropDownList1.SelectedItem.Text; // Lấy thuộc tính giá trị của thuộc tính Value this.DropDownList1.SelectedItem.Value;

8.

ListBox Control này dùng ñể chứa một danh dách có nhưng không xuất hiện hết ra ngoài như DropDownList. Nó giống với control trên nhưng chỉ khác là dữ liệu không thể hiện hết ra ngoài. a) Cú pháp + Trong C#: protected System.Web.UI.WebControls.ListBox ListBox1; + Trong ASP.NET b) Chức năng Dùng ñể chứa dữ liệu và lập trình với các sự kiện của các control khác hay của chính nó. c) Các thuộc tính + DataBindings :

Created by THÁI NGỌC DUY MSDN based-written.

161 4/12/2007

+ ID: thuộc tính này là duy nhất cho mỗi control trên trang ñể nhận biết chúng khi lập trình. + Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó. + AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của control này ngay lập tức ñược giở về server khi có sự thay ñổI dữ liệu của control này. ðược giở về server trước các sự kiện click hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu không ñược giở về ngay lập tức. + BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + DataMember + DataSource: + DataTextField + DataTextFormatString + DataValueField + Enabled : thuộc tính này nhận hai giái trị True hay False - Nếu là True: nhận ñược focus và hiệu chỉnh dữ liệu ñược - Nếu là False: thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + Font :có các thuộc tính con sau: - Name: chỉ tên font và có kiểu kèm theo - Bold: Nhận hai giá trị True: thì chữ in ñậm,false :chữ bình thường. - Italic: nhận True:chữ in nghiêng, nhận False :chữ bình thường. - Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính Name và tự ñộng khi chúng ta chọn thuộc tính Name. - Overline: nhận giá trị True: thì có một ñường thẳng nằm ngang phía trên text sát biên của control. Nếu nhận False thì không có ñường này. - Size: thuộc tính này nhận kích thước của font có sẳn cho chúng ta chọn. - Strikeout: Nhận giá trị True: thì vẽ một ñường thẳng nằm ngang nằm giữa text của control. Nếu nhận False thì không có ñường này. - Underline: Nếu nhận giá trị True thì có một ñường thẳng gạch dướI text của control. Nếu nhận là False thì không. Created by THÁI NGỌC DUY MSDN based-written.

162 4/12/2007

+ ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. + Items: thuộc tính này chứa các mục cố ñịnh cho danh sách ñổ xuống. Thông thường thì chúng ta lập trình nếu những mục này là ñộng (có sự thay ñổi). Trong thuộc tính mỗI Item nó có hai giá trị thứ nhất là Text và thứ hai là Value. + Rows: Thuộc tính này nhận giá trị nguyên chỉ chỉ số dòng (không thấy có hiệu lực). + SelectionMode: thuộc tính này nhận hai giá trị single hay mutiple(nhưng khi ñổI hai giá trị này cho nhau thì không thấy có gì thay ñổi). + TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control. d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload ♦ SelectedIndexChanged : Khi chúng ta lập trình cho sự kiện này, nó chỉ có tác dụng khi thuộc tính AutoPosBack của control này là Treu Ví dụ

9.

DataGrid Control này dùng ñể hiển thị dữ liệu cho ngườI dùng xem có thể là từ database hay từ một nguồn nào ñó. a) Cú pháp: + Trong ASP.NET

Created by THÁI NGỌC DUY MSDN based-written.

163 4/12/2007



cú pháp trên là có một số thuộc tính kèm theo +Trong C# : protected System.Web.UI.WebControls.DataGrid DataGrid1;

b) Chức năng Ngoài chức năng hiển thị dữ liệu ñể xem nó còn cho chúng ta cập nhật, chọn, xóa một dòng (1 record). c) Các thuộc tính + DataBindings + ID : Thuộc tính mang tính duy nhất cho mỗI control trên trang. + AccessKey: Phím tắt truy cập ñến control có dạng Alt + phím + AllowCustomPaging:thuộc tính này nhận giá trị True thì cho chúng ta một tùy chọn ở cuối control này dưới dạng một HyperLink mà chúng ta click vào ñề duy chuyển ñến những record kế tiếp. Nếu nhận giá trị False thì không có link này. + AllowPaging: nhận hai giá trị true hay False. + AlternatingItemStyle : ðịnh kiểu cho từng Item có các thuộc tính con: - BackColor: chọn màu nền - BorderColor: chọn màu biên. - BorderStyle: chọn kiểu biên. - BorderWidth: ñộ rộng biên nhận giá trị nguyên. - CssClass: lớp Css ñể ñịnh kiểu. - Font :ñịnh kiểu chữ cho một Item như ñã biết. - ForeColor: chọn màu chữ. - Height: Thuộc tính nhận giá trị nguyên chỉ chiều cao của Item - HorizontalAlign: thuộc tính canh lề các mục dữ liệu theo thanh ngang. Chọn một trong các thuộc tính (left, right, center, justify). - VerticalAlign: Thuộc tính canh dọc và cũng chọn một trong các thuộc tính (notSet, top, middle,bottom)

Created by THÁI NGỌC DUY MSDN based-written.

164 4/12/2007

- Width : nhận giá trị nguyên cho biết ñộ rộng của của Item - Wrap : nhận true hay false ( chưa rõ). + AutoGenerateColumns: nhận giá trị True thì tự ñộng hiển thị ñầy ñủ các cột trong dữ liệu. Nếu nhận False thì không hiển thị mục dữ liệu nào cả. + BackColor : Chọn màu nền cho toàn bộ lướI. + BackImageUrl:chọn một ảnh làm nền cho lướI dữ liệu. + BorderColor: chọn màu ñường viền cho lưới cùng vớI các Item. + BorderStyle: chọn kiểu ñường viền. + BorderWidth: chọn ñộ rộng ñường viền. + cellpadding : … nhận giá trị nguyên. + CellSpacing: khoản không giữa các ô (Item) + Columns: Thuộc tính này cho chúng ta chọn ñịnh dạng cho từng cột + CssClass: file ñịnh kiểu .css (không cần thiết). + DataField: + DataMember + DataSource + EditItemIndex: thuộc tính này nó cho phép chúng ta Edit một Item nào ñó tùy thuộc vào chỉ số nó nhận hay Click chuột vào Item nào. Những Item ñược ñánh số từ 0 trở ñi. Nếu =-1 thì không có Item nào ñược Edit. + EditItemStyle: thuộc tính này nó cho ñịnh dạng màu sắc, ñường biên, font chữ, ….. khi chúng ta ñang Edit một Item. + Enabled: Nhận true thì nó nhận ñược focus, nếu bẳng False thì nó mất focus (mờ ñi) + EnableViewState:nhận true hay False(không thấy sự thay ñổI rõ) + Font : thuộc tính này là áp dụng vào dữ liệu lúc hiển thị, còn ñốI vớI từng Item thì nó có thuộc tính font riêng cho nó. + FooterStyle: thuộc tính này nó chứa các thuộc tính con cho chúng ta ñịnh dạng màu nền, màu chữ, kiểu biên, ñộng rộng biên…. + HeaderStyle: tương tự như FooterStyle + Height: cho biết ñộ cao của lướI nhận giá trị nguyên + HorizontalAlign: thuộc tính canh biên của control ñốI vớI form chúng ta chọn một trong các giá trị có sẳn như (left,center, right,noset,justify). + ItemStyle: thuộc tính này nó một tập các thuộc tính con ñể xát ñịnh về kiểu của một Item thể hiện trong lướI như : BackColor, BorderColor, BorderStyle, font,….. + PagerStyle: thuộc tính này có một tập các thuộc tính con cho chúng ta xát ñịnh kiểu ñịnh dạng trang của control này như :BackColor, BorderColor, font,…… Ngoài ra nó còn có các thuộc tính mớI như: - Mode : thuộc tính này nhận giá trị NextPrev hay giá trị numericPages. Created by THÁI NGỌC DUY MSDN based-written.

165 4/12/2007

♦ Nếu là NextPrev thì ở cuốI lướI có dạng là Prev và Next (trang trước và trang sau). ♦ Nếu là numericPages thì ở cuốI lướI có dạng là các số thứ tự các trang. - NextPageText: text mà chúng xuất hiện ở ñâu là phụ thuộcvào thuộc tính (Position) ví dụ như : trước sau - PageButonCount : nhận giá trị nguyên - PrevPageText:text mà chúng xuất hiện ở ñâu là phụ thuộc vào thuộc tính (Position) ví dụ như : trước sau - VerticalAlign: thuộc tính canh dọc có 4 giá trị ñể chọn (NotSet, Top, Middle, Bottom) + PageSize : Nhận giá trị nguyên cho biết kích thước của lưới. + SelectIndex: Cho biết Item nào ñược chọn nhận giá trị nguyên + SelectedItemStyle : Thuộc tính này nó ñịnh dạng kiểu một Item ñược chọn thông qua các thuộc tính con + showFooter: thuộc tính nhận giá trị true thì show footer còn nhận false thì không. + showHeader:nhận true show header, nhận fasle thì không. d) Các sự kiện + CancelCommand: + DataBinding + DeteleCommand + Dispoed + EditCommand + Int + ItemCommand + ItemCreated + ItemDataBound + Load + PageIndexChanged + PreRender + SelectedIndexChanged + SortCommand + Unload + UpdateCommand

Một ví dụ Xem ñề mô 10. DataList( gần giống dataGrid) a) Cú pháp b) Chứa năng c) Thuộc tính d) Các sự kiện Created by THÁI NGỌC DUY MSDN based-written.

166 4/12/2007

e) Một ví dụ Xem chi tiết 11. Repeater(gần giống dataGrid) a) Cú pháp b) Chứa năng Control này là một control chứa nó cho phép tạo một danh sách tùy thích. ñược có sẳn trên trang khi trang ñó ñược load ðể sử dụng control bạn phảI tạo template ñể ñịnh nghĩa cách trình bày nộI dung cho nó.Template chứa tổ hợp text HTML và những control hợp lệ trên Web Form page Nếu chúng ta không ñịnh nghĩa template cho control hoặc template không chứa những phần tử nào hết thì khi ứng dụng chạy control sẽ không hiển thị. Control này nó hỗ trợ những Template sau : Template ItemTemplate

Description

Những phần tử là ñược trả lạI một lần cho mỗI dòng trong data source. ðể hiển thị dữ liệu trong ItemTemplate, bạn phảI thêm một hay nhiều Web server or HTML server controls cho template và nốI control ñó ñến data source. AlternatingItemTemplate Giống như ItemTemplate ,nhưng nó hoàn trả lạI cho mỗI dòng khác trongcontrol Repeater . Bạn có thể chỉ sự khác nhau cho phần tử AlternatingItemTemplate bằng cách ñặc thuộc tính style cho nó. HeaderTemplate and Những phần tử ñược trả lạI một lần trước và sau FooterTemplate khi tất cả các dòng dữ liệu ñược kết nối . Ví dụ , bạn có một bản HTML ñược lập lạI bẳng tag , ở trong HeaderTemplate và ñặc tag ñóng,
trong FooterTemplate. SeparatorTemplate chỉ sự phân cách của mỗI dòng Khi chúng ta làm việc vớI các template của control thì chúng ta phảI sang HTML view. Chúng thường sử dụng các DataGrid và DataList ñể hiễn thị dữ liệu hơn là dùng Repeater. c) Thuộc tính d) Các sự kiện e) Một ví dụ

12. CheckBox a) Cú pháp b) Chứa năng Là một nút chọn. Created by THÁI NGỌC DUY MSDN based-written.

167 4/12/2007

c) Thuộc tính + Databindings : + ID: thuộc tính này là duy nhất cho mỗi control trên trang ñể nhận biết chúng khi lập trình. + Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó. + AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của control này ngay lập tức ñược giở về server khi có sự thay ñổI dữ liệu của control này. ðược giở về server trước các sự kiện click hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu không ñược giở về ngay lập tức. + BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + BorderColor : thuộc tính này màu ñường viền xung quanh một control. + BorderStyle : thuộc tính này nhận một kiểu ñường viền xung quanh một control chúng ta chỉ chọn một kiểu trong danh sách các kiểu ñã cung cấp sẳn. + BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều rộng ñường viền của một control. + Checked: Nhận giá trị true thì checkBox ñược checked, nhận false thì không. + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + Enabled : thuộc tính này nhận hai giái trị True hay False - nếu là True : thì nhận focus và dữ liệu ñược sửa trên control ñó. - Nếu là False : thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + Font :có các thuộc tính con sau: - Name: chỉ tên font và có kiểu kèm theo - Bold: Nhận hai giá trị True: thì chữ in ñậm,false :chữ bình thường. - Italic: nhận True:chữ in nghiêng, nhận False :chữ bình thường. - Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính Name và tự ñộng khi chúng ta chọn thuộc tính Name. - Overline: nhận giá trị True: thì có một ñường thẳng nằm ngang phía trên text sát biên của control. Nếu nhận False thì không có ñường này. - Size: thuộc tính này nhận kích thước của font có sẳn cho chúng ta chọn. Created by THÁI NGỌC DUY MSDN based-written.

168 4/12/2007

- Strikeout: Nhận giá trị True: thì vẽ một ñường thẳng nằm ngang nằm giữa text của control. Nếu nhận False thì không có ñường này. - Underline: Nếu nhận giá trị True thì có một ñường thẳng gạch dướI text của control. Nếu nhận là False thì không. + ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. + TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + Text : Nhận giá trị text do chúng ta gõ vào ban ñầu. + TextAlign: nhận giá trị left thì text ở bên trái CheckBox, nhận giá trị right thì text ở bên phảI CheckBox. + ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện ra. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control. a) Các sự kiện ♦ CheckedChanged : ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload b) Một ví dụ

13. CheckBoxList a) Cú pháp b) Chứa năng Nó là một nhóm các checkbox mà chúng ta có thể chọn tất cả hoặc ít hơn. c) Thuộc tính d) Các sự kiện ♦ DataBinding ♦ Disposed Created by THÁI NGỌC DUY MSDN based-written.

169 4/12/2007

♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ SelectedIndexChanged : ♦ Unload e) Một ví dụ

14. RadioButtonList a) Cú pháp b) Chứa năng Một nhóm các nút RadioButton mà chúng ta chỉ ñược chọn một. c) Thuộc tính + DataBindings : + ID: thuộc tính này là duy nhất cho mỗI control trên trang ñể nhận biết chúng khi lập trình. + Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím ñể khi ứng dụng chạy ta nhấn Alt + phím ñó thì chúng ta sẽ ñược con trỏ focus ñến control ñó. + AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của control này ngay lập tức ñược giở về server khi có sự thay ñổI dữ liệu của control này. ðược giở về server trước các sự kiện click hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu không ñược giở về ngay lập tức. + BackColor : Giá trị của thuộc tính này là nhận màu nền cho một control. + CssClass:thuộc tính này chỉ sự ñịnh dạng kiểu của một control thông qua một file .CSS file này do chúng ta ñịnh nghĩa. + CellPadding + CellSpacing + + + + + +

DataMember DataSource: DataTextField DataTextFormatString DataValueField Enabled : thuộc tính này nhận hai giái trị True hay False - nếu là True : thì nhận focus và dữ liệu ñược sửa trên control ñó. - Nếu là False : thì ngược lại. + EnableViewState: thuộc tính này nhận một trong hai giá trị True hay False : Mình chưa thấy rõ sự khác nhau này + Font :có các thuộc tính con sau: - Name: chỉ tên font và có kiểu kèm theo Created by THÁI NGỌC DUY MSDN based-written.

170 4/12/2007

- Bold: Nhận hai giá trị True: thì chữ in ñậm,false :chữ bình thường. - Italic: nhận True:chữ in nghiêng, nhận False :chữ bình thường. - Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính Name và tự ñộng khi chúng ta chọn thuộc tính Name. - Overline: nhận giá trị True: thì có một ñường thẳng nằm ngang phía trên text sát biên của control. Nếu nhận False thì không có ñường này. - Size: thuộc tính này nhận kích thước của font có sẳn cho chúng ta chọn. - Strikeout: Nhận giá trị True: thì vẽ một ñường thẳng nằm ngang nằm giữa text của control. Nếu nhận False thì không có ñường này. - Underline: Nếu nhận giá trị True thì có một ñường thẳng gạch dướI text của control. Nếu nhận là False thì không. - ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn. + Height: Nhận giá trị là số nguyên cho biết chiều cao của control. + Items: thuộc tính này chứa các mục cố ñịnh cho danh sách ñổ xuống. Thông thường thì chúng ta lập trình nếu những mục này là ñộng (có sự thay ñổi). Trong thuộc tính mỗI Item nó có hai giá trị thứ nhất là Text và thứ hai là Value. + RepeatColumns: thuộc tính này nhận giá trị nguyên dương tương ứng số cột tạo thành vớI số lượng các nút Radiobutton. + RepeatDirection: thuộc tính mang một trong hai giá trị sau: Nếu là Hirozotal thì các RadioButton ñược xếp thành hàng ngang. Nếu mang giá trị Vertical thì xếp hàng dọc. + RepeatLayout: thuộc tính này nhận giá trị là Table thì nó trình bày các radiobutton dạng bảng và một một dạng khác khi nó nhận giá trị flow + TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi chúng ta nhấn phím Tab thì control ñó nó sẽ nhận là focus theo số chúng ta ñã ñặc. + Visible: nhận giá trị True thì control này không hiển thị lên form. nếu nhận giá trị False thì hiển thị lên form. + Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của control. a) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender Created by THÁI NGỌC DUY MSDN based-written.

171 4/12/2007

♦ SelectedIndexChanged : ♦ Unload b) Một ví dụ

15. RadioButton a) Cú pháp b) Chứa năng Control này giống tương tự như trên thay vì nhiều nút radioButton thì nó chỉ một nút thôi. c) Thuộc tính giống như checkBox d) Các sự kiện ♦ CheckedChanged : ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload e) Một ví dụ

16. Image a) Cú pháp b) Chứa năng Control này chứa ảnh, và ảnh này có thể ñược thay ñổi khi chúng ta lập trình cho những control khác thay ñổI nó. Control này nó chỉ chứa một ảnh nên nó thường dùng trong các mục ñích giớI thiệu sản phẩm và chúng ta có thể lập trình cho một nút Button nào ñó ñể thay ñổI ảnh của control này. Control này không có các sự kiện Click. Nếu muốn sử dụng ảnh có sự kiện click thì chúng ta dùng control ImageButton c) Thuộc tính + ImageUrl: thuộc tính này chỉ ñến file ảnh. Còn các thuộc tính khác của control này thì các bạn ñã biết. d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload Created by THÁI NGỌC DUY MSDN based-written.

172 4/12/2007

e) Một ví dụ Xem ðề mô

17. Panel a) Cú pháp b) Chứa năng Control này dùng ñể chứa các control khác và nó tự ñộng co giản kích thước. c) Thuộc tính + BackImageUrl: thuộc tính này chỉ ñường ñẫn ñến file ảnh. + HorizontalAlign: thuộc tính này cho bạn canh các control nằm bên trong control này. Các thuộc tính còn lạI các bạn ñã quen thuộc. Chúng ta cũng có thêm các control khác khi run time vào control này. Xem ñề mô d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload e) Một ví dụ

18. PlaceHolder a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

19. Canlender a) Cú pháp b) Chứa năng Control này nó cho chúng ta chọn một ngày tháng năm. c) Thuộc tính + DayHeaderStyle: thuộc tính này cho chúng ta ñịnh dạng kiểu header của ngày (xem ñề mô vùng màu tím ). gồm có các thuộc tính con như màu nền, màu biên, font chữ… + DayStyle: cho chúng ta ñịnh dạng kiểu ngày :gồm có các thuộc tính con ñể ñịnh dạng giống như trên mà các bạn ñã biết. + NextPrevStyle: giống như trên nó thể hiện ở hai mũi tên trên control. Created by THÁI NGỌC DUY MSDN based-written.

173 4/12/2007

+ NextMonthText: chứa ñường dẫn ñến một ảnh, hình mũi tên bên phải. + PrevMonthText: chứa ñường dẫn ñến một ảnh, hình mũi tên bên trái. + SelectMonthText: chứa ñường dẫn ñến một ảnh, hình mũi tên bên chọn tháng. + SelectWeekText: chứa ñường dẫn ñến một ảnh, hình mũi tên bên chọn tuần. + todayDayStyle: chọn kiểu ngày hiện tạI gồm có các thuộc tính con bạn ñã biết. + WeekendDayStyle: thuộc tính này nó cho chúng ta ñịnh dạng lại ngày cuối tuần (thứ 7 và chủ nhật) trong các thuộc tính con của nó. Như màu sắc, font chữ, biên….Các bạn ñã biết và quen thuộc với các thuộc tính con này. d) Các sự kiện ♦ DataBinding ♦ DayRender ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ SelectionChanged ♦ Unload ♦ VisibleMonthChanged

e) Một ví dụ chọn ngày tháng năm ñưa vào TextBox1 this.TextBox1.Text=this.Calendar1.SelectedDate.ToS hortDateString(); Có rất nhiều kiểu ñịnh dạng ngày ví dụ như ngày tháng giờ phút giây…

xem ñề mô

20. AdRotator a) Cú pháp Khai báo giống như các control khác. b) Chứa năng Nó dùng ñể quản cáo các sản phẩm. Nó chứa rất nhiều hình ảnh ñể quản cáo, mỗi khi người dùng ñăng nhập vào trang này thì nó sẽ chọn ngẫu nhiên một hình ñể quảng cáo. c) Các thuộc tính + AdvertisementFile: ðường dẫn tương ñốI ñến file .xml. chứa cấu trúc các hình ảnh quản cáo và các liên kết khi chúng ta Click vào hình quản cáo ñó Created by THÁI NGỌC DUY MSDN based-written.

174 4/12/2007

+ Còn các thuộc tính khác thì các bạn ñã biết. d) Các sự kiện ♦ AdCreated ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control ♦ PreRender ♦ Unload e) Một ví dụ Một Ví dụ ñịnh nghĩa file XML

MỗI lần mà trang ñược load vào trình duỵêt (Brower) một quảng cáo ñược chọn ngẫu nhiên từ một danh sách ñã ñược ñịnh nghĩa trước. Một lập lịch luân phiên cho những quảng cáo ñược ñịnh nghĩa trong file XML . Trong file xml này chứa năm thuộc tính của một hình quản cáo : :chứa hình ảnh quản cáo : chứa link ñến một trang nào ñó. Alt Text Computers 80

Sau ñây là một ví dụ: /UICSharp/images/banner1.gif http://www.microsoft.com Alt Text Computers 80 /UICSharp/images/banner2.gif http://www.microsoft.com Alt Text Computers 80 /UICSharp/images/banner3.gif

Created by THÁI NGỌC DUY MSDN based-written.

175 4/12/2007

http://www.microsoft.com Alt Text Computers 80


Trong file XML này chúng ta phảI chú ý nút góc phảI là và các mục quảng cáo phảI là giống như ví dụ trên

xem ñề mô

21. Table a) Cú pháp b) Chứa năng Control này nó cho chúng ta tạo một bảng. Nếu chúng ta muốn tạo một bảng ñộng thì các ñốI tượng TableRow, TableCell ñể tạo các bảng ñộng. c) Thuộc tính Các bạn ñã biết d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ Unload e) Một ví dụ Sau ñây là một ví dụ tạo bảng ñộng : //chọn số cột ñộng từ DropDownList1 int numrows = int.Parse(this.DropDownList1.SelectedItem.Value);

//chọn số dòng ñộng từ DropDownList2 int numcells = int.Parse(this.DropDownList2.SelectedItem.Value);

for(int j=0;j
TableCell c = new TableCell(); //tạo một LiteralControl chứa dữ liệu cho một ô

c.Controls.Add(new LiteralControl("row" +j.ToString()+ ",cell" + i.ToString()));

//add số cột cho một dòng r.Cells.Add(c); } Created by THÁI NGỌC DUY MSDN based-written.

176 4/12/2007

//add số dòng cho một bảng this.Table1.Rows.Add(r); } }

22. RequiredFieldValidator a) Cú pháp Cú pháp khai báo như các control khác. b) Chứa năng chức năng của control này là nó yêu cầu nhập liệu cho một control khác. Nếu chúng ta không nhập thì nó thông báo. c) Thuộc tính + ControlToValidate: Thuộc tính này nó nhận một ID của một control khác ở trên form. ðể nó xát ñịnh control có ID này có ñược nhập liệu hay không nếu không thì nó thông báo. + Display: thuộc tính này nhận một trong ba giá trị : none, static, dynamic. ðể nó thể hiện thông báo ñộng hay tỉnh. + EnableClientScript: nhận true thì hiểu các script ở phía client, false thì không. (cả hai thuộc tính trên khi thử thì không thấy nó thể hiện như mong muôn.) + ErrorMessage: Nhận dòng thông báo khi dữ liệu không hợp lệ. + Initialvalue: giá trị khởi tạo Còn các thuộc tính khác các bạn ñã biết. d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ Unload e) Một ví dụ

Created by THÁI NGỌC DUY MSDN based-written.

177 4/12/2007

23. CompareValidator a) Cú pháp b) Chứa năng Control này nó có chức năng so sánh dữ liệu từ hai control khác ví dụ: so sánh ngày khởI hành vớI ngày ñến xem thử ngày ñến có trước ngày khởI hành hay không? c) Thuộc tính + ControlToCompare: thuộc tính này nó chứa ID của một control. ðể nó biết ñựơc giá trị của control có ID này và so sánh với dữ liệu của một control khác trong thuộc tính sau: + ControlToValidate: thuộc tính này nó chứa ID của một control mà dữ liệu của control trong thuộc tính này sẽ ñược so sánh vớI dữ liệu của control ở thuộc tính trên. + Operator: Toán tử ñể so sánh có sẳn ñể chon (hoặc kiểu ngày) + Type : Kiểu dữ liệu ñể so sánh gồm (String, Integer, Date, Double, Currency) + ValueToCompare: Nếu là hằng số thì chúng ta thường ñể trong thuộc tính này. Còn các thuộc tính khác thì bạn ñã biết. d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ Unload e) Một ví dụ

24. RangeValidator a) Cú pháp b) Chứa năng Control này nó kiểm tra giá trị nhập vào của một control khác trên form trong một phạm vi mà chúng ta qui ñịnh trong các thuộc tính ở phần dưới. c) Thuộc tính + ControlToValidate: Nhận ID của một control trên form + MaximunValue:Nhận giá trị chận trên (lớn nhất) tùy thuộc vào chúng ta chọn kiểu ở thuộc tính Type + MinimunValue: Nhận giá trị chận dưới (nhỏ nhất) tùy thuộc vào chúng ta chọn kiểu ở thuộc tính Type. + Type : Kiểu dữ liệu ñể so sánh gồm (String, Integer, Date, Double, Currency). Còn các thuộc tính khác các bạn ñã biết. Created by THÁI NGỌC DUY MSDN based-written.

178 4/12/2007

d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ Unload e) Một ví dụ

25. RegularExpressionValidator a) Cú pháp b) Chứa năng Biểu thức hợp lệ Control loại này nó cho phép chúng ta kiểm tra ñể mà ñoán trước những ký tự tuần tự như : số phúc lợi xã hội (tiền của nhà nước trả cho người thất nghiệp), hay ñịa chỉ e_mail, số ñiện thoại, mã bưu thiếp ….v.v. Nghĩa là những mô hình này ñược ñịnh nghĩa trước theo một luật nào ñó. Control này có thuộc tính nỗi bậc là : ValidationExpression : chọn biểu thức cho control này. c) Thuộc tính + ControlToValidate: chọn một control ñể kiểm tra việc nhận liệu cho control này có như ñã qui ñịnh trong biểu thức hợp lệ trong thuộc tính sau: + ValidationExpression: Thuộc tính này nó cho chúng ta chọn một biểu thức hợp lệ. VD: \d{6} là yêu cầu chúng ta phải nhập ñủ 6 ký tự số. Các thuộc tính còn lạI các bạn ñã biết. d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ Unload e) Một ví dụ

26. CustomValidator a) Cú pháp b) Chứa năng

Created by THÁI NGỌC DUY MSDN based-written.

179 4/12/2007

Control này nó cho chúng ta lập trình ñể kiểm tra tính hợp lệ dữ liệu của một control theo một yêu cầu hay một ràng buộc nào ñó, hay một kiểu dữ liệu ñược người sử dụng ñịnh nghĩa trước ñó. ðối với control này nó cung cấp cho chúng ta một sự kiện ñược lập trình trên server ñó là : ServerValidate Và chúng ta double_Click vào mở cửa sổ code ñể lập trình cho nó. c) Thuộc tính + ClientValidationFunction: thuộc tính này nó chứa một tên hàm, mà hàm này ñược lập trình ở client (bằng javascript). + ControlToValidate: Nhận ID của một control trên form ñể kiểm tra dữ liệu. + Các thuộc tính còn lạI các bạn ñã biết. d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ ServerValidate: sự kiện này ñược lập trình trên server ñể kiểm tra tính hợp lệ của dữ liệu. ♦ Unload e) Một ví dụ <script language="javascript">

function ValidateLength(oSrc,args){ if(args.Value.Length > 8) args.IsValid = true; }

27. ValidationSummary a) Cú pháp b) Chứa năng Chức năng của control này là thực hiện một thông báo ñộng bằng massegebox hay tĩnh là do chúng ta quy ñịnh trong các thuộc tính của nó. khi chúng ta ñặc thuộc tính DisplayMode của control này là BulletList. Những thông báo này là nó hiển thị cùng một lúc theo thứ tự. Và thông báo là chỉ ñến các trường dữ liệu chưa hợp lệ. Nội dung của thông báo ñược lấy từ các control kiểm tra tính hợp lệ. c) Thuộc tính

Created by THÁI NGỌC DUY MSDN based-written.

180 4/12/2007

+ DisplayMode: thuộc tính này cung cấp 3 ñịnh dạng hiển thị Messagebox cho chúng ta tùy chọn.:- List ,BulletList, SingleParagraph (thường thì chúng ta nên chọn BulletList). + HeaderText: Dòng tiêu ñề cho thông báo của các control. + ShowMessageBox : nhận giá trị True thì hiện thông báo ñộng, nhận là False thì hiện thông báo tĩnh. + ShowSummary: Nhận giá trị True là hiện thị control này khi chạy ứng dụng , False thì không (thường dùng nhất.) Các thuộc tính còn lạI các bạn ñã biết. d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ Unload

e) Một ví dụ 28. Xml a) Cú pháp b) Chứa năng Control này dùng ñể hiện thị file .xml cho ngườI dùng xem, nhưng chúng ta không nên dùng chức năng này vì nó chiếm không gian form của chúng ta. Do ñó ñể làm việc này chúng ta dùng một hyperlink ñể ñến một trang riêng chứa toàn bộ nộI dung file xml ñó. Còn khi trong chương trình chúng ta có sử dụng nộI dung file xml thì chúng ta khai báo một ñốI tượng xml. c) Thuộc tính + DocumentSource: ñường dẫn ñến file xml. + TransformSource : ñường dẫn ñến file xsl. Chú ý: - Trong tài liệu xml chỉ số các nút con của nút cha ñược ñánh số bắt ñầu từ 0. - Nếu chúng ta chỉ ra một chỉ số cho một node nào ñó mà chỉ số ñó nằm ngoài phạm vi số lượng node con của một node thì chương trình sẽ báo lỗi. - Lấy thuộc tính của node góc doc.DocumentElement.GetAttribute("tên thuộc tính").ToString(); - Lấy thuộc tính của một node bất kỳ thì ta chỉ cần ñến node góc rồI lần ñến các node con của nó. VD:doc.DocumentElement["dictionary"]["savePWs"] …getAttribute(“tên thuộc tính”); Created by THÁI NGỌC DUY MSDN based-written.

181 4/12/2007

-

Hoặc dùng ñốI tượng XmlAttributeCollection Nếu chúng ta lấy tên thuộc tính ta chỉ cần chấm thuộc tính Name(.Name) Còn muốn lấy giá trị của thuộc tính thì chúng ta chấm (.FirstChild.Value)

d) Các sự kiện ♦ DataBinding ♦ Disposed ♦ Int ♦ Load: Lập trình sự kiện này là ñể ñặt giá trị ban ñầu cho control. ♦ PreRender ♦ Unload e) Một ví dụ //Khai báo một ñốI tượng xml System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); //Load file xml vào ñốI tượng doc doc.Load(Server.MapPath("frmLogin.xml")); Và dùng các ñối tượng XmlNode ñể chứa từng node Hay các ñối tượng XmlElement

29. Literal a) Cú pháp b) Chứa năng 19.1.1.1 Giống Label

c) Thuộc tính d) Các sự kiện e) Một ví dụ

30. CrystalReportViewer a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

Một ñiều chú ý : ðối với một control server chúng ta có thể viết các sự kiện trên server và trên Client bằng javaScript. Nếu cùng một sự kiện mà ñược viết trên hai nơi (Client,server) thì khi thực hiện sự kiện ñược viết trên client chạy trước sự kiện trên server. Một ví dụ viết sự kiện trên Client Cú pháp tổng quát: Created by THÁI NGỌC DUY MSDN based-written.

182 4/12/2007

document.ID (tag form).ID( phần tử nào ñó trên form).Tên sự kiện=function() { //các xử lý của bạn ở ñây. } Ví dụ 1: sự kiện onClick

document.ClientServer.Button1.onclick=function() { alert("Bạn ñã click Button" + ClientServer.Button1.value); } Ví dụ 2: sự kiện onchange ClientServer.TextBox1.onchange=function() { if (ClientServer.TextBox1.value=="") { alert("Nhập vào một ngày .!"); if (ClientServer.TextBox1.select) ClientServer.TextBox1.select(); this.txtEmail.focus(); return false; } }

31. v.v.v III.

Còn những ñiều mình chưa biết và sự thiếu sót cho phần này xin các bạn ñóng góp và ghi lại ở dưới ñây.

19.2

Cách Sử dụng HTML Server Control

Những control loạI này thì chúng nằm trên tab HTML của ToolBox trong C#. HTML server controls nó giống như một tag html bình thường nhưng khi chúng ta làm việc vớI nó trên Web Form page thì chúng ta có thể chuyển nó thành một control server mà chúng ta có thể viết code cho nó trên server trong C#. Nếu không thì chúng ta chỉ làm việc vớI nó ở dướI client bằng ngôn ngữ javascript hay Vbscript

20 1.

Thêm một HTML server control vào Web Form có hai cách

Dùng môi trường Design Veiw của C# và chúng ñến Tab HTML click một control và vẽ nó lên web form page (form). Sau khi chúng ta vẽ nó lên form thì nó chỉ là một tag html bình thường

Created by THÁI NGỌC DUY MSDN based-written.

183 4/12/2007

2.

nhưng chúng ta muốn viết code cho nó ở trên Server thì chúng ta phảI click chuột phảI vào nó và chọn Run as Server Sử dụng theo cú pháp ASP.NET giống html, còn nếu muốn nó trở thành server thì thêm thuộc tính runat=”server” và tag của nó. ðối với cách này từ môi trường Designer chúng ta xem trong phần View HTML ở góc dướI bên trái cửa sổ Designer

Ví dụ : More Khi nào chúng ta muốn lập trình thì chúng ta chuyển nó thành một HTML server và viết code cho nó ở trang server trong môi trường C# hay tạI trang HTML. Nếu tạI trang HTML thì chúng ta dùng cú pháp sau: <script language = C# runat = server> //Viết code của bạn ở ñây.

3.

<script> còn không muốn chuyển nó thành server thì nó chỉ là một phần tử HTML. Bởi vì khi tag html mà nó trở thành một control server thì nó chiếm tài nguyên cho việc thực hiện code trên server. Có bao nhiêu control HTML server ? Có tổng cộng là 18 control HTML mặt ñịnh trên Tab HTML của ToolBox ñó là :

Label, Button, Reset Button, Submit Button, text Field, text Area, File Field, passs world Field, check box, Radio button, hidden, table, flow layout panel, Grid layout panel, image, listBox, dropDown, horozontal Rule. 21Sau ñây là chúng ta ñi khảo sát chi tiết những thuộc tính và các sự kiện cho các control này.

Trong phần này chúng ta chỉ trình bày vắn tắt các bạn tự tìm hiểu bởi vì chúng là các tag HTML 1. Label

a) Cú pháp b) Chứa năng c) Thuộc tính d) Các sự kiện Created by THÁI NGỌC DUY MSDN based-written.

184 4/12/2007

Các sự kiện ñược lập trình ở client (javaScript) + onMouseOut="tên hàm" + onMouseOver="tên hàm" + onMouseDown="tên hàm" + onMouseUp="tên hàm" + onMouseMove="tên hàm" e) Một ví dụ 2. Button

a) Cú pháp b) Chứa năng c) Thuộc tính d) Các sự kiện + onMouseOut="tên hàm" + onMouseOver="tên hàm" + onMouseDown="tên hàm" + onMouseUp="tên hàm" + onMouseMove="tên hàm" e) Một ví dụ 3. Reset Button

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

4. Submit Button

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

5. TextField

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

6. TextArea Created by THÁI NGỌC DUY MSDN based-written.

185 4/12/2007

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

7. File Field

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

8. PassWordField

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

9. CheckBox

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

10. RadioButton

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

11. Hidden

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

12. Table

a) b) c) d)

Cú pháp Chứa năng Thuộc tính Các sự kiện

Created by THÁI NGỌC DUY MSDN based-written.

186 4/12/2007

e) Một ví dụ 13. Flow layout Panel

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

14. Grid layout panel

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

15. Image

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

16. ListBox

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

17. DropDown

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

18. horozontal Rule

a) b) c) d) e)

Cú pháp Chứa năng Thuộc tính Các sự kiện Một ví dụ

Created by THÁI NGỌC DUY MSDN based-written.

187 4/12/2007

22Còn những ñiều mình chưa biết và sự thiếu sót cho phần này xin các bạn ñóng góp và ghi lại ở dưới ñây.

22.1 So sánh giữa hai loạI Web server control và HTML server

control

23Web server control

Theo mô hình ñốI tượng lập trình dễ dàng + Khi nào chúng ta sử dụng nó. Tất nhiên là khi bạn lập trình theo mô hình ñối tượng như trong ngôn ngữ C# và ñặt biệt là bạn làm việc trên Web form page thì thường dùng nhất. + Khi chúng ta viết một trang Web form mà chúng ta có thể sử dụng cả hai HTML3.2 và HTML4.0 Hoặc bạn cần một chức năng ñặc biệt như một lịch ñể chọn ngày tháng năm thì trong Tab Web form nó cung cấp cho chúng ta một web server control là: Calendar ñể cho chúng ta chọn ngày tháng chính xát tránh ñược lỗi do gõ ngày tháng không hợp lệ. + Và bạn muốn tạo những control mà muốn nó bắt những sự kiện do bạn lập trình bằng ngôn ngữ C# trên server và thao tác xuống Database (những control có những sự kiện khác nhau) thì chúng ta thường dùng các Web server control.

24HTML server control

Khi chúng ta sử dụng những control này thì chúng ta có thể lập trình script (bằng ngôn ngữ javascript) cho phía client (brower) và tất cả những giá trị của nó ñều là chuổi nên dẫn ñến là mất an toàn và nó không hiểu ñược Brower tương thích.

24.1 Các chứa năng chuyển dữ liệu giữ control và server hoặc

giữa control với control (giữ hai control)

Trong Web server control, nếu muốn giởi giá trị của một control lên server ngay lập tức thì chúng ta ñặc giá trị của thuộc tính AutoPostBack=”true”, của control ñó, thì ngay sau khi người dùng thay ñổi giá trị của control và nó sẽ ñược giởi lên server tức thì.

Created by THÁI NGỌC DUY MSDN based-written.

188 4/12/2007

Nhưng chúng ta cũng có thể trả lời hành ñộng của người dùng bằng các sự kiện ñược viết ở client script (bằng ngôn ngữ javascript) . Chú ý :trong khi ñặc thuộc tính AutoPostBack=”true” thì các control trên trang ñó ñều phải load lại sau khi gởi dữ liệu của control có thuộc tính AutoPostBack=”true”, có nghĩa là refresh trang. Trong trường hợp này thì các control như DropList, ListBox… ñều bị lặp lại dữ liệu nên chúng ta phải lập trình chận lại. Các cơ chế truyền dữ liệu ñược nhập thông qua các controls về server Có 2 cơ chế: 1. ðặt thuộc tính AutoPosBack của control có dữ liệu bằng “true” 2. Và cách thông thường là dùng tag form. Cách này thì giởi ñến server một lần nhiều control mang theo dữ liệu thực hiện bằng bằng cách nhấn một nút lệnh I. ðối với một control chúng ta thường có các chức năng sau cho một

control. a) b) c) d) e) f)

Khởi tạo dữ liệu ban ñầu cho control ñó. Lấy dữ liệu từ control ñó. Chuyển (truyền) dữ liệu từ một control này ñến một control khác. Chuyển dữ liệu của control về server. Các sự kiện có thể có cho một control ñó. Cơ chế hoạt ñộng cho từng sự kiện.

II. Sau ñây là một ví dụ cho một vài control thể hiện 6 tính năng ở trên.

Chúng ta tạo một DropDownList hay một ListBox vào Form Page 1) Khởi tạo dữ liệu ban ñầu cho control nào ñó. Chúng ta chọn control DropDownList và mở cửa sổ properties của control ñó (hoặc nhấn F4). Tiếp theo là chọn thuộc tính Items (collection) và click vào (…) ñể ñặc các thuộc tính Text và thuộc tính Value cho một Item trong DropDownlist hay trong ListBox +Nếu không muốn khởI tạo dữ liệu trong lúc Design thì chúng ta có thể lập trình cho control ñó trong lúc run time và dữ liệu trong các control này cũng có thể ñược lấy dướI database lên khi run time. Trường hợp này thì chúng lập trình cho sự kiện Load(). ðốI vớI sự kiện load() này mọI control ñều có. 2) Lấy dữ liệu từ control ðối vớI TextBox hay Label thì chúng ta lấy dữ liệu của nó thông qua thuộc tính Text Còn ñốI vớI DropDownList hay ListBox thì dữ liệu của nó có hai loại Created by THÁI NGỌC DUY MSDN based-written.

189 4/12/2007

- thứ nhất là Text - thứ hai là Value chúng ta muốn lấy dữ liệu Text của control DropDownList ñưa vào TextBox1 thì thực hiện lệnh: this.TextBox1.Text=this.DropDownList1.SelectedItem.ToString();

Hoặc chúng ta lấy dữ liệu Value của một Item nào ñó trong số danh sách các Item theo câu lệnh sau: this.TextBox2.Text=this.DropDownList1.SelectedItem.Value.ToS tring();

3) Truyền dữ liệu từ control này ñến control khác Chúng ta có thể truyền dữ liệu từ control này sang control khác theo nhiều cách khác nhau. VD: Khi chúng ta truyền dữ liệu giữa hai textbox như :Textbox A thay ñổI dữ liệu và text A mất focus thì lập tức text B cũng thay ñổI dữ liệu theo tùy thuộc vào chúng ta lập trình cho sự kiện change của TextBox A trong form TextBox A phảI ñặc thuộc tính AutoPostBack = ‘true’. Lúc này thì chúng ta phải lưu ý là dữ liệu ñược lập lại trong form (refresh trang). ðó là chúng ta truyền dữ liệu giữa hai TextBox hay giữa những control khác tùy vào công việc và chức năng cụ thể trong một trang. Hoặc chúng ta có thể truyền bằng một nút lệnh button. Còn chúng ta muốn truyền dữ liệu từ một control ở trang WebFormA.aspx sang một control khác ở trang WebFormB.aspx Trong trang WebFormA.aspx chúng ta khai báo một biến thuộc tính ñể nhận lạI một giá trị từ một control nào ñó, theo phương thức get. Có cú pháp như sau: Public string thuoctinh { get { return TextBox1.Text; } } Trong trang code WebFormB.aspx.cs chúng ta khai báo một biến có kiểu dữ liệu là trang WebFormA và chúng ta thực hiện việc gán giá trị của một control nào ñó trong WebFormB mang giá trị từ một control trong trang WebFormA như sau: public WebFormA sourcepage; private void Page_Load(object sender, System.EventArgs { if (!IsPostBack){ WebFormA sourcepage = (WebFormA) Context.Handler; Label1.Text = sourcepage.thuoctinh; } Created by THÁI NGỌC DUY MSDN based-written.

190 4/12/2007

}

từ trang này chuyển sang trang khác thực hiện lệnh. this.Server.Transfer("compare.aspx");

4) Các sự kiện có thể có cho một control Muốn biết một control có bao nhiêu sự kiện thì chúng ta chọn control ñó và click chọn cửa sổ thuộc tính Properties Xem chi tiết ở hình dưới ñây:

Control ñược chọn

Ckick vào ñây ñể biết các sự kiện của một control

Ngoài những control mà có sẵn trên thanh công cụ chúgn ta có thể ñịnh nghĩa những control khác gọI là user control. File mà chúng ta ñịnh nghĩa phảI có phần mở rộng .ascx Và trong file mà chúng ta ñịnh nghĩa các control ñược sử dụng các tag HTML và các control ñược cung cấp sẳn trên Toolbox và ngoại trừ các tag HTML sau : , ,
ðể tạo mớI một User Control chúng ta làm như sau : 5) Tạo mớI một Project nếu chưa có. 6) Trên menu Project chúng ta click Add Web User Control sau ñó chúng ta thay ñổI tên của (name)nó và Created by THÁI NGỌC DUY MSDN based-written.

191 4/12/2007

Click Open ñể mở một design cho control mà mình muốn tạo 7) Thêm text và những ñiều khiển giao diện, control mà chúng ta muốn truy cập ñể lập trình cho nó phảI là Web Form server control hay HTML server control 8) Sử dụng Web Form Designer ñể ñặt những thuộc tính và tạo code cho control của bạn Khi nào thì chúng ta cần sử dụng Web user control ? Khi chúng ta làm giao diện cho một trang web mà giao diện ñó muốn sử dụng lạI nhiều lần trong tương lai hay muốn nó ñược tái sử dụng cho những ứng dụng ở lần khác thì chúng ta thiết kế giao diện ñó bằng Web user control và lập trình cho nó. Khi chúng ta sử dụng nó chỉ cần rê và thả nó vào trong Web form page Web Custom control Web Custom control là biên dịch những component ñược chạy trên server nó ñóng gói giao diện người dùng. Nó bao gồm tất cả các ñặc trưng lúc thiết kế của ASP.NET. Có rất nhiều cách mà chúng ta có Web custom control 1) Chúng ta có thể biên dịch thành một control từ hai hay nhiều control khác ñược tổ hợp lại với nhau VD: chúng ta có thể biên dịch một Label và một TextBox thành một control 2) Nếu một control ñang tồn tại và nó phù hợp vớI một số yêu cầu của bạn nhưng nó cũng bị thiếu những yêu cầu ñặc trưng khác. Bạn có thể tùy chỉnh control ñó từ nó và bạn có thể viết (ñặt) chồng những thuộc tính, phương thức, sự kiện. 3) Nếu không có sẳn những control phù hợp vớI các yêu cầu của chúng ta thì chúng ta phảI tạo một control theo ý của mình và phù hợp vớI yêu cầu. ñược kế thừa từ những lớp control cơ bản Sự khác nhau chính giữa Web user control va Web custom control Có những yêu cầu về các chức năng ñặt biệt mà các control hiện có không thể nào ñáp ứng ñược. Nên chúng ta tạo một web user control hay web custom control ñể ñóng gói các chức năng mà ứng dụng của chúng ta cần. Sự khác nhau giữa hai loạI control (Web user control và Web custom control). 1. Web user control Tạo ñược một cách dễ dàng , những chúng ít tiện dụng troang một vài hoàn cảnh (kịch bản -scenario). Chúng ta phát triển một web user control rất giống vớI cách mà chúng ta phát triển một Web Form control pages . Bởi vì một user control ñược tạo trong một môi trường designer trực quan. Chúng có thể ñược viết code trong HTML theo một tuần tự và ñược thực hiện trong code C#. Bởi vì Web user control là ñược biên dịch ñộng ngay lúc chạy nên không thể add chúng vào vào thanh ToolBox như Web custom control và chúng ñược ẩn vào một nơi nào ñó trên form khi ñược Created by THÁI NGỌC DUY MSDN based-written.

192 4/12/2007

thêm vào trang . ðiều này tạo cho việc sử dụng Web user control vất vả hơn Web custom control Web user control giống Web form page về mặt design và lập trình cho nên chúng ta có thể chuyển một Web form page thành một Web user control ñể sử dụng nhiều lần sau này. Cách chuyển một Web form thành một Web user control - Chúng ta vào view HTML xóa tất cả các tất , , - Thay ñổI kiểu chỉ dẫn @ Page thành @ Control - Thay ñổi giá trị của thuộc tính Codebehind thành Webform1.ascx.cs - Thay ñổi lớp kế thừa public class WebForm2:System.Web.UI.Page thành WebForm2:System.Web.UI.UserControl

2. Web custom control

Web custom control là nó biên dịch code việc sử dụng nó thì dễ dàng và tạo nó thì khó hơn Web user control . Khi chúng ta tạo xong một Web custom control thì chúng ta có thể ñưa nó vào ToolBox ñược hiển thị trong môi trường thiết kế trực quan ñược hổ trợ ñầy ñủ các thuộc tính thông qua một cửa sổ thuộc tính. Chúng ta có thể install một bản copy của Web custom control vào trong global assembly cache và chia sẽ nó giữa các ứng dụng. Bảng so sánh hai loại control Web user control Web custom control Tạo một cách dể dàng Tạo vất vả hơn Giới hạn về việc hỗ trợ của người Công cụ hổ trợ thiết kế trực quan dùng lúc thiết kế cho người sử dụng PhảI có một bản copy của control Only a single copy of the control is required, in the global assembly là yêu cầu trong mỗI ứng dụng cache

Không thể thêm vào ToolBox Tốt cho việc trình bày tĩnh

Add vào ToolBox ñược Tốt cho việc trình bày ñộng

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&

Cơ chế hoạt ñộng của một UI cơ bản.

Các công cụ web forms trong ASP.NET ñược ñịnh nghĩa thành những tag. Sau khi chạy server gửi về là các tag HTML bình thường. Ví dụ: một text box. Created by THÁI NGỌC DUY MSDN based-written.

193 4/12/2007

Code ở server: Text default


Code ở client:


Sau khi gửi về client, id của cũng là id của vì thế ta có thể sử dụng script ñể thao tác với các này. Vậy, tại sao phải sử dụng các tag của ASP.NET: Từ web form ta có thể truy cập trực tiếp ñến các ñối tượng này. Từ ñó ta có thể thay ñổi các thuộc tính và xử lý sự kiện. Các thuộc tính và sự kiện, tất cả ñều ñược xử lý trên server. Ví dụ: - Xử lý sự kiện phía server. File: server.aspx
Text default


File: server.aspx.cs private void butServer_Click(object sender, System.EventArgs e) { if( this.txtText1.Text == "az") this.txtText1.Text="OK"; else this.txtText1.Text="Cancel"; }

- Xử lý sự kiện phía client. File: client.aspx
<script> document.client.butClient.onclick = function() { if( this.txtText1.Text == "Teo") this.txtText1.Text="OK"; else this.txtText1.Text="Cancel"; } Xem ví dụ: http://azweb05/WebUIDemo/server.aspx http://azweb05/WebUIDemo/client.aspx

Với những ví dụ trên chúng ta cần chú ý: Cả 2 ví dụ trên ñề thực hiện cùng một chức năng. Nhưng một xử lý ở sever, một xử lý ở client. - Khi sử dụng web Form tức xử lý ở sever. Thì khi ấn nút sever, dữ liệu trên text box ñược gửi về server, và server sẽ gửi về cho client (browse) nguyên trang web với nội dung của text box ñược thay ñổi. Cơ chế thực hiện này giống như submit dữ liệu ở các trang web thông thường. - Khi sử dụng các tag HTML và script. Thì dữ liệu ñược xử lý tất cả ở client. Khi ta tạo một text box ở web form () thì ta vẫn có thể xử lý dữ liệu ở client. Nhưng khi tao một text box bằng HTML() thì phí server không thể hiểu ñược text box này. Ví dụ: sử dụng textbox ở server và xử lý ở client:
Text default
<script> document.controlServer.butServer.onclick = function() { if(document.controlServer.txtText1.value == "az") document.controlServer.txtText1.value = "OK"; else document.controlServer.txtText1.value = "Cancel"; }

Created by THÁI NGỌC DUY MSDN based-written.

195 4/12/2007

Như ñã nói ở trên, một textbox phía server sau khi gửi về client là một nhãn và có type=”text”, ñặc biệt là id không ñổi. Vì thế ta có thể dùng <script> ñể thao tác với các ñối tượng này. Với ví dụ này, button là button server, vì thế khi gửi về client là một nút submit. Khi ta click vào nút này thì cũng có nghĩa là submit dữ liệu (trang web vẫn phải refresh). ðể tránh trường hợp này ta có thể sử dụng button phía client. Xem ví dụ: http://localhost/WebUIDemo/controlServer.aspx

&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&

WEB SERVICE

25

WEB SERVICES LÀ GÌ ?

Web Services(XML Web Services) là một ứng dụng có thể truy xuất tới nó thông qua lập trình với các giao thức Internet chuẩn. Web Service kết hợp những khía cạnh tốt nhất của quá trình phát triển dựa trên thành phần (component) và Web. Giống như các component, Web Services trình bày những chức năng tổng quát có thể tái sử dụng lại mà không cần quan tâm cách thức cài ñặt những dịch vụ này. Tuy nhiên Web Services không giống như những công nghệ component hiện nay, Web Service không ñược truy xuất thông qua những giao thức ñặc tả mô hình ñối tượng(object-model-specific protocols). Thay vào ñó nó ñược truy xuất thông qua những giao thức Web thông dụng và ñịnh dạng dữ liệu như HTTP, XML. Hơn nữa Web Services phải ñược ñịnh nghĩa theo những quy tắc về thông ñiệp mà chính nó ñịnh nghĩa và tạo ra. Chương trình người dùng truy xuất tới Web Service có thể ñược thực hiện trên bất cứ hệ ñiều hành nào và bằng bất cứ ngôn ngữ gì mà có thể tạo và sử dụng thông ñiệp ñược ñịnh nghĩa cho giao tiếp Web Services. Một trong những giao thức Web mà ñề cập ở trên ñó là Simple Object Access Protocol(SOAP), SOAP ñịnh nghĩa một giao thức ñơn giản(lightweight) cho trao ñổi dữ liệu. SOAP ñưa ra 1 tập các quy luật ñể sử dụng XML trình bày dữ liệu(set of rules for how to use XML to represent data). Ngoài ra SOAP còn ñịnh nghĩa một dạng ñịnh dạng thông ñiệp mở rộng(extensible message format) dùng ñể thực hiện gọi thủ tục từ xa(remote procedure calls) sử dụng SOAP message và bindings qua giao thức HTTP.

Created by THÁI NGỌC DUY MSDN based-written.

196 4/12/2007

26Kiến trúc tổng quát của Web Service:

Data

Data Access

Business Logic

Service Response

Listener

Service Request

Business Facade

Kiến trúc tổng quát của Web Service bao gồm 5 lớp sau:

Data: dùng ñể lưu trữ dữ liệu mà Web Service sẽ cung cấp cho các client qua các phương thức mà dịch vụ cung cấp. Trong một dịch vụ cung cấp các phương thức lấy dữ liệu từ database của Web Service thì database ñóng vai trò là tầng Data. Data Access: Cung cấp các chức năng truy cập tới cơ sở dữ liệu cho lớp Business Logic, ñảm bảo sự ñồng nhất dữ liệu. Business Facade: Cung cấp 1 giao diện ñơn giản dùng truy xuất các phương thức của Web Service( các phương thức xây dựng từ lớp Business Logic). Business Logic: cung cấp chức năng của Web Service cho lớp bên trên. Trong lớp này ta sẽ xây dựng các phương thức mà Web Service cung cấp cho client. Ngoài ra ta còn có thể gọi các hàm từ các ứng dụng Web Service khác vào trong các phương thức này. Listener: ðây là một lớp rất quan trọng trong Web Service, quản lý tất cả những yêu cầu tới Web Service. Listener có nhiệm vụ nhận các thông ñiệp gởi ñến cho Service, phân tích cú pháp, sau ñó ñáp ứng các thông ñiệp trên bằng phương thức thích hợp trên tầng business facade.

Tài liệu MSDN: mshelp://MS.VSCC/MS.MSDNVS/dnwebsrv/html/websvcs_platform.htm

27

Cách tạo một ứng dụng Web Service và gọi sử dụng nó trong VS.NET: III.5 Cách tạo 1 Web Service: Vào menu File -> New -> Project, chương trình hiển thị hộp thoại:

Created by THÁI NGỌC DUY MSDN based-written.

197 4/12/2007

Chọn ASP.NET Web Service, nhập tên của Web Service. VS.NET tự ñộng load và tạo 1 file service1.asmx. Sau cùng ta cài ñặt các phương thức cho Web Service vào trong trang .asmx. Trang .asmx giống như trang .aspx, chúng chỉ khác nhau ở phần mở rộng ñược ánh xạ trong tập tin cấu hình config.web như là file sẽ thực thi và ñáp ứng các yêu cầu về Web Service. Trong trang này ta sẽ cài ñặt các logic nghiệp vụ của ñối tượng hay phương thức Web Service mà ta cần cung cấp cho máy client. Phương thức web là một phương thức bình thường trong C# mà ta có thêm chỉ dẫn [WebMethod] trước nó. Phần này ta sẽ ñề cập ở phần sau, sau ñây là 1 ví dụ ñơn giản về Web Service:

Ví dụ: // ðịnh nghĩa phương thức cho Web Services

[WebMethod(Description ="Phương thức cộng hai số thực a và b")] public float Add(float a , float b) { return a+b; } Các phương thức này ñược cài ñặt bên trong 1 lớp mà kế thừa từ lớp WebService trong namespace System.Web.Services ðể test Web service này, ta nhấn F5 chương trình sẽ hiển thị kết quả cung cấp cho ta 1 giao diện ñơn giản ñể gọi hàm như sau:

Created by THÁI NGỌC DUY MSDN based-written.

198 4/12/2007

Từ màn hình giao diện này, ta cung cấp ñầy ñủ các tham số cho phương thức, click Invoke -> chương trình trả về kết quả dưới dạng XML.

III.6 Cách gọi sử dụng 1 Web Service từ client: Một Web Service có thể ñược gọi sử dụng từ một ứng dụng Web hay 1 ứng Window Form bất kỳ, sau ñây là cách gọi 1 Web Service từ 1 ứng dụng Web, còn cách gọi từ ứng dụng Window Form cũng tương tự như thế. Menu File -> New -> Project -> chọn ASP.NET Web Application. Tham chiếu ñến Web Service vừa tạo ở trên: Menu Project -> Add Web Reference... Chương trình hiển thị hộp thoại:

Created by THÁI NGỌC DUY MSDN based-written.

199 4/12/2007

Em cần giảI thích về giao diện này.

Nếu kết nối tới Web Service thành công chương trình sẽ hiển thị các phương thức mà web service ñó cung cấp và ta AddReference vào ứng dụng của ta. Add vào Project 1 WebForm ñể gọi phương thức cung cấp từ Web Service trên và xây dựng giao diện ñể gọi ứng dựng bao gồm 2 textbox, 1 label Result và 1 button. Ta viết code xử lý sự kiện button ñể gọi phương thức từ Web Service như sau :

Ví dụ: // Hàm xử lý sự kiện click button Add

private void Add_ServerClick(object sender, System.EventArgs e) { long a =0; long b =0; a=long.Parse(txtSo1.Text); b=long.Parse(txtSo2.Text); // Khởi tạo 1 Instance của MathService localhost.MathService m =new localhost.MathService (); // Gán kết quả cho label lblResult.Text=m.Add (a,b).ToString(); }

Created by THÁI NGỌC DUY MSDN based-written.

200 4/12/2007

28Attribute của Web Service: III.7 WebMethod: Áp dụng attribute này cho một phương thức làm cho phương thức này trở thành phương thức của Web Service. Attribute WebMethod này là một class không thể kế thừa (cannot be inherited) và nó có các thuộc tính sau: BufferResponse: Quy ñịnh thông tin ñáp ứng có ñược lưu trên bộ ñệm (buffer) của Web Service hay không. Mặc ñịnh là True, tức thông tin trả lời cho 1 yêu cầu nào ñó không ñược lưu giữ trên bộ ñệm. Nếu mà dữ liệu gởi về cho client lớn thì ta quy ñịnh BufferResponse=false CachDuration: Số giây mà sẽ thông tin ñáp ứng sẽ giữ trong catch của web server, mặc ñịnh là 0, tức thông tin ñáp ứng sẽ không giữ trong catch.

(Cần giảI thích ñể phân biệt BufferResponse và CachDuration, anh thấy có sự trùng lập) Description: Diễn giải cho phương thức. EnableSession: Cho phép ta lưu trạng thái trong Web Service nếu ta setting EnableSession=true, mặc ñịnh là false.

(Ghi dòng chú thích: xem thêm tài liệu của thanh ñể biết chi tiết về cách sử dụng Session) Ví dụ:

[ WebMethod(Description="Phương thức test session !", EnableSession=true) ] public String UpdateHitCounter() { //Kiểm tra có tồn tại Session không? if (Session["Dem"] == null) { Session["Dem"] = 1; } else { //Tăng biến ñếm session Dem Session["Dem"] = ((int) Session["Dem"]) + 1; } return "You have accessed this service " + Session["Dem"].ToString() + " times."; } MessageName: Tên mà sử dụng cho phương thức Web Service bên trong việc truyền và nhận dữ lliệu từ phương thức Web Service, chẳng hạn như tên sử dụng trong thông ñiệp SOAP, mặc ñịnh là tên phương thức Web (Cho một ví dụ về chổ này).

Created by THÁI NGỌC DUY MSDN based-written.

201 4/12/2007

TransactionOption: gồm 5 giá trị là Disabled, NotSupported, Supported, Required, RequiresNew cho phép sử dụng Transaction trong phương thức Web hay không, mặc ñịnh là Disabled. (PhảI gỉai thích từng giá trị)

III.8 WebService: Áp dụng attribute này dùng ñể cài ñặt cho một class Web Service các thông tin về Web Service, bao gồm các thuộc tính: Name: Tên của XML Web service, mặc ñịnh là tên của class cài ñặt Web Service. Description: Diễn giải cho Web Service. Namespace: XML namespace sẽ sử dụng trong tài liệu mô tả mà Web Service trả về cho clients khi gọi 1 phương thức nào ñó trong Web Service.

Ví dụ:

// Khai báo lớp Web Services kế thừa từ System.Web.Services.WebService [WebService(Description="Test Web service!", Namespace="http://MyWebService.com/")] public class MathService : System.Web.Services.WebService { // Khai báo các phương thức web service ở ñây. } III.9 WebServiceBinding: (Phần này khó hiểu qúa, em viết lạI cho dễ hiểu)

Áp dụng attribute WebServiceBinding dùng ñể tạo ra 1 binding cho Web Service. Một binding mà ñược ñịnh nghĩa bởi ngôn ngữ mô tả Web Service(WSDL), dùng ñể ñịnh nghĩa một tập các phép xử lý(operation). Mỗi phương thức Web Service là một phép xử lý trong 1 binding tổng quát. Các phương thức Web Service là con của binding mặc ñịnh cho Web Service, chúng ta cũng có thể tạo ra binding cụ thể cho các phương thức Web Service ở trên, bao gồm các thuộc tính: Name: Tên của binding. Mặc ñịnh là tên của Web Service cộng với tên của giao thức truy xuất bao gồm HttpGet, HttpPost, Soap. Location: Chỉ rõ vị trí nơi mà binding ñịnh nghĩa, tức ñường dẫn chỉ tới file mô tả .wsdl. Mặc ñịnh là url của web service cộng với “?WSDL”.( tức file mô tả dịch vụ Web). Namespace: Namespace cho binding. Mặc ñịnh là http://tempuri.org/

Một XML Web Service có thể cài ñặt nhiều kết nối (binding) khác nhau. Mỗi kết nối ñó tương ứng với 1 số hàm cụ thể nào ñó mà ta cài ñặt. Khi clients gọi sử dụng Web Service, tuỳ thuộc vào binding mà nó sẽ cung cấp các hàm tương ứng. Created by THÁI NGỌC DUY MSDN based-written.

202 4/12/2007

Ví dụ:

// Khai báo lớp Web Services kế thừa từ System.Web.Services.WebService [WebService(Description="Test Web service!", Namespace="http://MyWebService.com/")] [WebServiceBinding(Name="LocalBinding")] [WebServiceBinding(Name="MyBinding", Namespace="http://MyBinding/")] public class MathService : System.Web.Services.WebService { // Cài ñặt phương thức này cho binding LocalBinding [SoapDocumentMethod(Binding="LocalBinding")] [ WebMethod(Description="Phương thức cho0u98 ?inding LocalBinding!")] public String Binding() { return "Thành viên của binding ñịnh nghĩa bởi Web Service"; } // Cài ñặt phương thức này cho binding MyBinding [SoapRpcMethod(Binding="MyBinding")] [ WebMethod(Description="Phương thức cho@u98 ?inding MyBinding!")] public String Binding1() { return "Thành viên của binding ñịnh nghĩa bởi Web Service"; } } III.10 SoapDocumentMethod: Ngôn ngữ mô tả dịch vụ web(WSDL) ñịnh nghĩa 2 kiểu mà 1 phương thức web gọi 1 phép toán và ñịnh dạng trong Soap message là RPC and Document. Document ñịnh dạng các phương thức web service thông qua 1 XSD schema. còn RPC (Có phảI là Remote Procedure Call) ñịnh dạng các phép xử lý thông qua ñặc tả SOAP (SOAP specification) sử dụng cho RPC. Áp dụng attribute này cho 1 phương thức Web Service hay 1 lớp proxy cụ thể mà ñịnh dạng SOAP message là Document. Bao gồm các thuộc tính: Action: thuộc tính SOAPAction HTTP header của SOAP request. Mặc ñịnh là http://tempuri.org/MethodName trong ñó MethodName là tên của phương thức Web Service. Binding: binding của 1 phương thức dịch vụ web cài ñặt cho 1 phép xử lý.

Created by THÁI NGỌC DUY MSDN based-written.

203 4/12/2007

OneWay: Thuộc tính xác ñịnh 1 Web Service có ñợi Web Server xử lý hoàn thành 1 phương thức web hay không? Có 2 giá trị là true và false. Mặc ñịnh là false. ParameterStyle: Xác ñịnh những tham số kết nối bên trong một phần tử ñơn trong phần tử Body của SOAP message. Mặc ñịnh là Wrapped(có 3 parameter là Bare, Default và Wrapped). Trong ñó:

Bare: Tham số trong 1 phương thức web service ñược ñặt trong các phần tử XML trực tiếp theo sau element Body của Soap request hay Soap response. Ví dụ: Sau ñây là ví dụ cho 1 phương thức web có ParameterStyle của SoapDocumentMethod là Bare

[SoapDocumentMethod(Binding="LocalBinding", ParameterStyle=SoapParameterStyle.Bare)] [ WebMethod(Description="Phương thức binding LocalBinding!")] public String Binding(string Ho, string Ten) { return "Họ tên của bạn: " + Ho.ToString() + " " + Ten.ToString(); } Có Soap request như sau:

POST /TestWebServices/MathService.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://MyWebService.com/Binding" <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> string string Default: Tham số này sử dụng SoapParameterStyle mặc ñịnh cho Web Service. Giá trị mặc ñịnh ñược xét khi ta áp ñặt 1 attribute SoapDocumentService lên class mà cài ñặt Web Service. Nếu không cài ñặt mặc ñịnh là Wrapped.

Created by THÁI NGỌC DUY MSDN based-written.

204 4/12/2007

Ví dụ: Tương tự như ví dụ trên nhưng ta thay tham số ParameterStyle là Default, ta có Soap request như sau:

POST /TestWebServices/MathService.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://MyWebService.com/Binding" <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> string string Wrapped: Tham số trong 1 phương thức web service ñược kết(encapsulated) bên trong 1 phần tử XML ñơn theo sau element Body của Soap request hay Soap response. Ví dụ trên sử dụng ParameterStyle là Wrapped, các tham số nằm bên trong element . RequestElementName: thuộc tính XML Element liên hệ với SOAP Request cho 1 phương thức web mà ñược ñịnh nghĩa trong file mô tả .wsdl như là 1 xử lý(operation).Mặc ñịnh là tên của phương thức Web. RequestNamespace: thuộc tính namespace liên hệ với SOAP Request cho 1 phương thức web. Mặc ñịnh là namespace của web service này. ResponseElementName: thuộc tính XML Element liên hệ với SOAP Response cho 1 phương thức web mà ñược ñịnh nghĩa trong file mô tả .wsdl như là 1 xử lý(operation). Mặc ñịnh là tên của phương thức web cộng với Response. ResponseNamespace: thuộc tính namespace liên hệ với SOAP Request cho 1 phương thức web. Mặc ñịnh là namespace của web sevice này. Use: ñịnh dạng tham số cho 1 phương thức web bên trong SOAP message. Có 2 giá trị là Encoded và Literal. Mặc ñịnh là Literal. Encoded: WSDL ñịnh nghĩa 2 cách thức cho ñịnh dạng parameters. Encoded ñịnh dạng parameters sử dụng SOAP encoding .

Ví dụ: Sau ñây là 1 Soap response sử dụng ñịnh dạng tham số kiểu Encoded.

HTTP/1.1 200 OK Created by THÁI NGỌC DUY MSDN based-written.

205 4/12/2007

Content-Type: text/xml; charset=utf-8 Content-Length: length <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://LocalBinding/" xmlns:types="http://LocalBinding/encodedTypes" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/ "> string Literal: ñịnh dạng tham số sử dụng một sơ ñồ ñịnh nghĩa (a pre-defined XSD schema) cho mỗi tham số. III.11

SoapDocumentService: ðây là một attribute dùng ñể áp ñặt

cho 1 XML Web Service nhằm mục ñích ñịnh dạng mặc ñịnh cho Soap request và Soap response của các phương thức web. Bao gồm các thuộc tính:w ParameterStyle: Quy ñịnh cách 1 parameter ñược ñịnh dạng trong SOAP message. Có 3 giá trị là Bare, Default and Wrapped. Mặc ñịnh là Wrapped. RoutingStyle: Quy ñịnh cách mà SOAP message gởi ñến(routed to) 1 XML Web Service. Có 2 giá trị ñược xét là: RequestElement và SoapAction. Mặc ñịnh là SoapAction.

RequestElement: Soap message gởi dựa trên phần tử ñầu tiên theo sau . SoapAction: Soap message gởi dựa trên SOAPAction HTTP Header. Use: Xét giá trị mặc ñịnh cho ñịnh dạng tham số(parameter) cho 1 XML Web Service. Có 2 giá trị là Encoded và Literal. Mặc ñịnh là Literal.

III.12 SoapRpcMethod: Áp dụng attribute này cho 1 phương thức Web Service hay 1 lớp proxy cụ thể mà ñịnh dạng SOAP message là RPC. Bao gồm các thuộc tính: Created by THÁI NGỌC DUY MSDN based-written.

206 4/12/2007

Action: thuộc tính SOAPAction HTTP header của SOAP request. Mặc ñịnh là http://tempuri.org/MethodName trong ñó MethodName là tên của phương thức Web Service. Binding: binding của 1 phương thức dịch vụ web cài ñặt cho 1 phép xử lý. OneWay: Thuộc tính xác ñịnh 1 Web Service có ñợi Web Server xử lý hoàn thành 1 phương thức web hay không? Có 2 giá trị là true và false. Mặc ñịnh là false. RequestElementName: thuộc tính XML Element liên hệ với SOAP Request cho 1 phương thức web mà ñược ñịnh nghĩa trong file mô tả .wsdl như là 1 xử lý(operation).Mặc ñịnh là tên của phương thức Web. RequestNamespace: thuộc tính namespace liên hệ với SOAP Request cho 1 phương thức web. ResponseElementName: thuộc tính XML Element liên hệ với SOAP Response cho 1 phương thức web mà ñược ñịnh nghĩa trong file mô tả .wsdl như là 1 xử lý(operation). Mặc ñịnh là tên của phương thức web cộng với Response. ResponseNamespace: thuộc tính namespace liên hệ với SOAP Request cho 1 phương thức web.

III.13

SoapRpcService: Cho phép chúng ta thiết lập những giá trị

mặc ñịnh kiểu encoding cho các phương thức web của XML Web Service. Chú ý rằng một XML Web Service không thể cài ñặt cả 2 attribute SoapDocumentService và SoapRpcService. Bao gồm các thuộc tính: RoutingStyle: Quy ñịnh cách mà SOAP message gởi ñến(routed to) 1 XML Web Service. Có 2 giá trị ñược xét là: RequestElement và SoapAction. Mặc ñịnh là SoapAction.

RequestElement: Soap message gởi dựa trên phần tử ñầu tiên theo sau . SoapAction: Soap message gởi dựa trên SOAPAction HTTP Header. III.14

SoapHeader: Áp dụng attribute này cho 1 phương thức Web

Service hay 1 lớp proxy mà nó có thể xử lý 1 SoapHeader cụ thể. Sau ñây là những bước nhận và xử lý 1 Soap Header: 1. Tạo 1 class kế thừa từ class SoapHeader mô tả dữ liệu mà ta ñưa vào Soap Header ñể xử lý. 2. Thêm vào 1 member của class vừa cài ñặt vào class mà ta cài ñặt Web Service hay vào class proxy tham chiếu . 3. Áp attribute SoapHeader vào phương thức Web Service hay phương thức tương ứng trong proxy class mà ta cần xử lý Soap Header. Created by THÁI NGỌC DUY MSDN based-written.

207 4/12/2007

4. Bên trong phương thức Web Service hay class proxy ta sẽ xử lý việc gửi dữ liệu kèm theo Soap Header. Ví dụ:

//Khai báo 1 class kế thừa SoapHeader public class MyHeader:SoapHeader { public string MyValue; } //class cài ñặt phương thức web public class Service1 : System.Web.Services.WebService { //Khai báo 1 member của Soap Header ñể nhận nội dung của MySoapHeader public MyHeader sHeader; ..... [WebMethod(Description ="A Web Service requires a client send a SoapHeader")] [SoapHeader("sHeader", Direction=SoapHeaderDirection.InOut, Required=true)] public string Hello() { if (sHeader.MyValue=="MyHeader") { return "My Soap Header:" + sHeader.MyValue.ToString() ; } return "Soap Header not allow!"; } } Các thuộc tính của attribute SoapHeader: Direction: Xác ñịnh nơi mà Soap Header ñược gởi ñến: Web service, Web service client hay cả hai, tức là hướng gởi Soap Header ñến. Có 3 giá trị là In,Out và InOut. Mặc ñịnh là In tức là chỉ gởi ñến cho Web Service. MemberName: member của 1 lớp Web Service mà mô tả nội dung của Soap Header. Thực chất là 1 khai báo của Soap Header trong class web service. Required: Xác ñịnh 1 Soap Header có bắt buộc yêu cầu có hay không, thuộc tính này có 2 giá trị là true hay false. Mặc ñịnh là true, tức là Soap Header bắt buộc phải kèm theo Soap message. Ngoài ra thuộc tính này còn dùng ñể ñiều khiển những Soap Header không xác ñịnh(unknown Soap Header).

III.15 SoapExtension: Soap Extension cho phép chúng ta có thể tăng thêm khả năng của Web Service bằng cách hiệu chỉnh các Soap message ñi và ñến từ Web Service và từ client gọi Web Service. ðể Created by THÁI NGỌC DUY MSDN based-written.

208 4/12/2007

hiểu 1 soap extension làm việc như thế nào, chúng hãy tìm hiểu vòng ñời của 1 XML Web Service qua sơ ñồ sau:

Chuỗi những sự kiện xuất hiện khi một phương thức Web ñược gọi như sau: + ðầu tiên, client tạo 1 instance của class proxy tham chiếu web service. + Client gọi (invoke) thực thi 1 phương thức từ class proxy. + Infrastructure trên máy client sẽ phân tích các tham số của phương thức dịch vụ Web vào 1 soap message và gởi chúng ñến XML Web Service. + Infrastructure nhận ñược Soap message và deserializes XML. Sau ñó nó tạo 1 instance của class mà cài ñặt các phương thức Web và gọi phương thức ñó, ñưa vào bộ deserializes XML như là các ñối số(arguments). + Phương thức web ñược thực thi và return giá trị trả về, tham số out put. + Infrastructure trên máy server phân tích giá trị trả về và các tham số output vào 1 thông ñiệp Soap message và gởi trở về client. + Infrastructure trên máy client nhập Soap message, deserializes XML ñưa vào các tham số output, giá trị trả về. + client nhận ñược giá trị trả về và tham số out. Qua sơ ñồ và diễn giải trên ta thấy, thành phần serializes and deserializes XML trong ASP.NET thực hiện cả ở XML Web Service và XML Web Service client. Một Soap extension có thể ñược xen vào Infrastructure ñể kiểm tra và hiệu chỉnh soap message trước và sau thời gian bộ serializes và deserializes thực hiện. ðể

Created by THÁI NGỌC DUY MSDN based-written.

209 4/12/2007

thực hiện chức năng này, ta ñi xây dựng 1 Soap extension. Các bước cơ bản ñể tạo 1 soap extension: + Tạo 1 class kế thừa từ lớp SoapExtension. + Lưu 1 tham chiếu tới stream mà mô tả Soap message sẽ tạo. + Khởi tạo những thông số cho Soap extension. + Xử lý các Soap message dựa vào các SoapMessageStage . + Cấu hình Soap extension ñể chay với Web Service. Sau ñây là chi tiết các bước tạo và xử lý 1 Soap extension: III.15.1. Tạo 1 class kế thừa từ lớp SoapExtension: Class kế thừa từ SoapExtension là class mà thực hiện những chức năng của Soap Extension. III.15.2.

Lưu 1 tham chiếu tới stream mà mô tả Soap

message sẽ tạo: ðể hiệu chỉnh 1 Soap message, chúng ta phải ghi ñè(override) lên phương thức ChainStream, nhằm mục ñích là nhận ñược tham chiếu ñến stream mà sử dụng ñể nhận nội dung của Soap message sẽ tạo. Tham chiếu này sẽ diễn ra trước bất cứ SoapMessageStage nào. Ví dụ:

// Lưu Stream mô tả Soap request và Soap response và 1 stream trên máy cục bộ public override Stream ChainStream( Stream stream ) { // Lưu Stream truyền vào vào 1 biến nhớ oldStream = stream; newStream = new MemoryStream(); return newStream; } III.15.3. Khởi tạo những thông số cho Soap extension. Class mà kế thừa từ SoapExtension có 2 phương thức cho khởi tạo dữ liệu: GetInitializer và Initialize. Nếu Soap extension ñược cấu hình sử dụng attribute ñể chạy, phương thức GetInitializer ñược gọi bởi ASP.NET infrastructure cho từng phương thức web, ngược lại nếu Soap extension ñược cấu hình ñể chạy trong 1 file config thì GetInitializer chỉ ñược gọi duy nhất 1 lần khi XML Web Service ñược truy xuất. Dữ liệu trả về từ phương thức GetInitializer ñược lưu giữ bởi ASP.NET infrastructure cho Soap Extension sử dụng sau này. Các Soap extension sẽ truyền các dữ liệu lưu trữ mỗi khi Soap thực thi với XML Web Service hay phương thức web trong phương thức Initialize.

Created by THÁI NGỌC DUY MSDN based-written.

210 4/12/2007

Class SoapExtension cung cấp phương thức GetInitializer có 2 prototype khác nhau phục vụ cho 2 kiểu cấu hình thực thi Soap Extension như sau: + Nếu gọi Soap Extension bằng cách áp các attribute lên từng phương thức Web thì chúng ta sử dụng prototype sau, tham số LogicalMethodInfo cung cấp chi tiết (prototype details) cho từng phương thức Web Service như là số tham số hay kiểu dữ liệu của chúng.

public override object GetInitializer(LogicalMethodInfo methodInfo,SoapExtensionAttribute attribute) { ... } + Nếu soap extension ñược cấu hình thực thi bằng tập tin

web.config, ta sử dụng prototype sau, tham số Type là Type của class mà cài ñặt XML Web Service. public override object GetInitializer(Type WebServiceType) {

} III.15.4.

Xử lý các Soap message dựa vào các

SoapMessageStage: Trong class mà kế thừa từ SoapExtension, phương thức chủ yếu ñể ta xử lý dữ liệu là ProcessMessage. Phương thức này nó cho phép một Soap extension nhận 1 SoapMessage ñể xử lý tại mỗi thời ñiểm mà ñược mô tả bằng Enum SoapMessageStage. Tuỳ theo trạng thái của SoapMessageStage mà ta có những xử lý ñể hiệu chỉnh hay xem thông tin Soap message. Bao gồm các trạng thái như sau: public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.BeforeSerialize: // Xử lý Soap message. break; case SoapMessageStage.AfterSerialize: // Xử lý Soap message. break; case SoapMessageStage.BeforeDeserialize: // Xử lý Soap message. break; case SoapMessageStage.AfterDeserialize: // Xử lý Soap message. break; default: throw new Exception("invalid stage");

Created by THÁI NGỌC DUY MSDN based-written.

211 4/12/2007

} }

III.15.5.

Cấu hình Soap extension ñể chạy với Web Service:

Một Soap Extension có thể ñược cấu hình ñể thực thi sử dụng custom attribute hoặc là cấu hình trong file web.config. + Sử dụng custom attribute: ñể sử dụng customer attribute, chúng ta áp ñặt(apply) nó lên mỗi phương thức Web Service mà muốn cài ñặt Soap extension. Ví dụ:

[TraceExtension()] [WebMethod] public Address TestMethod() { //Nội dung phương thức TestMethod() } Trong ñó TraceExtension() là class kế thừa từ SoapExtension cài ñặt

attribute. + Sử dụng file web.Config: Cấu trúc tổng quát như sau: <system.Web> <webServices> <soapExtensionTypes> ................ Qua cấu trúc trên ta thấy, bên trong element soapExtensionTypes, ta thêm những element add cho mỗi Soap extension mà chúng ta muốn thực thi với XML Web Service bên trong phạm vi của tập tin config. Element add có các thuộc tính sau: Thuộc tính Type Prority

Group

Diễn giải Type của Soap extension . Quan hệ ưu tiên của Soap extension bên trong 1 nhóm của chúng. Các Soap extension ñược gán ñộ ưu tiên ñể xác ñịnh thứ tự thực thi khi nhiều Soap extension ñược cấu hình ñể chạy với 1 phương thức web service. (0 có ñộ ưu tiên cao nhất) Nhóm của Soap extension. Có 3 nhóm ñó là Soap extension

Created by THÁI NGỌC DUY MSDN based-written.

212 4/12/2007

cấu hình sử dụng 1 attribute và Soap extension cấu hình trong file web.config với 1 Group với giá trị là 0 và 1, trong ñó Group 0 là ưu tiên cao nhất, 1 là ưu tiên thấp nhất.

III.16

MatchAttribute: Text pattern matching cho phép 1 XML Web

Service tác ñộng lên 1 nội dung HTML tồn tại thông qua việc phân tích nó sử dụng các biểu thức tổng quát(regular expressions). Bao gồm các thuộc tính: Capture: Group: IgnoreCase: MaxRepeats: Pattern:

Tài liệu MSDN: mshelp://MS.VSCC/MS.MSDNVS/cpguide/html/cpconattributesforaspnetwebservicesas pnetwebserviceclients.htm

29

Phương thức của Web Service: III.17

Cú pháp: [WebMethod] public ReturnValues TenPhuongthuc(Parameters) { .... }

III.18

Diễn giải:

ReturnValues: Khi gọi một XML Web Service sử dụng phương thức SOAP hay HTTP GET/POST, những kiểu dữ liệu sau ñây có thể trả về.

1 2 3 4 5 6 7 8 9

Kiểu dữ liệu Primitive Types Enum Types Arrays of Primitives (Enums) Classes and Structs Array of Classes (Structs) DataSet Array of DataSet XMLNode Array of XMLNode

Diễn giải Các kiễu dữ liệu cơ bản vd:String, Char, Byte,... Các kiểu hằng số Mảng dữ liệu cơ bản, hằng số vd: String[], int[],... Các trường (public) hay các thuộc tính (public) của class hay struct Mảng của các trường trên Kiểu dữ liệu DataSet của ADO.NET Mảng dữ liệu DataSet Kiểu dữ liệu XMLNode Mảng XMLNode

Parameters: Cả tham số by_value hay by_reference ñều hổ trợ khi sử dụng giao thức SOAP, còn khi sử dụng giao thức HTTP GET/POST thì tham số truyền vào chỉ

Created by THÁI NGỌC DUY MSDN based-written.

213 4/12/2007

truyền theo tham trị và giới hạn các kiểu liệu sau hổ trợ là: Primitive Types, Enum Types and Arrays of Primitives (Enums).

30Gọi sử dụng Web Service từ clients: III.19

Giao thức gọi Web Service:

Khi thực hiện truyền tham số qua mạng và chuyển kết quả từ máy chủ về máy khách theo giao thức HTTP. Phía ñối tượng sử dụng dịch vụ và ñối tượng cung cấp dịch vụ cần phải dựa trên một nguyên tắc ñóng gói hoặc chuyển tải nào ñó.Việc ñóng gói và chuyển tải dữ liệu của Web Service dựa trên 3 giao thức chính là HTTP-GET, HTTP-POST và SOAP. Kết quả trả về ñược ñóng gói theo mô tả của tài liệu XML. HTTP-GET: Sử dụng ñịa chỉ và cách truyền tham số ngay trên URL. Kết quả trả về là một tài liệu XML ñơn giản.

Ví dụ: 25 HTTP-POST: Dựa vào phương thức chuyển dữ liệu POSt của thẻ
khi ta submit. Dữ liệu chuyển bằng giao thức HTTP-POST có khả năng mã hoá và ñóng gói ñược số lượng lớn hơn HTTP_GET.. Kết quả trả về là một tài liệu XML ñơn giản giống như truyền theo phương thức HTTP-GET. SOAP: Dữ liệu truyền theo GET/POST của HTTP chủ yếu dùng cơ chế ñặt dữ liệu trong các biến theo khuôn dạng name=value, nên hạn chế thông tin chuyển ñi. SOAP sử dụng mô tả dữ liệu của ngôn ngữ ñịnh dạng XML ñóng gói thông tin cần chuyển ñi. Ở cấp ñộ kỹ thuật, SOAP không ñưa ra cách chuyển dữ liệu mới mà nó ñơn thuần dựa trên HTTP-POST nhưng thêm phần mô tả dữ liệu bằng XML.

Cấu hình giao thức Web trong tập tin web.config: Chúng ta có thể cấu hình cho các giao thức truyền dữ liệu như thêm hay xoá giao thức trong phần tử <protocols> có cấu trúc như sau: <system.Web> <webServices> <protocols> ................ Trong ñó protocol name có các giá trị sau : Giá trị Diễn giải HttpGet Thêm hay xoá phương thức HTTP GET HttpPost Thêm hay xoá phương thức HTTP POST

Created by THÁI NGỌC DUY MSDN based-written.

214 4/12/2007

HttpSoap Thêm hay xoá phương thức HTTP SOAP Documentation Thêm phương thức ñặc biệt Documentation. Khi ta gọi trực tiếp trang .asmx, ASP.NET chạy trang giúp ñỡ cung cấp các phương thức. Ví dụ:

<webServices> <protocols> <soapExtensionTypes> III.20

Tham chiếu ñến Web Service:

ðể ñơn giản cho việc phát triển ứng dụng bên client sử dụng Web Service, VS.NET cung cấp chức năng Web Reference. Một Web Reference là một class proxy tự sinh mà mô tả các phương thức của Web Service mà ta tham chiếu tới. Khi 1 ứng dụng client khởi tạo một instance của lớp proxy trên thì ứng dụng ñó có thể gọi các phương thức của Web Service như là một thành phần sẵn có. Việc thêm Web Reference ñã ñược thực hiện trong ví dụ trên. Nếu một ứng dụng có chứa một Web Reference tới Web Service mà ñã bị chỉnh sửa trên Server, chúng ta nên cập nhật lại tham chiếu trong project. Trong trường hợp ñó trình tiện ích sẽ tự ñộng phát sinh lại code cho lớp proxy mà nó sẽ cập nhật lại toàn bộ những thay ñổi trên server. Các bước tiến hành cập nhật: Trong Frame Solution Explorer, truy xuất thư mục Web Reference và chọn Web reference cụ thể mà muốn cập nhật. Click chuột phải trên tham chiếu và chọn Update Web Reference, khi ñó Web Reference của chúng ta ñã cập nhật. Cập nhật ñịa chỉ của Web Reference: Mỗi Web Reference trong project tương tác với lớp proxy thông qua việc truy xuất các phương thức trên Web Service. Chúng ta có thể sử dụng Thuộc tính URLBehavior của Web Reference ñể ñiều khiển lớp proxy tham chiếu ñến 1 Web Service. Thuộc tính này có 2 giá trị: Static: lớp proxy sử dụng ñịa chỉ cố ñịnh ñể tham chiếu ñến Web Sevice. ðịa chỉ này ta cung cấp cho Web Reference khi tạo mới 1 tham chiếu. Dynamic: Ứng dụng nhận ñược ñịa chỉ URL của Web Service khi thực thi chương trình từ file web.config. Khi ta xét giá trị này thì VS.NET thêm vào tập tin web.config các xác lập cho ñịa chỉ URL. Ví dụ:
Created by THÁI NGỌC DUY MSDN based-written.

215 4/12/2007

value="http://localhost/TestSOAPHeader/Service1.asmx"/ rel="nofollow">


Khi có bất kỳ sự thay ñổi nào về URL ta chỉ thay ñổi value trong xác lập này. Tài liệu MSDN: help://MS.VSCC/MS.MSDNVS/vsintro7/html/vxconWebReferences.htm

31

ms-

Bảo mật Web Service: III.21 Windows Authentication và Authorization (Xác nhận quyền truy cập từ Windows và chứng nhận quyền truy cập vào tài nguyên Server): III.21.1. Web Service(file .asmx): Chúng ta có thể sử dụng chế ñộ chứng thực Windows như một trang .aspx

bình thường ñể bảo mật cho trang .asmx của mình. ðể thiết lập chế ñộ Windows Authentication, ta vào IIS thiết lập các thuộc tính cho thư mục ứng dụng của mình như sau: Chọn thư mục ứng dụng của Web Service, mở hộp thoại Properties -> chọn tab Directory Security -> Click chọn nút Edit, chương trình sẽ hiển thị hộp thoại Authentication Methods như hình dưới ñây, ta chọn các mục như hình vẽ

Sau khi thiết lập các thông số cho Windows Authentication, ñể cho phép các user có quyền truy cập vào Web Service của mình, chúng ta phải thiết lập các thông số cấu hình trong tập tin web.config, thí dụ như sau :

<system.web> Created by THÁI NGỌC DUY MSDN based-written.

216 4/12/2007

<system.web> <deny roles="BUILTIN\Power Users"/>
Trong tập tin cấu hình này, ta phải chỉ file .asmx mà ta muốn cấp quyền truy cập và các quyền cho user, roles. Cuối cùng ta phải thiết lập cấu hình cho file .asmx mà ta bảo mật như sau: Vào IIS Manager, chọn tập tin .asmx, mở hộp thoại Properties, chọn tab File Security, sau ñó ta chọn nút Edit, chương trình hiển thị hộp thoại Authentication Methods giống như ở trên, ta chỉ chọn check Basic authentication. Ví dụ: http://azsw0188/TestWebServices/MathService.asmx

III.21.2. Web Service client: ðể truy xuất ñược thông tin từ Web Service, ta phải cung cấp sự uỷ nhiệm hợp lệ (set to valid windows credentials) cho máy mà ta cần truy xuất. Ví dụ:

private void Page_Load(object sender, System.EventArgs e) { // Khởi tạo 1 instance của MathService localhost.MathService m = new localhost.MathService(); // set to valid Windows credentials on the Web service's computer or domain m.Credentials =new System.Net.NetworkCredential("administrator",""); // Lấy DataSet từ Web Service DataSet myData = m.GetTitleAuthors(); if (!Page.IsPostBack) {

Authors_DataGrid.DataSource=myData.Tables["Authors"].Def aultView; Authors_DataGrid.DataBind(); } } Created by THÁI NGỌC DUY MSDN based-written.

217 4/12/2007

Minh hoạ: http://azsw0188/TestWebServicesClient/WebForm2.aspx

III.22

Custom Authentication và Authorization with Soap

Headers(Xác nhận quyền truy cập tuỳ chọn và chứng nhận quyền truy cập vào tài nguyên Server sử dụng Soap Headers): Chế ñộ xác thực windows(windows authentication) chỉ làm việc hiệu quả bên kịch bản của mạng nội bộ trong trường hợp bạn xác thực quyền của 1 user nào ñó trong domain của bạn.Tuy nhiên trên Internet, chắc chắn rằng bạn muốn xác thực và phân quyền tuỳ chọn chẳng hạn như phân quyền ở SQL server chẳng hạn. Trong trường hợp ñó bạn nên truyền 1 giấy uỷ nhiệm tuỳ chọn(custom credentials) như username và password vào cho web service và cho nó ñiều khiển xác thực và phân quyền cho user ñó. Cách tiện lợi ñể truyền những thông tin xác thực trên cùng với yêu cầu cho Web Service là sử dụng SOAP Headers. Cụ thể như sau: Bên phía Web Service, trong project Web Service của chúng ta, ta ñịnh nghĩa một class mà kế thừa từ class SoapHeader với 2 thuộc tính username và password, sau ñó khai báo một trường public thuộc kiểu ñịnh nghĩa trên trong class Web service của chúng ta .

Ví dụ: //ðịnh nghĩa một class kế thừa SoapHeader public class AuthHeader: SoapHeader { public string Username; public string Password; } // class kế thừa từ WebService [WebService(Description="Test Soap Headers", Namespace="http://MyWebService.com/")] public class TestSOAPHeader : System.Web.Services.WebService { // Khai báo 1 field thuộc kiểu AuthHeader ñịnh nghĩa ở trên. public AuthHeader sHeader; // ðịnh nghĩa 1 phương thức WebSevice [WebMethod(Description="This method requires a custom soap header set by the caller")] [SoapHeader("sHeader", Required=true)] public string HelloWorld() { if (sHeader==null) return "ERROR: Vui lòng cung cấp user name và password!"; string usr=sHeader.Username; string psw=sHeader.Password ; //Kiểm tra quyền truy cập if (AuthenticateUser(usr,psw)) { return "Bạn ñã ñăng nhập thành công! Xin chúc mừng bạn!"; }

Created by THÁI NGỌC DUY MSDN based-written.

218 4/12/2007

return "User và Password không hợp lệ!"; } // Hàm kiểm tra Username và Password private bool AuthenticateUser(string user, string passw) { //Có thể truy vấn từ database ñể xáx nhận quyền if ((user=="Thanh") && (passw=="TNT")) { return true; } return false; } }

Bên phía client, khi gọi sử dụng Web Service ta thực hiện:

1. Tạo 1 instance của class mà mô ta 3 Soap Headers. Ví dụ: localhost.AuthHeader h =new localhost.AuthHeader();

2. Gán các giá trị cho Soap Headers: h.Username=txtUsername.Text.ToString(); h.Password= txtPassword.Text.ToString();

3. Khởi tạo 1 instance của proxy class: localhost.TestSOAPHeader m =new localhost.TestSOAPHeader();

4. Gán ñối tượng Soap Headers cho biến của class proxy mô tả Soap Headers m.AuthHeaderValue=h;

5. Gọi phương thức từ class proxy mà tham chiếu tới Web Service ñể nhận kết quả trả về. lblResult.Text=m.HelloWorld().ToString();

Minh hoạ: http://azsw0188/TestSOAPHeaderClient/WebForm1.aspx

32

Kết luận: Web Service là một công nghệ hoàn toàn mới trong VS.NET, nó cho phép chúng ta xây dựng các ứng dụng web mà có thể lập trình ñể gọi sử dụng chúng bằng bất cứ ngôn ngữ gì và chạy trên bất cứ hệ ñiều hành nào mà có thể truy cập XML Web Service.

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&

Created by THÁI NGỌC DUY MSDN based-written.

219 4/12/2007

Created by THÁI NGỌC DUY MSDN based-written.

220 4/12/2007

Related Documents

Vnamese Aspnet
October 2019 37
Aspnet
June 2020 25
Aspnet-statemgmt
October 2019 34
Aspnet-exercizes
June 2020 17
Aspnet 2
November 2019 65