ASP.NET 2.0 là class library để tạo các Web application mà NET Framework 2.0 cung cấp. Trong phần nhập môn về ASP.NET 2.0 chúng tôi xin được giải thích về cấu trúc của ASP.NET 2.0 và những điểm cần lưu ý....
Chú ý khi sử dụng ASP.NET 2.0
Theo cấu trúc đã trình bày cho tới đây, thì trong ASP.NET 2.0 chúng ta có thể tạo Web application bằng phương pháp giống với Visual Basic.
Tuy nhiên, chúng ta thử suy nghĩ về cấu trúc ASP.NET đã trình bày cho đến đây, do nó có một chút không giống với Visual Basic nên có một số chú ý. Sau đây chúng tôi xin nêu ra những điểm cần chú ý đó.
Chú ý đến việc không lưu giữ được giá trị field
Cái được lưu giữ trong ViewState thì chỉ là trạng thái của control. Field add vào form không phải là đối tượng được lưu giữ trong ViewState. Vì thế nên source code dưới đây không đáp ứng mong muốn.
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
// Field không được ViewState bảo lưu
private string name;
private void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
name = "Ojima";
}
// name field không được set trong trường hợp postback,
// vì thế hiển thị dòng chữ "Hello, !".
greetingLabel.Text = string.Format("{0}, {1}!", GetGreetingMessage(),
name);
}
// Get câu chào hỏi khớp với thời gian.
private string GetGreetingMessage()
{
DateTime dt = DateTime.Now;
if (dt.Hour < 10)
{
return "Good Morning";
}
if (dt.Hour > 18)
{
return "Good Night";
}
return "Hello";
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Không lưu giá trị field</title>
</head>
<body>
<form id="form1" runat="server">
<p><asp:Label ID="greetingLabel" runat="server" /></p>
<p><asp:Button ID="refreshButton" Text="update màn hình"
runat="server" /></p>
</form>
</body>
</html>
Vì thế nên, để cho nó chạy đúng theo mong muốn thì ta phải viết như dưới đây và lưu property vào trong ViewState.
// property để access vào giá trị đã được lưu trong ViewState
private string Name
{
get { return (string)ViewState["Name"]; }
set { ViewState["Name"] = value; }
}
private void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Name = "Ojima Ryouji";
}
// Name property được lưu trong ViewState
// nên không hiện dòng chữ "Hello, !"
greetingLabel.Text = string.Format("{0}, {1}!", GetGreetingMessage(), Name);
}
Chú ý sử dụng quá ViewState
Như source code đã nêu ra ban nãy, thông tin được set trong ViewState, sẽ được gửi tới Web browser như một phần của HTML, nó được gửi trả lại như một phần của request. Do consume mất mạng nên không sử dụng ViewState đến phần không cần thiết.
Không cần thiết có nghĩa là thông tin đã được thể hiện từ trước như là control property. Thực tế thì trong source code đưa ra ở trên không có gì sai. Nếu chia ra làm 2 control như source code dưới đây thì không cần thay phần tên, bởi vì không sử dụng ViewState như ban đầu thì vẫn kết thúc được.
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
private void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// Nếu lưu giữ thông tin trong control property
// Thì có thể lưu giữ được thông tin mà không khó khăn gì.
nameLabel.Text = "Ojima";
}
greetingLabel.Text = GetGreetingMessage();
}
private string GetGreetingMessage()
{
// Lược bỏ.
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Không sử dụng ViewState trong trường hợp có thể biểu hiện bằng
control
property.</title>
</head>
<body>
<form id="form1" runat="server">
<p><asp:Label ID="greetingLabel" runat="server" />, <asp:Label
ID="nameLabel" runat="server" />!</p>
<p><asp:Button ID="refreshButton" Text="update màn hình"
runat="server" /></p>
</form>
</body>
</html>
Chú ý tới timing của event của change series.
Web browser gửi thông tin request khi bấm button hiển thị bằngthẻ <input type=”submit”>. Chứ không phải là khi update nội dung text box.
Event của change series không quá event được tạo trong server site dựa vào nội dung của request và ViewState. Chúng ta vẫn phải chú ý tới cho dù phát sinh bằng timing mà user thay đổi thực tế và thậm chí cả khi không phát sinh bằng trật tự mà user đã đổi thực tế.
Tôi sẽ đưa ra ví dụ cụ thể. Các bạn hãy nhìn vào source code dưới đây.
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void tên DropDownList_TextChanged(object sender, EventArgs e)
{
honorificTitleLabel.Text = tên DropDownList.Text;
}
protected void sendtên AndNameButton_Click(object sender, EventArgs e)
{
greetingLabel.Text = "Hello, ";
nameLabel.Text = nameTextBox.Text;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>chú ý đến timing event của change series</title>
</head>
<body>
<form id="form1" runat="server">
<p>
<!--
Nếu thay đổi giới tính, thì gọi DropDownList_TextChanged() method...
Cho dù là định làm như thế, nhưng cũng phải sau khi click button thì mới gọi được
DropDownList_TextChanged() method
Nếu thuộc tính AutoPostBack là true thì ngay lập tức DropDownList_TextChanged()
method được gọi ra, thế nhưng sẽ chỉ sử dụng trong trường hợp đảm bảo phạm vi
mạng rộng.
-->
<asp:DropDownList ID="tên DropDownList" runat="server" OnTextChanged=
"tên DropDownList_TextChanged">
<asp:ListItem Selected="true" Text="-" Value="" />
<asp:ListItem Text="male" Value="Mr." />
<asp:ListItem Text="female" Value="Mrs./Miss" />
</asp:DropDownList>
<asp:TextBox ID="nameTextBox" runat="server" />
<asp:Button ID="sendtên AndNameButton" Text="gửi thông tin về giới
tính và tên" runat="server" OnClick="sendtên AndNameButton_Click" />
</p>
<p>
<asp:Label ID="greetingLabel" runat="server" />
<asp:Label ID="honorificTitleLabel" runat="server" />
<asp:Label ID="nameLabel" runat="server" />
</p>
</form>
</body>
</html>
Mặc dù mong muốn là nếu chọn giới tính, thì nội dung của label tên trang trọng sẽ thay đổi tương ứng cho phù hợp, nhưng đến đây nó lại không hoạt động bình thường. Vì khi click button thì đầu tiên request được gửi đi, Textchange event được tạo ra, và đến lúc đó thì event handler được thực hiện.
Thực ra thì trong ASP.NET 2.0 không có phương pháp khởi động event khi lựa chọn giới tính. Nếu như chọn AutoPostBack property của control đã khởi động event khi thay đổi thành true, và nếu JavaScript được tạo ra và thay đổi thì ngay lập tức sẽ postback.
Thế nhưng, AutoPostBack không phải là phương pháp lúc nào cũng có thể sử dụng được. AutoPostBack chỉ có thể sử dụng trong trường hợp đảm bảo được phạm vi mạng là rộng.
Chúng ta cùng suy nghĩ về trường hợp chọn AutoPostBack là true bằng đường truyền chập chờn. Nếu set AutoPostBack property vào DropDownList của source code ban nãy thì request sẽ được trả về server tại thời điểm chọn giới tính. Thế nhưng do đường truyền chập chờn quá nên không trả về ngay được. Vì thế nên, user lại tiến hành input tên mà màn hình chẳng hề thay đổi. Tuy nhiên khi đang input tên thì đường truyền chập chờn lại được thông nên nó đã trả lại response. Do trả lại response nên Web browser thay màn hình. Trong response đó không có tên mà user đang input dở, vì thế nên tên đang input dở bị mất đi, và user sẽ cảm thấy rất bực mình.
Tóm tắt
ASP.NET 2.0 có khả năng tạo Web application bằng phương pháp phát triển giống với Visual Basic. Có phương pháp làm cho cấu trúc Web application trở lên vô cùng đơn giản, nếu như không hiểu đúng về cấu trúc đó mà lại sử dụng nó thì có khả năng sẽ không hoạt động như mong muốn, không thể có được performance theo mong muốn sử dụng.
Con đường ngắn nhất để hiểu được cấu trúc của ASP.NET 2.0 là hiểu được HTML và HTTP, sau đó thì hiểu xem là ASP.NET 2.0 chạy bằng cấu trúc như thế nào. Để làm được điều ấy, các bạn hãy tận dụng tối đa cuốn sách này.
[Usol VN]