Để 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.. Định nghĩa hàm JavaScript trong một chuỗi, và sử dụng phương
Trang 1}
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 += "<b>View state data:</b> " +
data.ToString() + "<br>";
}else {
lblData.Text += "No view state data found.<br>";
}
// Kiểm tra thông tin trong session state
if (Session["TestData"] != null) {
DateTime data = (DateTime)Session["TestData"];
lblData.Text += "<b>Session state data:</b> " +
data.ToString() + "<br>";
}else {
lblData.Text += "No session data found.<br>";
}
// 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 += "<b>Cookie data:</b> " +
Trang 2cookieData + "<br>";
}else {
lblData.Text += "No cookie data found.<br>";
}
}
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);
Trang 33. T o các bi n thành viên có tr ng thái cho trang T o các bi n thành viên có tr ng thái cho trang ạ ạ ế ế ạ ạ
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"];
Trang 4}
}
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 Đá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:
<input name="TextBox1" type="text" id="TextBox1"
onBlur="alert('The text box has lost focus!');" />
Trang 5onBlur (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 =
"<script language=JavaScript> " +
"function HighlightCell(cell) {" +
"cell.bgColor = '#C0C0C0';" +
"if (cell.cellIndex == 0) {" +
"document.Form1.Image1.src='happy_animation.gif';}" +
"else {" +
"document.Form1.Image1.src='question_animation.gif';}" +
Trang 6";}" +
"</script>";
string unhighlightScript =
"<script language=JavaScript> " +
"function UnHighlightCell(cell) {" +
"cell.bgColor = '#FFFFFF';" +
"}" +
"</script>";
// Chèn hàm JavaScript vào trang (nó sẽ xuất hiện
// ngay sau thẻ <form runat=server>)
// Chú ý rằng mỗi khối kịch bản được kết hợp với một tên chuỗi // Điều này cho phép nhiều điều kiểm đăng ký cùng khối kịch bản, // trong khi vẫn bảo đảm nó sẽ được trả về chỉ một lần
// trong trang cuối cùng
if (!this.IsClientScriptBlockRegistered("Highlight")) {
Page.RegisterClientScriptBlock("Highlight", highlightScript); }
if (!this.IsClientScriptBlockRegistered("UnHighlight")) {
Page.RegisterClientScriptBlock("UnHighlight",
unhighlightScript);
}
// Thiết lập đặc tính cho mỗi ô trong bảng
foreach (TableRow row in Table1.Rows) {
foreach (TableCell cell in row.Cells) {
cell.Attributes.Add("onMouseOver", "HighlightCell(this);"); cell.Attributes.Add("onMouseOut", "UnHighlightCell(this);"); }
}
}
Trang 7Hình 7.2 Hàm JavaScript tạo highlight cho ô hiện tại
Bạn cần hiểu rõ tính bảo mật của JavaScript Tất cả mã JavaScript được trả về
trực tiếp trong trang HTML, và người dùng có thể xem xét nó Do đó, bạn đừng bao giờ đặt bất kỳ giải thuật hoặc thông tin bí mật nào vào mã JavaScript Ngoài
ra, bạn sử dụng JavaScript để kiểm tra tính hợp lệ chỉ là một tiểu xảo, không
phải là một phương cách để ngăn các hành động không hợp lệ, bởi người dùng
có thể vô hiệu hoặc phá hỏng JavaScript trong trình duyệt của họ.
5. Hi n th c a s pop-up v i JavaScript Hi n th c a s pop-up v i JavaScript ể ể ị ử ổ ị ử ổ ớ ớ
Bạn cần hiển thị một cửa sổ pop-up để đáp ứng cho một hành động của người
dùng.
Đăng ký một hàm JavaScript (hoặc thêm một đặc tính điều khiển sự kiện), và sử
dụng hàm JavaScript window.open.
Vì tất cả mã ASP.NET thực thi trên server nên không có cách nào để hiển thị một cửa sổ mới
từ mã C# Bạn có thể thêm siêu liên kết vào một trang sao cho nó tự động mở trong một cửa
sổ mới bằng cách thiết lập đặc tính target của thẻ <a> là _blank, nhưng cách này vẫn không cung cấp khả năng điều khiển kích thước hoặc kiểu của cửa sổ.
Giải pháp để mở cửa sổ pop-up là sử dụng mã JavaScript Cửa sổ pop-up có thể là một trang HTML, một trang ASP.NET, một file hình, hoặc bất kỳ kiểu tài nguyên nào có thể được mở
trong trình duyệt của client Để mở một cửa sổ pop-up, bạn cần sử dụng hàm window.open và chỉ định ba thông số Thông số thứ nhất là liên kết đến trang mới, thông số thứ hai là tên frame của cửa sổ, và thông số thứ ba là một chuỗi các đặc tính (phân cách bằng dấu phẩy) cấu hình kiểu và kích thước của cửa sổ pop-up Các đặc tính này bao gồm:
• Đặc tính height và width—được thiết lập là các giá trị tính theo pixel.
Trang 8• Đặc tính toolbar, menubar, và scrollbars—có thể được thiết lập là yes hay no, tùy thuộc vào bạn muốn hiển thị các phần tử này hay không.
• Đặc tính resizable—có thể được thiết lập là yes hay no, tùy thuộc vào bạn muốn đường viền cửa sổ là cố định hay có thể thay đổi kích thước được.
Ví dụ dưới đây trình bày cách mở một trang ASP.NET thứ hai trong một cửa sổ pop-up khi
người dùng nhắp vào một Button.
Hình 7.3 Hiển thị cửa sổ pop-up
Bạn cần thêm đoạn mã này vào phương thức thụ lý sự kiện Page.Load.
string popupScript = "window.open('PopUp.aspx', " +
"'CustomPopUp', " +
"'width=200, height=200, menubar=yes, resizable=no')";
cmdPopUp.Attributes.Add("onClick", popupScript);
Và đây là đoạn mã (trong phương thức thụ lý sự kiện Page.Load) dùng để hiển thị cửa sổ
pop-up một cách tự động khi trang được hiển thị:
string popupScript = "<script language='javascript'>" +
"window.open('PopUp.aspx', " +
"'CustomPopUp', " +
"'width=200, height=200, menubar=yes, resizable=no')" +
"</script>";
Trang 9Page.RegisterStartupScript("PopupScript", popupScript);
6. Thi t l p focus cho đi u ki m Thi t l p focus cho đi u ki m ế ậ ế ậ ề ề ể ể
Bạn cần chỉ định điều kiểm nào sẽ nhận focus khi trang được trả về và gửi cho
người dùng.
Tạo một lệnh JavaScript để thiết lập focus, và thêm nó vào trang bằng phương
thức Page.RegisterStartupScript.
Điều kiểm web ASP.NET không cung cấp cách để thiết lập focus cho điều kiểm, mà chỉ cung
cấp thuộc tính TabIndex để thiết lập thứ tự tab Nhưng thuộc tính này chỉ áp dụng cho
Microsoft Internet Explorer và không thể được sử dụng để thiết lập focus cho điều kiểm do bạn chọn Để vượt qua hạn chế này, bạn cần sử dụng đến mã JavaScript.
Phương thức dưới đây sẽ thực hiện công việc này Nó nhận vào một tham chiếu đến bất kỳ đối tượng điều kiểm nào, thu lấy ClientID kết giao (mã JavaScript phải sử dụng ID này để tìm đến điều kiểm), rồi tạo dựng và đăng ký kịch bản để thiết lập focus.
private void SetFocus(Control ctrl) {
// Định nghĩa lệnh JavaScript
// Di chuyển focus đến điều kiểm bạn muốn
string setFocus = "<script language='javascript'>" +
"document.getElementById('" + ctrl.ClientID +
"').focus();</script>";
// Thêm mã JavaScript vào trang
this.RegisterStartupScript("SetFocus", setFocus);
}
Nếu thêm phương thức này vào một Web Form, bạn có thể gọi SetFocus khi cần Ví dụ dưới
đây sẽ thiết lập focus khi trang nạp lần đầu tiên:
private void Page_Load(object sender,
System.EventArgs e) {
if (!this.IsPostBack) {
// Chuyển focus đến một TextBox cụ thể
SetFocus(TextBox1);
}
}
Trang 107. Cho phép ng Cho phép ng ườ ườ i dùng upload file i dùng upload file
Bạn cần tạo một trang cho phép người dùng upload một file.
Sử dụng điều kiểm HtmlInputFile, thiết lập kiểu mã hóa của form là
multipart/form-data, và lưu file bằng phương thức HtmlInputFile.PostedFile SaveAs.
Vì ASP.NET thực thi trên server nên không có cách nào để truy xuất các tài nguyên trên máy client, bao gồm file Tuy nhiên, bạn có thể sử dụng điều kiểm System.Web.UI HtmlControls.HtmlInputFile để cho phép người dùng upload một file Điều kiểm này trả về
phần tử HTML <input type="file">, hiển thị một nút Browse và một hộp chứa tên file
Người dùng nhắp vào nút Browse và chọn một file Bước này diễn ra một cách tự động và
không đòi hỏi bất kỳ đoạn mã tùy biến nào Sau đó, người dùng phải nhắp vào một nút khác (bạn phải tạo nút này) để bắt đầu quá trình upload.
Để tạo một trang cho phép upload file, bạn cần thực hiện các bước sau đây:
• Thiết lập kiểu mã hóa của form là multipart/form-data Để thực hiện thay đổi này, tìm thẻ <form> trong file aspx và điều chỉnh như sau:
<form id="Form1" enctype="multipart/form-data" runat="server">
• Thêm điều kiểm HtmlInputFile vào trang Trong Microsoft Visual Studio NET, bạn sẽ tìm thấy điều kiểm này dưới thẻ HTML của hộp công cụ, với tên là File Field Một khi
đã thêm điều kiểm này, bạn nhắp phải vào nó và chọn Run As Server Control để tạo thẻ
<input type="file" runat="server">
• Thêm một Button khác để bắt đầu quá trình chuyển giao file đã được chỉ định (bằng phương thức HtmlInputFile.PostedFile.SaveAs).
Dưới đây là phần mã cho trang upload file:
using System;
using System.Web;
using System.Web.UI.WebControls;
using System.IO;
public class UploadPage : System.Web.UI.Page {
protected System.Web.UI.WebControls.Label lblInfo;
protected System.Web.UI.WebControls.Button cmdUpload;
protected System.Web.UI.HtmlControls.HtmlInputFile FileInput;
// (Bỏ qua phần mã designer.)