This article is currently in the process of being translated into Vietnamese (~98% done).
ViewState
Một phương pháp khác để lưu dữ liệu cho người dùng là ViewState. Như đã mô tả đâu đó trong bài giảng thì ViewState cho phép ASP.NET tạo lại các trường tại mỗi lần gửi lại server, đảm bảo rằng một form không được tự động xóa khi người dùng ấn vào nút submit. Toàn bộ diễn ra tự động, nếu bạn không tắt nó đi nhưng bạn có thể dùng ViewState cho mục đích riêng của bạn. Dù sao cũng nên nhớ là trong khi cookie và session có thể được truy nhập từ các trang của website thì giá trị ViewState không được trao đổi giữa các trang. Đây là một ví dụ đơn giản trong việc dùng ViewState để mang giá trị giữa các lần gửi lại cho server:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ViewState</title>
</head>
<body>
<form id="form1" runat="server">
<asp:TextBox runat="server" id="NameField" />
<asp:Button runat="server" id="SubmitForm" onclick="SubmitForm_Click" text="Submit & set name" />
<asp:Button runat="server" id="RefreshPage" text="Just submit" />
<br /><br />
Name retrieved from ViewState: <asp:Label runat="server" id="NameLabel" />
</form>
</body>
</html>
And the CodeBehind:
using System;
using System.Data;
using System.Web;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(ViewState["NameOfUser"] != null)
NameLabel.Text = ViewState["NameOfUser"].ToString();
else
NameLabel.Text = "Not set yet...";
}
protected void SubmitForm_Click(object sender, EventArgs e)
{
ViewState["NameOfUser"] = NameField.Text;
NameLabel.Text = NameField.Text;
}
}
Thử chạy lại dự án, nhập tên của bạn vào trong textbox và nhấn nút đầu tiên. Tên sẽ được lưu trong ViewState và hiển thị tren Label. Không có điều kỳ diệu nào ở đây. Bây giờ nhần nút lần thứ hai. Không có gì xảy ra, chỉ gửi lại về server.
Như bạn thấy, NameLabel vẫn lưu tên và textbox cũng vậy. Điều đầu tiên là trong khi textbox được lưu bởi ASP.NET. Thử xóa giá trị và nhần nút button. Bạn sẽ thấy là textbox được xóa đi nhưng label vẫn giư tên vì giá trị chúng ta lưu vào ViewState vẫn tồn tại!
ViewState là khá tốt để lưu giá trị đơn giản để dùng trong form, nhưng nếu bạn lưu giá trị dữ liệu phức tạp hơn và truyền từ trang này qua trang khác thì bạn nên dùng cookie hay session như đã mô tả trong chương trước.