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

Các giải pháp lập trình CSharp- P25 ppt

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 (2.62 MB, 10 trang )

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 += "<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> " +
242
Chương 7: ASP.NET và Web Form
cookieData + "<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

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 += "<b>Found query string data:</b> " + data + "<br>";
}
3.
3.
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"];

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.
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!');" />
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 =
"<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';}" +
246
Chương 7: ASP.NET và Web Form
";}" +
"</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);");
}
}
}
247
Chương 7: ASP.NET và Web Form
Hì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.
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>

_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

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

width
—được thiết lập là các giá trị tính theo pixel.
248
Chương 7: ASP.NET và Web Form

Đặ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>";
249
Chương 7: ASP.NET và Web Form
Page.RegisterStartupScript("PopupScript", popupScript);
6.
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);
}

}
250
Chương 7: ASP.NET và Web Form
7.
7.
Cho phép ng i dùng upload fileườ
Cho phép ng 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.)

×