Professional Documents
Culture Documents
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 để 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 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.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.
3 Ứng dụng ASP.NET.
3.1 Khái quát.
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.1 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ó.
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.
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.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ụ:
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.
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.
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.
3.3.2 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:
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.
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.
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.
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.
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.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.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).
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.
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à camel-case,
đ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
<configuration> and <configuration>. 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 <configSections> and
</configSections>. 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
<configSections> 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 <configSections>. 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.
- 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.
<configuration>
<configSections>
<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" />
</configSections>
<appSettings>
<add key="dsn" value="localhost;uid=MyUserName;pwd=;" />
<add key="msmqserver" value="server\myqueue" />
</appSettings>
- 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.
<configuration>
<configSections>
<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>
<sectionGroup name="system.web">
<section name="authorization"
type="System.Web.Configuration.AuthorizationConfigHandler,
System.Web, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
<section name="sessionState"
type="System.Web.SessionState.SessionStateSectionHandler,
System.Web, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
allowDefinition="MachineToApplication" />
</sectionGroup>
</configSections>
<system.net>
<! — Net Class Settings would go here. -->
</system.net>
<system.web>
<authorization>
<allow users="*" /> <!-- Allow all users -->
<!-- Allow or deny specific users.
allow users="[comma separated list of users]"
roles="[comma separated list of roles]"/>
<deny users="[comma separated list of users]"
roles="[comma separated list of roles]"/>
-->
</authorization>
<sessionState
sqlConnectionString="data source=127.0.0.1;
user id=sa;password="
cookieless="false"
timeout="10"
/>
</system.web>
</configuration>
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:
<configuration>
<configSections>
<sectionGroup name="myGroup">
<sectionGroup name="nestedGroup">
<section name="mySection"
type="System.Configuration.NameValueSectionHandler,
System, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=9b35aa32c18d4fb1 />
</sectionGroup>
</configSections>
<myGroup>
<nestedGroup>
<mySection>
<add key="key_one" value="1" />
<add key="key_two" value="2" />
</mySection>
</nestedGroup>
</myGroup>
</configuration>
- 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"] + "<br>");
Response.Write("The value of key_two is " + config["key_two"] + "<br>");
<configuration>
<system.web>
<authentication>
<forms>
<credentials>
<passport>
<authorization>
<allow>
<deny>
<browserCaps>
<result>
<use>
<filter>
<case>
<clientTarget>
<add>
<remove>
<clear>
<compilation>
<compilers>
<compiler>
<assemblies>
<add>
<remove>
<clear>
<customErrors>
<error>
<globalization>
<httpHandlers>
<add>
<remove>
<clear>
<httpModules>
<add>
<remove>
<clear>
<httpRuntime>
<identity>
<machineKey>
<pages>
<processModel>
<securityPolicy>
<trustLevel>
<sessionState>
<trace>
<trust>
<webServices>
<protocols>
<add>
<remove>
<clear>
<serviceDescriptionFormatExtensionTypes>
<add>
<remove>
<clear>
<soapExtensionTypes>
<add>
<soapExtensionReflectorTypes>
<add>
<soapExtensionImporterTypes>
<add>
<WsdlHelpGenerator>
</webServices>
</system.web>
</configuration>
Element Description
<system.web> Chỉ đơn vị cấu hình cao nhất cho ASP.NET
configuration section.
<add> for <assemblies> 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)
<add> for <clientTarget> Adds an alias for a specific user agent to an
internal collection of user agent aliases.
<add> for <httpHandlers> Adds a reference to an assembly to use
during compilation of a dynamic resource.
<add> for <httpModules> Adds a reference to an assembly to use
during compilation of a dynamic resource.
<add> for <protocols> Adds a transmission protocol that the .NET
Framework can use to decrypt data sent
from a client browser in the HTTP request.
<add> for Adds a service description format extension
<serviceDescriptionFormatExtensionTypes> to run within the scope of the configuration
file.
<add> for <soapExtensionTypes>, Adds a SOAP extension to run with all
<soapExtensionImporterTypes>, and XML Web services within the scope of the
<soapExtensionReflectorTypes> configuration file.
<allow> Allows access to a resource.
<assemblies> Specifies ASP.NET compilation processing
directives.
<authentication> Configures ASP.NET authentication
support.
<authorization> Configures ASP.NET authorization support.
<browserCaps> Configures the settings for the browser
capabilities component.
<case> Allows pattern matching to stop after
processing the first successful match out of
a number of alternatives.
<clear> Removes all references to items appropriate
to the parent tag.
<clientTarget> Adds aliases for specific user agents to an
internal collection of user agent aliases.
<compilation> Contains all the compilation settings used
by ASP.NET.
<compiler> Defines a new compiler option.
<compilers> Specifies the compilers that the ASP.NET
application supports.
<credentials> 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.
<filter> Allows multiple rules to be applied in
sequence.
<forms> Configures an ASP.NET application for
custom forms-based authentication.
<globalization> Configures the globalization settings of an
application.
<httpHandlers> Maps incoming URL requests to
IHttpHandler classes.
<httpModules> Adds, removes, or clears HTTP modules
within an application.
<httpRuntime> Configures ASP.NET HTTP runtime
settings. This section can be declared at the
machine, site, application, or subdirectory
level.
<identity> Controls the application identity of the Web
application.
<machineKey> 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.
<pages> Identifies page-specific configuration
settings.
<passport> Specifies the page to redirect to if the page
requires authentication and the user has not
signed on with Microsoft Passport
authentication.
<processModel> Configures the ASP.NET process model
settings on Internet Information Services
(IIS) Web server systems.
<protocols> Specifies the transmission protocols that
ASP.NET can use to decrypt data sent from
a client browser in the HTTP request.
<remove> for <assemblies> Removes a reference to an assembly.
<remove> for <clientTarget> Removes an alias for a specific user agent
from an internal collection of user agent
aliases.
<remove> for <httpHandlers> Removes a verb/path mapping to an
HttpHandler class.
<remove> for <httpModules> Removes a reference to an HttpModule
class. The value of <remove> must exactly
match that of a previous <add> directive.
<remove> for <protocols> Removes a single protocol from a specific
application's list of supported HTML
encoding protocols.
<remove> for Removes a single service description format
<serviceDescriptionFormatExtensionTypes> extension type from within the scope of the
configuration file.
<result> 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.
<trace> 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.
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();
}
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.
*/
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
// Accept changes.
ds.AcceptChanges();
PrintValues(ds, "Original values");
newRow=t2.NewRow();
newRow["id"]= 13;
newRow["Item"]=665;
newRow["extra"]= "extra Column 2";
t2.Rows.Add(newRow);
// +++++++++++++++++++++++++++++++++++++++++++
++++
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
Method Description
AcceptChanges Đả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
BeginInit 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
BeginLoadData tắt những thông báo, chỉ mục và ràng buộc trong khi
load dữ liệu
Clear Xoá dữ liệu của DataTable
Clone 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
Compute 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 Copy tất cả cấu trúc và dữ liệu của DataTable này
Dispose(kế thừa từ Giải phóng tài nguyên được sử dụng bởi
MarshalbyValueCo MarshalValueComponent
mponent)
EndInit Kết thúc việc khởi tạo DataTable mà được dùng trên form
hoặc được dùng bởi thành phần khác. Việc khởi tạo xảy
ra lúc chạy
EndLoadData Bật các thông báo, chỉ mục và các ràng buộc sau khi đã
load dữ liệu
Equals(kế thưà từ Xác định liệu 2 thể hiện của đối tượng có bằng nhau
Object) không
GetChanges 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
GetErrors Trả về một mảng DataRow mà chứa lỗi
GetHashCode(kế
thừa từ Object)
GetService(kế thừa
từ
MarshalByValueCo
mponent)
GetType(kế thừa từ Trả về kiểu dữ liệu của thể hiện hiện tại
Object)
ImportRow Sao chép một DataRow vào một DataTable
LoadDataRow 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
NewRow tạo một DataRow mới với cùng lược đồ của bảng
RejectChanges 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
Reset Thiết lập lại DataTable về trạng thái ban đầu của nó
Select Trả về một mảng đối tượng DataRow
ToString
Public Event
Event Description
ColumnChanged Xảy ra khi sau khi một giá trị của DataColumn
được thay đổi trong DataRow
ColumnChanging Xảy ra khi một giá trị của DataColumn đang bị
thay đổi trong DataRow
Dispose(kế thừa từ
MarshalByValueCompon
ent)
RowChanged Xảy ra sau khi một DataRow được thay đổi
thành công
RowChanging Xảy ra khi một DataRow đang thay đổi
RowDeleted Xảy ra sau khi một dòng trong bảng được xoá
RowDeleting Xảy ra 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.
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.
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatacolumncollectio
nclasstopic.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
MarshalByValueCompon
ent)
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
MarshalByValueCompon chế độ thiết kế hay không
ent)
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
Maxlength Thiết lập hay trả về chiều dài tối đa của dữ liệu của
cột
Namespace Thiết lập hay trả về không gian tên của
DataColumn
Ordinal Trả về vị trí của cột trong DataColumnCollection
Prefix
ReadOnly Thiết lập hay trả về giá trị cho biết dữ liệu cột là chỉ
đọc hay không
Site(kế thừa từ Thiết lập hay trả về site của thành phần
MarshalByValueCompon
ent)
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.1. 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.2. Đối tượng DataRow
II.1.5.2.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.2.2. Các thành phần của đối tượng DataRow
Public properties
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 Xác định liệu hai thể hiện của đối tượng có bằng nhau hay
từ 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ế Trả về kiểu của thể hiện hiện tại
thừa 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.2.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);
foreach(DataColumn dc in myTable.Columns)
Console.WriteLine(dc.ColumnName);
dataGrid1.DataSource=myTable;
}
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\
• 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
myConn.Open();
myConn.Close();
return custDS;
}
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ề:
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";
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 Properties
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)
{
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
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
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ả
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));
myReader.Close();
nwindConn.Close();
Các thuộc tính của Class SqlDataReader
[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;
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);
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 =
'123-45-6789'",
myConnection);
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
Ví dụ sử dụng DataGrid
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
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
<html>
<script language="C#" runat="server">
myConnection.Open();
SqlDataReader dr = myCommand.ExecuteReader();
MyDataGrid.DataSource = dr;
MyDataGrid.DataBind();
myConnection.Close();
}
</script>
myCommand.SelectCommand.Parameters.Add(new
SqlParameter("@State", SqlDbType.NVarChar, 2));
myCommand.SelectCommand.Parameters["@State"].Value =
MySelect.Value;
MyDataGrid.DataSource= ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
}
SqlConnection myConnection;
if (!IsPostBack)
BindGrid();
}
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;
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 = "<b>Record Added</b><br>" +
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();
}
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
}
</script>
Updated dữ liệu
<script language="C#" runat="server">
SqlConnection myConnection;
if (!IsPostBack)
BindGrid();
}
myCommand.Parameters.Add(new SqlParameter("@Id",
SqlDbType.NVarChar, 11));
myCommand.Parameters.Add(new SqlParameter("@LName",
SqlDbType.NVarChar, 40));
myCommand.Parameters.Add(new SqlParameter("@FName",
SqlDbType.NVarChar, 20));
myCommand.Parameters.Add(new SqlParameter("@Phone",
SqlDbType.NChar, 12));
myCommand.Parameters.Add(new SqlParameter("@Address",
SqlDbType.NVarChar, 40));
myCommand.Parameters.Add(new SqlParameter("@City",
SqlDbType.NVarChar, 20));
myCommand.Parameters.Add(new SqlParameter("@State",
SqlDbType.NChar, 2));
myCommand.Parameters.Add(new SqlParameter("@Zip",
SqlDbType.NChar, 5));
myCommand.Parameters.Add(new SqlParameter("@Contract",
SqlDbType.NVarChar,1));
myCommand.Parameters["@Id"].Value =
MyDataGrid.DataKeys[(int)e.Item.ItemIndex];
String[] cols =
{"@Id","@LName","@FName","@Phone","@Address","@City","@State","@Zip
","@Contract"};
myCommand.Parameters[cols[i-1]].Value = colvalue;
}
myCommand.Connection.Open();
try
{
myCommand.ExecuteNonQuery();
Message.InnerHtml = "<b>Record Updated</b><br>" +
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();
}
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
}
</script>
Xoá dữ liệu
SqlConnection myConnection;
if (!IsPostBack)
BindGrid();
}
myCommand.Connection.Open();
try
{
myCommand.ExecuteNonQuery();
Message.InnerHtml = "<b>Record Deleted</b><br>" + deleteCmd;
}
catch (SqlException)
{
Message.InnerHtml = "ERROR: Could not delete record";
Message.Style["color"] = "red";
}
myCommand.Connection.Close();
BindGrid();
}
MyDataGrid.DataSource=ds.Tables["Employee"].DefaultView;
MyDataGrid.DataBind();
}
</script>
Sử dụng Stored procedure
Dim DS As DataSet
Dim MyConnection As SqlConnection
Dim MyCommand As SqlDataAdapter
MyConnection = New
SqlConnection("server=(local)\NetSDK;database=northwind;Trusted_Connecti
on=yes")
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
</script>
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.
/// </summary>
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;
} while (myReader.NextResult());
myReader.Close();
nwindConn.Close();
}
private void AccessData1()
{
SqlConnection myConnection = new SqlConnection("user
id=sa;pwd=;server=azsw0131;database=pubs;Trusted_Connect
ion=no");
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=MyS
elect.SelectedIndex;
DataSet ds = new DataSet();
myCommand.Fill(ds, "Authors");
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
myConnection.Close();
}
private void BindData1()
{
SqlConnection myConnection = new SqlConnection("user
id=sa;pwd=;server=azsw0131;database=pubs;Trusted_Connect
ion=no");
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();
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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
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.
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 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.
Để 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.
IV. Triển khai ứng các ứng dụng ứng WEB Projects:
1. Làm việc với WEB Projects:
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
\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:
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
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.
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
• Đặ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
Command.Connection.Open();
Command.Connection.ChangeDatabase(DatabaseName);
try
{
Command.ExecuteNonQuery();
}
finally
{
//Finally, block are a great way to ensure that the
//connection is always closed
Command.Connection.Close();
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
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.
+ 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.1Cá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.
+ 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.
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 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. 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.
Link : ms-
help://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)
- 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/
Cú pháp Mô tả Ví dụ
Ghi giá trị Application["var"] =
Dùng để Application["Name"] = "Thanh";
lên biến value; ghi giá trị
Var: tên biến cần cho một
lưu xuống biến mức
application. application.
Value: giá trị cuả Giá trị
biến. đượ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.
Lấy giá trị Var1 = Dùng lấy string name;
name =
của một Application[“var2”]; giá trị của Application["Name"].ToString();
biến mức Var1: tên biến chứa một biến
application. giá trị lấy được. mứ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
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:
...
}
IsReadOnly Protected bool Get/set Xem tại : ms-
help://MS.VSCC.200
3/MS.MSDNQTR.20
03APR.1033/cpref/ht
ml/frlrfsystemcollecti
onsspecializednameo
bjectcollectionbasecla
ssisreadonlytopic.htm
Phương
Tham số Kiểu trả về Mô tả Ví dụ
thức
Add String Void Thêm một biến (đối tượng) vào HttpApplicationState app
name,object tập hợp application state hiện tại. Application;
value // ghi vào biến Ho
Name: tên app.Add("Ho","Pham");
(khoá) của biến // ghi vào biến Ten
(đối tượng) app.Add("Ten","Thanh");
được thêm vào
tập hợp.
Value: giá trị
của biến.
Clear Void Void Xoá bỏ tất cả các biến hiện có // tạo đối tượng Applicati
trong tập hợp Application. HttpApplicationState app
Application;
// xoá bỏ tất cả các biến
hiện có
app.Clear();
Equals Object obj Bool So sánh đối tượng hiện tai với đối
Obj: đối tượng tượng khác. Phương thức này kế
cần so sánh thừa từ đối tượng Object.
Get Int index object Trả về một biến trong tập các // lấy đối tượng Applicati
Index: chỉ số biến Application hiện tại. Ta có HttpApplicationState app
của biến muốn thể đưa vào tên biến hay chỉ số Application ;
lấy. của biến. object myObj;
String name // gán giá trị cho một biến
Name: tên biến Ho
muốn lấy. app["Ho"] = "Pham";
Chỉ sử dụng // lấy biến Ho vào biến
một trong 2 myObj
tham số trên myObj = app.Get("Ho");
// xuất ra
Response.Write(myObj.T
String() + "<br>");
// ---- output : Pham
GetEnume Void IEnumerator Dùng liệt kê tất cả các khoá của // lấy đối tượng Applicati
rator các biến trong tập hợp HttpApplicationState app
Application. Ta không thể dựa Application ;
vào các biến nhận được để thay // biến giữ tập các khoá tr
đổi giá trị của các biến tương ứng về
trong tập Application. Phải tham IEnumerator iEnum;
chiếu đến namespace: // khởi tạo giá trị cho 2 bi
System.Collections.Speciali là Ho và Ten
zed.
app["Ho"] = "Pham";
app["Ten"] = "Thanh";
// lấy các khoá có trong tậ
hợp
iEnum =
app.GetEnumerator();
while(iEnum.MoveNext()
Response.Write(iEnum.C
rent.ToString() + "<br>")
// ---- > output : Ho
// Ten
GetHashC Void Int Trả về mã băm (hash code) của
ode đối tượng hiện tại. Xem thêm :
ms-
help://MS.VSCC.2003/MS.MSD
NQTR.2003APR.1033/cpref/htm
l/frlrfsystemobjectclassgethashco
detopic.htm
GetKey Int index String Trả về tên của biến được lưu // lấy đối tượng Applicati
Index: Chỉ số trong tập hợp Application State HttpApplicationState app
của biến ứng với chỉ số của biến đó. Giá Application ;
application state trị trả về không phải là giá trị của string nameObj;
cần lấy. biến. // khởi tạo giá trị cho 2 bi
là Ho và Ten
app["Ho"] = "Pham";
app["Ten"] = "Thanh";
for(int i=0 ; i<app.Count
i++)
{
// lấy tên biến
nameObj =
app.GetKey(i);
Response.Write(nameObj
"<br>");
}
// ----- > output : Ho
// Ten
GetObject SerializationInf Xem thêm tại : ms-
Data o info, help://MS.VSCC.2003/MS.MSD
StreamingConte NQTR.2003APR.1033/cpref/htm
xt context l/frlrfsystemcollectionsspecialize
dnameobjectcollectionbaseclassg
etobjectdatatopic.htm
GetType Void Type Trả về kiểu dữ liệu hiện tại của // lấy đối tượng Applicati
đối tượng Application state hiện HttpApplicationState app
hành. 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(typeNam
ToString() + "<br>");
// ---- > output:
System.Web.HttpApplica
onState
Lock Void Void 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()
OnDeseria Object sender Void Xem thêm tại : ms-
lization help://MS.VSCC.2003/MS.MSD
NQTR.2003APR.1033/cpref/htm
l/frlrfsystemcollectionsspecialize
dnameobjectcollectionbaseclasso
ndeserializationtopic.htm
Remove String name Void Huỷ bỏ một biến khỏi tập hợp
Name: tên của Application State thông qua tên
biến cần huỷ bỏ biến.
RemoveAl Void Void Huỷ bỏ tất cả các biến hiện có
l trong tập hợp Application State.
Phương thức này sẽ gọi phương
thức Clear().
RemoveAt Int index Void Huỷ bỏ một biến khỏi tập hợp
Index: chỉ số Application State thông qua chỉ
của biến cần số của biến.
huỷ bỏ
Set String name, Void Cập nhật lại giá trị của một biến
object value thông qua tên của biến.
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 String Kế thừa từ đối tượng object. Trả
về chuổi đại diện cho đối tượng
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.
Unlock Void Void Cho phép truy cập trở lại biến // lấy đối tượng Applicati
application state đã bị khoá bằng HttpApplicationState app
phương thức Lock() 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 Tham số Mô tả
Application_Start Object sender, EventArgs e Event này
Sender: đối tượng kiểu 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
ASP.Global_asax. khi chứng
E: đối tượng kiểu System.EventArgs thực client
gửi yêu cầu
có được cấp
quyền hay
không.
Application_Error Object sender, EventArgs e Event này
chưa bắt
được.
Application_End Object sender, EventArgs e 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ụ:
Response.Write(ses.Keys.
(i).ToString() + "<br>");
// ---- > output: Ho
// Ten
LCID Int Get/set Lấy và trả về số chỉ thông tin về n = ses.LCID;
vùng của một session. Xem Response.Write(n.ToStrin
thêm: ms- + "<br>");
help://MS.VSCC.2003/MS.MS // ---- > output: 1033 (tuỳ
DNQTR.2003APR.1033/cpref/h máy)
tml/frlrfsystemwebsessionstateht
tpsessionstateclasslcidtopic.htm
Mode SessionStateMod Get trả về chế độ của session hiện tại Response.Write(ses.Mode
e do ta thiết lập trong tập tin cấu String() + "<br>");
hình web.config ở tag // ---- > output: SQLServe
<sessionState>. Khi ta thiết lập (tuỳ thiết lập mode)
mode= Off thì không thể lấy đối
tượng session để kiểm tra được
thuộc tính này
SessionID String Get Trả về session ID của session
hiện tại.
StaticObjects HttpStaticObjects get Trả về tập các object được khai
Collection báo trong tag <object
Runat=”server”
Scope=”Session”/> trong file
Global.asax. Xem thêm : ms-
help://MS.VSCC.2003/MS.MS
DNQTR.2003APR.1033/cpref/h
tml/frlrfsystemwebsessionstateht
tpsessionstateclassstaticobjectsto
pic.htm
SyncRoot Object Get Trả về đối tượng dung để truy Response.Write(ses.SyncR
suất toàn bộ các đối tượng có .ToString() + "<br>");
trong session State. // ---- > output:
System.Web.SessionState.
pSessionState
Timeout Int Get/set 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ê
Thời gian hết hạn được tính cầu
bằng thời gian ngay sau khi ses.Timeout = 12;
client gửi một yêu cầu cộng Response.Write(ses.Timeo
thêm Timeout . ToString() + "<br>");
// ---- > output: 12
Response.Write(enumSe
oString() + "<br>");
// ---- > output: Ho
// Te
GetHashCode Void Int Trả về khoá băm của đối
tượng. Phương thức kế
thừa từ lớp Object. Xem
thêm: ms-
help://MS.VSCC.2003/MS.
MSDNQTR.2003APR.103
3/cpref/html/frlrfsystemobj
ectclassgethashcodetopic.ht
m
GetType Void Type Trả về kiểu của đối tượng. Response.Write(ses.GetT
tring() + "<br>");
// ---- > output:
System.Web.SessionStat
onState
Remove String name. Void Xoá bỏ một biến ra khỏi
Name: tên biến session state thông qua tên
cần xoá bỏ khỏi biến.
session state.
RemoveAll Void 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()
ToString Void String Trả về một chuổi đại diện Response.Write(ses.ToSt
cho object "<br>");
// ---- > output:
System.Web.SessionStat
onState
RemoveAt Int index. Void Loại bỏ một biến ra khỏi
Index: chỉ số session state thông qua chỉ
của biến cần số của biến.
loại bỏ ra khỏi
session state.
- 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 Tham số Mô tả
Session_Start Object sender, EventArgs e Event phát sinh
Sender:
khi có một client
System.Web.SessionState.SessionStateModule truy cập tới trang
E: System.EventArgs web.
Session_End 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
<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ụ:
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.
sqlConnectionString chuổi chứa thông tin kết nối. Chuổi chứa thông tin kết nối đến database
Cú pháp: chứa session state. Thuộc tính này có tác
Giống như khi ta thiết lập một chuổi dụng khi mode = SQLServer.
connectionString để kết nối đến SQL
stateNetworkTimeout Số nguyên. 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.
15.2 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.
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:
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. 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.
2. 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.
3. 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.
4. 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: <%@ Page attribute="value" [attribute="value"…] %>
Ví Dụ: <%@ 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
modify 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.
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 :
Ở 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.
<br><br>
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:
// 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.
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.
- 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
{
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;
}
}
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 để
đoạn code này làm việc, chúng ta cần khai báo constructor trong lớp Nguoi, vấn đề
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
}
}
}
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 class
đượ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.
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:
- 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
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
+ 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
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)
{
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)
{
return year %4==0? true:false;
}
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;
}
* 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;
}
class shape:myDrawing
{
int Orix;
int Oriy;
public int originx
{
get{
return Orix;
}
set
{
Orix=value;
}
}
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;
ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrf[]Operator.htm
9. Indexer
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
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.
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfSystemReflectionPointerClassBoxTopic.htm
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
}
Trong C++, kết quả sẽ là : <Value is 100> , <Value is 200> 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 <Value is 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;
}
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
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()
{
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();
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:
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============================================
==============
- Đây là dòng quyết định sử dụng control nào trong project đã được
đăng ký.
- Cũng giống như những class bình thường đầu tiên vẫn là khai báo
namespace.
namespace CustomTag
- 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;
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.
<cc1:WebCustomControl1 id="WebCustomControl11" runat="server"
Text="AZ Solution"></cc1:WebCustomControl1>
Xem ví dụ:
http://azweb05/WebUIDemo/useCustomTag.aspx.
Xem document:
ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughcreatingcust
omwebcontrols.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.
- Hộp thoại Add New Item xuất hiện, nhập tên control vào textbox
Name, click Open.
- 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:
<asp:TextBox id=TextBox1 runat="server">
- Để 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;
}
- Đố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:
ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughcreatingw
ebusercontrols.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ế, 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 ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughconver
tingwebformtousercontrol.htm. trong document).
Xem tài liệu tổng quan:
ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vboriWebUserControls.htm
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
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:
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemwebuipagemembers
topic.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);
* Nội dung được in đúng ngay vị trí lúc gọi phương thức print_text().
Xem Document:
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemwebhttpresponseme
mberstopic.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] + "<br>");
// 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] + "<br>");
}
}
}
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;
// Đọ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] + "<br>");
String[] arr2 = coll.GetValues(arr1[loop1]);
for (loop2 = 0; loop2 < arr2.Length; loop2++) {
Response.Write("Value " + loop2 + ": " +
arr2[loop2] + "<br>");
}
}
}
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"]);
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"]);
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");
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");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Read XML
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
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 và các sự kiện của nó.
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 :
<asp:Label id="Label1" style="Z-INDEX: 122; LEFT: 32px;
POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px">
</asp:Label>
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 :
+ 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.
+ 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.
Cú pháp:
+ Trong C# :
Protected System.Web.WebControls.TextBox TextBox1;
+ Trong ASP.NET
<asp:TextBox id="Label1" style="Z-INDEX: 122; LEFT: 32px;
POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px">
</asp:TextBox>
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 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 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.
- 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.
Cú pháp:
+ Trong C#:
protected System.Web.UI.WebControls.Button Button1;
+ Trong ASP.NET
<asp:Button id="Button1" style="Z-INDEX: 122; LEFT: 32px;
POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px">
</asp:Button>
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 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 đó.
- 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
♦ 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.
Cú pháp:
+ Trong C#:
protected System.Web.UI.WebControls.LinkButton LButton1;
+ Trong ASP.NET
<asp:LinkButton id="LinkButton1" style="Z-INDEX: 122;
LEFT: 32px; POSITION: absolute; TOP: 443px"
runat="server" Width="132px" Height="34px">
</asp:LinkButton>
chức năng
giống như trên.
Các thuộc tính
Giống như trên không khác một thuộc tính nào cả.
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
Cú pháp:
+ Trong C#:
protected System.Web.UI.WebControls.ImageButton IBttn1;
+ Trong ASP.NET
<asp:ImageButton id="LinkButton1" style="Z-INDEX: 122;
LEFT: 32px; POSITION: absolute; TOP: 443px"
runat="server" Width="132px" Height="34px">
</asp:ImageButton>
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 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 đó.
- 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.
+ 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.
.
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ó.
Cú pháp
+ Trong C#:
protected System.Web.UI.WebControls.HyperLink link1;
+ Trong ASP.NET
<asp:HyperLink id="HyperLink1" style="Z-INDEX: 122; LEFT:
32px; POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px">
</asp:HyperLink>
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.
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.
+ 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.
+ 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
<asp:DropDownList id="DropDownList1" style="Z-INDEX:
122; LEFT: 32px; POSITION: absolute; TOP: 443px"
runat="server" Width="132px" Height="34px">
</asp:DropDownList>
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.
+ 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.
- 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
<asp:ListBox id="ListBox1" style="Z-INDEX: 122; LEFT:
32px; POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px"></asp:ListBox>
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 :
+ 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.
+ 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
<asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 34px;
POSITION: absolute; TOP: 68px" runat="server" Height="126px"
Width="368px" AutoGenerateColumns="True">
<Columns>
<asp:EditCommandColumn ButtonType="LinkButton"
UpdateText="Cập nhật" HeaderText="Hiệu chỉnh"
CancelText="Không" EditText="Sửa">
<HeaderStyle Width="100px">
</HeaderStyle>
</asp:EditCommandColumn>
<asp:TemplateColumn>
<ItemTemplate>
<asp:LinkButton runat="server" Text="Xóa" CommandName="Delete"
CausesValidation="false">
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
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)
- 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.
♦ 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)
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
Xem chi tiết
11. Repeater(gần giống dataGrid)
Cú pháp
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 Description
ItemTemplate 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 khi
FooterTemplate 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 <TABLE>,
ở trong HeaderTemplate và đặc tag đóng,
</TABLE> 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.
Thuộc tính
Các sự kiện
Một ví dụ
12. CheckBox
Cú pháp
Chứa năng
Là một nút chọn.
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.
- 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.
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
Một ví dụ
13. CheckBoxList
Cú pháp
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.
Thuộc tính
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
♦ SelectedIndexChanged :
♦ Unload
Một ví dụ
14. RadioButtonList
Cú pháp
Chứa năng
Một nhóm các nút RadioButton mà chúng ta chỉ được chọn một.
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
- 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.
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
♦ SelectedIndexChanged :
♦ Unload
Một ví dụ
15. RadioButton
Cú pháp
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.
Thuộc tính
giống như checkBox
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
Một ví dụ
16. Image
Cú pháp
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
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.
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
Một ví dụ
Xem Đề mô
17. Panel
Cú pháp
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.
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ô
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
Một ví dụ
18. PlaceHolder
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
19. Canlender
Cú pháp
Chứa năng
Control này nó cho chúng ta chọn một ngày tháng năm.
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.
+ 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.
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
Một ví dụ
chọn ngày tháng năm đưa vào TextBox1
this.TextBox1.Text=this.Calendar1.SelectedDate.ToSho
rtDateString();
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
Cú pháp
Khai báo giống như các control khác.
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 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 đó
+ Còn các thuộc tính khác thì các bạn đã biết.
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
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 :
<ImageUrl> :chứa hình ảnh quản cáo
<NavigateUrl>: chứa link đến một trang nào đó.
<AlternateText>Alt Text</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
Sau đây là một ví dụ:
<Advertisements>
<Ad>
<ImageUrl>/UICSharp/images/banner1.gif</ImageUrl>
<NavigateUrl>http://www.microsoft.com</NavigateUrl>
<AlternateText>Alt Text</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
</Ad>
<Ad>
<ImageUrl>/UICSharp/images/banner2.gif</ImageUrl>
<NavigateUrl>http://www.microsoft.com</NavigateUrl>
<AlternateText>Alt Text</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
</Ad>
<Ad>
<ImageUrl>/UICSharp/images/banner3.gif</ImageUrl>
<NavigateUrl>http://www.microsoft.com</NavigateUrl>
<AlternateText>Alt Text</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
</Ad>
</Advertisements>
Trong file XML này chúng ta phảI chú ý nút góc phảI là <Advertisements>
và các mục quảng cáo phảI là <Ad> </Ad> giống như ví dụ trên
xem đề mô
21. Table
Cú pháp
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.
Thuộc tính
Các bạn đã biết
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
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<numrows;j++) {
//Tạo dòng mới
TableRow r = new TableRow();
for(int i=0;i<numcells;i++){
// tạo các cột cho từng dòng ở trên
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);
}
//add số dòng cho một bảng
this.Table1.Rows.Add(r);
}
}
22. RequiredFieldValidator
Cú pháp
Cú pháp khai báo như các control khác.
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.
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.
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
Một ví dụ
23. CompareValidator
Cú pháp
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?
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.
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
Một ví dụ
24. RangeValidator
Cú pháp
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.
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.
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
Một ví dụ
25. RegularExpressionValidator
Cú pháp
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.
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.
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
Một ví dụ
26. CustomValidator
Cú pháp
Chứa năng
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ó.
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.
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
Một ví dụ
<script language="javascript">
function ValidateLength(oSrc,args){
if(args.Value.Length > 8) args.IsValid = true;
}
</script>
27. ValidationSummary
Cú pháp
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ệ.
Thuộc tính
+ 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.
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
Một ví dụ
28. Xml
Cú pháp
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.
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”);
- 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)
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
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
Cú pháp
Chứa năng
19.1.1.1 Giống Label
Thuộc tính
Các sự kiện
Một ví dụ
30. CrystalReportViewer
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
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.
Ví dụ :
<input id="Name" type=text size=40
runat="server">
<input type=submit id="Enter" value="Enter"
runat="server">
<a id="Anchor1" runat="server" href="more.html">More </a>
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>
<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.
3. 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.
21 Sau đâ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
. Label
Cú pháp
<label id="lable" onMouseOut="tên hàm" ></label>
Chứa năng
Thuộc tính
Các sự kiện
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"
Một ví dụ
. Button
Cú pháp
<input type =”button” id=”button” name =”tên”/>
Chứa năng
Thuộc tính
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"
Một ví dụ
. Reset Button
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
. Submit Button
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
. TextField
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
. TextArea
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
. File Field
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
. PassWordField
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
. CheckBox
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
10. RadioButton
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
11. Hidden
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
12. Table
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
15. Image
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
16. ListBox
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
17. DropDown
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
22 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.
22.1 So sánh giữa hai loạI Web server control và HTML server
control
23 Web 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.
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ì.
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.
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ó.
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 : <HTML>, <BODY>, <FORM>
Để 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à 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 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 <html>,
<body>, <form>
- 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 là Only a single copy of the control is
yêu cầu trong mỗI ứng dụng required, in the global assembly cache
Không thể thêm vào ToolBox Add vào ToolBox được
Tốt cho việc trình bày tĩnh 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.
Code ở client:
Ví dụ:
- Xử lý sự kiện phía server.
File: server.aspx
<form id="Form1" method="post" runat="server">
<asp:textbox id="txtText1" style="Z-INDEX: 101; LEFT:
120px; POSITION: absolute;
TOP: 88px" runat="server" Width="256px" ForeColor="Transparent">
Text default</asp:textbox>
<asp:button id="butServer" style="Z-INDEX: 102; LEFT: 320px;
POSITION: absolute;
TOP: 128px" runat="server" Text="Server"></asp:button>
</form>
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";
}
<script>
document.client.butClient.onclick = function()
{
if( this.txtText1.Text == "Teo")
this.txtText1.Text="OK";
else
this.txtText1.Text="Cancel"; }
</script>
Xem ví dụ:
http://azweb05/WebUIDemo/server.aspx
http://azweb05/WebUIDemo/client.aspx
Khi ta tạo một text box ở web form (<asp:textbox>) thì ta vẫn có thể
xử lý dữ liệu ở client. Nhưng khi tao một text box bằng HTML(<INPUT
type=”text”>) thì phí server không thể hiểu được text box này.
Ví dụ: sử dụng textbox ở server và xử lý ở client:
<form id="controlServer" method="post" runat="server">
<asp:textbox id="txtText1">Text default</asp:textbox>
<asp:button id="butServer" Text="Server"></asp:button>
</form>
<script>
document.controlServer.butServer.onclick = function()
{
if(document.controlServer.txtText1.value ==
"az")
document.controlServer.txtText1.value =
"OK";
else
document.controlServer.txtText1.value =
"Cancel";
}
</script>
Như đã nói ở trên, một textbox phía server sau khi gửi về client là
một nhãn <INPUT> 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.
Service Request
Business Facade
Data Access
Business Logic
Service Response
Listener
Data
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: ms-
help://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:
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.
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();
}
28 Attribute 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.";
}
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)
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 <Body>.
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:
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 <Body>.
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.
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. Để 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. Để 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.
<configuration>
<system.Web>
<webServices>
<soapExtensionTypes>
<add type="soap extension class"
priority="number"
group="0|1" />
</soapExtensionTypes>
................
</webServices>
</system.Web>
</configuration>
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:
value="http://localhost/TestSOAPHeader/Service1.asmx"/></appSettings>
</configuration>
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: ms-
help://MS.VSCC/MS.MSDNVS/vsintro7/html/vxconWebReferences.htm
31 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 :
<configuration>
<system.web>
<authentication mode="Windows"/>
</system.web>
<location path="Service1.asmx">
<system.web>
<authorization>
<allow users="Administrator"/>
<allow users="DOMAIN\UserName"/>
<deny roles="BUILTIN\Power Users"/>
</authorization>
</system.web>
</location>
</configuration>
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
Authors_DataGrid.DataSource=myData.Tables["Authors"].DefaultView;
Authors_DataGrid.DataBind();
}
}
Minh hoạ: http://azsw0188/TestWebServicesClient/WebForm2.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.