1. Trang chủ >
  2. Công Nghệ Thông Tin >
  3. Kỹ thuật lập trình >

Chương 7:ASP.NET VÀ WEB FORM

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (7.15 MB, 706 trang )


235



236

Chương 7: ASP.NET và Web Form



M



icrosoft ASP.NET là một nền dùng để phát triển các ứng dụng Web, và nó là một

phần của Microsoft .NET Framework. ASP.NET cho phép bạn viết dịch vụ Web

XML (sẽ được thảo luận trong chương 12) và phát triển website (được thảo luận

trong chương này). Các trang ASP.NET sử dụng mô hình điều kiểm dựa-trên-sự-kiện, khiến

cho việc viết mã cho chúng cũng tương tự như viết mã cho các ứng dụng dựa-trên-Windows

thông thường. Tuy nhiên, sự tương tự này có thể là giả tạo. Như hầu hết các nhà phát triển

ASP.NET chứng thực, các ứng dụng Web có cách diễn đạt riêng của chúng. Ví dụ, bạn sẽ cần

thực hiện thêm các bước để duy trì trạng thái, chuyển thông tin giữa các trang, thụ lý những sự

kiện phía client, thực hiện xác thực, và bảo đảm hiệu năng tối ưu khi sử dụng cơ sở dữ liệu.

Chương này sẽ xem xét tất cả các vấn đề này.







Chương này sẽ không giới thiệu về ASP.NET. Thay vào đó, chương này sẽ giúp

những nhà phát triển ASP.NET trung cấp giải quyết những vấn đề thường gặp.

Để tìm hiểu căn bản về ASP.NET, hãy vào trang [http://www.asp.net] hoặc

tham khảo ở các tài liệu khác chuyên về ASP.NET.



Các mục trong chương này trình bày các vấn đề sau đây:



 Chuyển hướng các yêu cầu của người dùng (mục 7.1).

 Duy trì trạng thái giữa các yêu cầu trang (mục 7.2 và 7.3).

 Sử dụng JavaScript để cải tiến giao diện với các tính năng phía client (mục 7.4, 7.5, và

7.6).



 Cho phép người dùng upload file (mục 7.7).

 Xác thực client theo hai cách: Xác thực tích hợp với Windows (mục 7.8) và xác thực

dựa-trên-form (mục 7.9).



 Xác nhận tính hợp lệ của đầu vào mà không sử dụng điều kiểm validator của ASP.NET

(mục 7.10).



 Tạo động điều kiểm web (mục 7.11), hình ảnh (mục 7.12), và điều kiểm người dùng

(mục 7.13).



 Cải thiện hiệu năng với output-caching (mục 7.14) và data-caching (mục 7.15).

 Giải quyết thông báo lỗi “Unable to start debugging on the Web server” (mục 7.16).

 Thay đổi ngữ cảnh tài khoản Windows mà một ứng dụng ASP.NET chạy trong đó (mục

7.17).

Chương này sử dụng các lớp web cơ bản thuộc không gian tên System.Web và các lớp điều

kiểm web thuộc không gian tên System.Web.UI.WebControls. Khi sử dụng các lớp trong các

không gian tên này, tên lớp đầy đủ sẽ không được chỉ định.



1.





Chuyển hướng người dùng sang trang khác

Bạn cần chuyển sự thực thi từ một trang ASP.NET sang một trang khác, hoặc

bạn muốn chuyển người dùng đến một site hoàn toàn khác.



237

Chương 7: ASP.NET và Web Form







Sử dụng phương thức HttpResponse.Redirect để chuyển người dùng đến một

URL mới, hoặc sử dụng phương thức HttpServerUtility.Transfer (nhanh hơn)

để chuyển người dùng đến một Web Form ASP.NET khác trên cùng server.



Cách dễ nhất để chuyển người dùng từ một trang này đến một trang khác là sử dụng phương

thức HttpResponse.Redirect và cấp một URL mới. Bạn có thể truy xuất đối tượng

HttpResponse hiện tại thông qua đối tượng HttpContext hoặc sử dụng thuộc tính Reponse của

đối tượng Page hoặc Control. Phương thức thụ lý sự kiện dưới đây (đáp ứng cho một cú nhắp

chuột vào Button) sẽ chuyển người dùng đến một trang ASP.NET mới:

private void cmdRedirect_Click(object sender, System.EventArgs e) {



Response.Redirect("newpage.aspx");

}



Phương thức Redirect có thể làm việc với URL tương đối (chỉ đến những tài nguyên trong

cùng thư mục ảo), và với URL đầy đủ. URL có thể chỉ đến trang ASP.NET khác, kiểu tài liệu

khác (như trang HTML hoặc hình ảnh), và web-server khác.

Phương thức Redirect gửi chỉ thị chuyển hướng đến trình duyệt. Kế đó, trình duyệt sẽ yêu cầu

trang mới. Kết quả là trình duyệt phải thực hiện hai chuyến đến web-server, và web-server

phải xử lý thêm một yêu cầu nữa. Một tùy chọn hiệu quả hơn là sử dụng phương thức

HttpServerUtility.Transfer, phương thức này sẽ chuyển sự thực thi đến một trang ASP.NET

khác trên cùng web-server. Ví dụ:

private void cmdRedirect_Click(object sender, System.EventArgs e) {



Server.Transfer("newpage.aspx");

}



Phương thức Transfer không cần thêm một chuyến đến client, nhưng nó sẽ không làm việc

nếu bạn cần chuyển sự thực thi đến một server khác hoặc một kiểu tài nguyên khác với Web

Form (bao gồm trang ASP cổ điển).



2.



Duy trì trạng thái giữa các yêu cầu của trang







Bạn cần lưu trữ vài thông tin đặc thù của người dùng giữa các lần postback của

trang.







Sử dụng view state (trạng thái nhìn), query string argument (đối số chuỗi truy

vấn), session state (trạng thái phiên làm việc), hoặc cookie, tùy thuộc vào nhu cầu

của bạn.



ASP.NET là một mô hình lập trình phi trạng thái (stateless programming model). Mỗi khi một

postback được phát sinh, mã sẽ nạp vào bộ nhớ, thực thi, và được giải phóng khỏi bộ nhớ.

Nếu muốn giữ lại vết của thông tin sau khi mã đã hoàn tất việc xử lý, bạn phải sử dụng các

kiểu quản lý trạng thái (state management).



238

Chương 7: ASP.NET và Web Form



ASP.NET cung cấp nhiều cách để lưu trữ thông tin, hay trạng thái, giữa các yêu cầu (request).

Kiểu trạng thái mà bạn sử dụng cho biết: thông tin sẽ sống bao lâu, sẽ được lưu trữ ở đâu, và

sẽ được bảo mật như thế nào. Bảng 7.1 liệt kê những tùy chọn trạng thái khác nhau được cấp

bởi ASP.NET. Bảng này không chứa đối tượng Cache, đối tượng này cung cấp kho lưu trữ tạm

thời và sẽ được mô tả trong mục 7.5.

Cú pháp cho các phương pháp lưu trữ dữ liệu là như nhau. Dữ liệu được lưu trữ trong một đối

tượng tập hợp và được đánh chỉ mục bằng một tên chuỗi.

Bảng 7.1 Các kiểu quản lý trạng thái

Kiểu

trạng thái



Dữ liệu

được phép



View state



Tất cả các

kiểu dữ liệu

khả-tuầntự-hóa

.NET.



Vị trí lưu trữ



Thời gian sống



Bảo mật



Một trường ẩn

trong trang web

hiện hành.



Bị mất khi người

dùng chuyển sang

một trang khác.



Mặc định là không

an toàn. Tuy nhiên,

bạn có thể sử dụng

các chỉ thị trang để

thực hiện mật hóa

và băm để ngăn dữ

liệu bị phá.



Người dùng có thể

nhìn thấy được và

chỉnh sửa dễ dàng.



Query

string



Dữ liệu

chuỗi.



Chuỗi URL của

trình duyệt.



Bị mất khi người

dùng nhập một URL

mới hoặc đóng trình

duyệt. Tuy nhiên, nó

có thể được lưu trữ

trong một

bookmark.



Session

state



Tất cả các

kiểu dữ liệu

khả-tuầntự-hóa

.NET.



Bộ nhớ server

(có thể được cấu

hình cho một

tiến trình hoặc

cơ sở dữ liệu

bên ngoài).



Hết hiệu lực sau một

khoảng thời gian

được định nghĩa

trước (thường là 20

phút, nhưng khoảng

thời gian này có thể

thay đổi được).



An toàn vì dữ liệu

không bao giờ được

chuyển cho client.



Dữ liệu

chuỗi.



Máy tính client

(trong bộ nhớ

hoặc một file

text, tùy thuộc

vào các thiết lập

cho thời gian

sống của nó).



Được thiết lập bởi

lập trình viên. Có

thể được sử dụng

trong nhiều trang và

có thể vẫn còn giữa

các lần viếng thăm.



Không an toàn, và

có thể bị người

dùng chỉnh sửa.



Cookie



239

Chương 7: ASP.NET và Web Form



Applicatio

n state



Tất cả các

kiểu dữ liệu

khả-tuầntự-hóa

.NET.



Bộ nhớ server.



Thời gian sống của

ứng dụng (cho đến

khi server được khởi

động lại). Không

giống với các

phương pháp khác,

dữ liệu ứng dụng là

toàn cục đối với tất

cả các người dùng.



An toàn vì dữ liệu

không bao giờ được

chuyển cho client.



Hình 7.1 trình bày một trang web thử nghiệm các kiểu quản lý trạng thái khác nhau. Khi

người dùng nhắp vào nút Store Data, một đối tượng System.DateTime sẽ được tạo ra và được

lưu trữ trong view state, session state, và một cookie tùy biến. Khi người dùng nhắp vào nút

Get Data, thông tin này sẽ được lấy ra và hiển thị. Cuối cùng, nút Clear Data sẽ xóa thông tin

này trong tất cả các trạng thái.



Hình 7.1 Thử nghiệm các kiểu quản lý trạng thái



Dưới đây là phần mã cho trang:

using System;

using System.Web;

using System.Web.UI.WebControls;

using System.Web.SessionState;



public class TestState : System.Web.UI.Page {



protected System.Web.UI.WebControls.Button cmdClear;

protected System.Web.UI.WebControls.Button cmdStore;



240

Chương 7: ASP.NET và Web Form



protected System.Web.UI.WebControls.Button cmdGetData;

protected System.Web.UI.WebControls.Label lblData;



// (Bỏ qua phần mã designer.)



private void cmdStore_Click(object sender, System.EventArgs e) {



// Tạo đối tượng thử nghiệm.

DateTime now = DateTime.Now;



// Lưu trữ đối tượng trong view state.

ViewState["TestData"] = now;



// Lưu trữ đối tượng trong session state.

Session["TestData"] = now;



// Lưu trữ đối tượng trong một cookie tùy biến.

// Kiểm tra xem cookie đã tồn tại hay chưa (có tên là 07-02).

if (Request.Cookies["07-02"] == null) {



// Tạo cookie.

HttpCookie cookie = new HttpCookie("07-02");



// Cookie chỉ có thể lưu trữ dữ liệu chuỗi.

// Nó có thể lưu trữ nhiều giá trị,

// mỗi giá trị ứng với một khóa khác nhau.

cookie["TestData"] = now.ToString();



// (Bạn có thể chỉnh sửa các thuộc tính

//



của cookie để thay đổi ngày hết hiệu lực.)



// Gắn cookie vào đáp ứng.

// Nó sẽ được cung cấp với tất cả các yêu cầu đến

// site này cho đến khi hết hiệu lực.

Response.Cookies.Add(cookie);



241

Chương 7: ASP.NET và Web Form

}

}



private void cmdGetData_Click(object sender, System.EventArgs e) {



lblData.Text = "";



// Kiểm tra thông tin trong view state.

if (ViewState["TestData"] != null) {



DateTime data = (DateTime)ViewState["TestData"];

lblData.Text += "View state data: " +

data.ToString() + "
";



}else {



lblData.Text += "No view state data found.
";

}



// Kiểm tra thông tin trong session state.

if (Session["TestData"] != null) {



DateTime data = (DateTime)Session["TestData"];

lblData.Text += "Session state data: " +

data.ToString() + "
";



}else {



lblData.Text += "No session data found.
";

}



// Kiểm tra thông tin trong cookie tùy biến.

HttpCookie cookie = Request.Cookies["07-02"];

if (cookie != null) {



string cookieData = (string)cookie["TestData"];

lblData.Text += "Cookie data: " +



242

Chương 7: ASP.NET và Web Form



cookieData + "
";



}else {



lblData.Text += "No cookie data found.
";

}

}



private void cmdClear_Click(object sender, System.EventArgs e) {



ViewState["TestData"] = null;

Session["TestData"] = null;

// (Bạn cũng có thể sử dụng Session.Abandon để xóa tất cả

//



thông tin trong session state.)



// Để xóa cookie, bạn phải thay nó thành

// một cookie đã vượt quá ngày hết hiệu lực.

HttpCookie cookie = new HttpCookie("07-02");

cookie.Expires = DateTime.Now.AddDays(-1);

Response.Cookies.Add(cookie);

}

}



Một kiểu trạng thái mà trang này không thể hiện là query string (chuỗi truy vấn). Query string

đòi hỏi một chuyển hướng trang, lý tưởng cho việc chuyển thông tin từ trang này đến trang

khác. Để thiết lập thông tin, bạn phải chuyển hướng người dùng đến một trang mới và thêm

các đối số query string vào cuối URL. Bạn có thể sử dụng phương thức

HttpServerUtility.UrlEncode và UrlDecode để bảo đảm dữ liệu chuỗi là URL hợp lệ.

DateTime now = DateTime.Now;

string data = Server.UrlEncode(now.ToString());

Response.Redirect("newPage.aspx?TestData=" + data);



Để lấy thông tin này, bạn có thể sử dụng tập hợp HttpResponse.QueryString:

// Kiểm tra thông tin trong query string.

if (Request.QueryString["TestData"] != null) {



string data = Request.QueryString["TestData"];

data = Server.UrlDecode(data);



243

Chương 7: ASP.NET và Web Form

lblData.Text += "Found query string data: " + data + "
";

}



Tạo các biến thành viên có trạng thái cho trang



3.





Bạn cần tạo các biến thành viên trong lớp trang và bảo đảm các giá trị của

chúng được giữ lại khi trang được post-back.







Phản ứng với sự kiện Page.PreRender, và ghi tất cả các biến thành viên vào view

state. Phản ứng với sự kiện Page.Load, và lấy tất cả các giá trị của các biến thành

viên từ view state. Phần mã còn lại của bạn giờ đây có thể tương tác với các biến

này mà không phải lo lắng các vấn đề về trạng thái.



ASP.NET cung cấp nhiều cơ chế trạng thái, như đã được mô tả trong mục 7.2. Tuy nhiên, bạn

không thể sử dụng chúng một cách tự động—tất cả đều đòi hỏi một đoạn mã để đặt thông tin

vào và lấy thông tin ra. Bạn có thể thực hiện các công việc này một lần. Khi đó, phần mã còn

lại của bạn có thể tương tác trực tiếp với biến thành viên.

Để cách tiếp cận này có thể làm việc được, bạn cần đọc các giá trị của biến vào đầu mỗi

postback. Sự kiện Page.Load là một chọn lựa lý tưởng cho đoạn mã này vì nó luôn phát sinh

trước bất cứ sự kiện điều khiển nào khác. Bạn có thể sử dụng phương thức thụ lý sự kiện

Page.Load để khởi dựng tất cả các biến. Ngoài ra, bạn cần lưu trữ tất cả các biến trước khi

trang được gửi cho người dùng, sau khi tất cả việc xử lý đã hoàn tất. Trong trường hợp này,

bạn có thể đáp ứng cho sự kiện Page.PreRender, vì sự kiện này phát sinh sau tất cả các

phương thức thụ lý sự kiện khác, chỉ trước khi trang được chuyển thành HTML và gửi cho

client.

Trang ví dụ sau đây trình bày cách duy trì một biến thành viên của trang có tên là

memberValue:

using System;

using System.Web;

using System.Web.UI.WebControls;



public class StatefulMembers : System.Web.UI.Page {



// (Bỏ qua phần mã designer.)



private int memberValue = 0;



private void Page_Load(object sender, System.EventArgs e) {



// Nạp lại tất cả các biến thành viên.

if (ViewState["memberValue"] != null) {

memberValue = (int)ViewState["memberValue"];



244

Chương 7: ASP.NET và Web Form



}

}



private void StatefulMembers_PreRender(object sender,

System.EventArgs e) {



// Lưu tất cả các biến thành viên.

ViewState["memberValue"] = memberValue;



// Hiển thị giá trị.

lblCurrent.Text = memberValue.ToString();

}



// (Các phương thức thụ lý sự kiện khác giờ đây

//



có thể làm việc trực tiếp với memberValue.)



}



4.







Đáp ứng các sự kiện phía client với JavaScript

Bạn cần thêm mã JavaScript vào một Web Form.

Định nghĩa hàm JavaScript trong một chuỗi, và sử dụng phương thức

Page.RegisterClientScriptBlock để chèn hàm JavaScript vào trang được trả về.

Khi đó, bạn có thể thêm các đặc tính điều khiển để gọi các hàm này.



ASP.NET là một mô hình lập trình đa năng. Đáng tiếc, một khi trang đã được trả về dạng

HTML, bạn không thể thực thi bất kỳ mã .NET nào nữa mà không phải phát sinh postback đến

server. Hạn chế này làm giảm tính hiệu quả của các trang web có tính tương tác (chẳng hạn,

xác nhận tính hợp lệ của đầu vào).

Dĩ nhiên, không có lý do gì khiến bạn không thể trộn chức năng JavaScript phía client vào mã

.NET. Mặc dù .NET không chứa bất kỳ giao diện đối tượng nào để tạo JavaScript, nhưng bạn

có thể chèn nó vào trang bằng tay. Có một cách để thực hiện việc này là thiết lập đặc tính điều

khiển. Ví dụ, TextBox dưới đây sẽ hiển thị một MessageBox khi nó mất focus:

TextBox1.Attributes.Add("onBlur",

"alert('The TextBox has lost focus!');");



Thẻ TextBox sẽ được trả về dạng HTML như sau:


onBlur="alert('The text box has lost focus!');"



... />



245

Chương 7: ASP.NET và Web Form



Trong trường hợp này, bạn sử dụng hàm JavaScript alert (nội tại) và sự kiện JavaScript

onBlur (phát sinh khi một điều kiểm mất focus). Hầu hết các phần tử HTML đều hỗ trợ các sự

kiện sau đây:





onFocus xảy ra khi một điều kiểm nhận focus.







onBlur xảy ra khi một điều kiểm mất focus.







onClick xảy ra khi người dùng nhắp vào một điều kiểm.







onChange xảy ra khi người dùng thay đổi giá trị của điều kiểm nào đó.







onMouseOver xảy ra khi người dùng di chuyển con trỏ chuột trên một điều kiểm.



Một cách khác để chèn mã JavaScript là định nghĩa một hàm JavaScript trong một biến chuỗi

rồi lệnh cho ASP.NET chèn nó vào trang web được trả về. Nếu làm theo cách này, bất kỳ điều

kiểm nào cũng có thể gọi hàm để đáp ứng cho một sự kiện JavaScript.

Ví dụ dưới đây sẽ làm rõ kỹ thuật này bằng một trang web gồm một bảng và một bức hình

(xem hình 7.2). Khi người dùng di chuyển chuột lên các ô trong bảng thì hai hàm JavaScript

tùy biến sẽ được sử dụng: một tạo highlight cho ô hiện tại và một gỡ bỏ highlight khỏi ô trước

đó. Ngoài ra, hàm tạo highlight còn thay đổi URL của bức hình tùy thuộc vào cột nào đang

được chọn. Nếu người dùng đưa chuột lên cột thứ nhất, hình mặt cười sẽ được hiển thị. Nếu

người dùng đưa chuột lên cột thứ hai hoặc thứ ba, hình quyển sách với dấu chấm hỏi nhấp

nháy sẽ được hiển thị.

using System;

using System.Web;

using System.Web.UI.WebControls;

public class JavaScriptTest : System.Web.UI.Page {

protected System.Web.UI.WebControls.Table Table1;

protected System.Web.UI.WebControls.Image Image1;

// (Bỏ qua phần mã designer.)

private void Page_Load(object sender, System.EventArgs e) {

// Định nghĩa các hàm JavaScript.

string highlightScript =

"

Tải bản đầy đủ (.pdf) (706 trang)

×