Ngôn ngữ ASP.NET - Trạng thái ASP.NET?
Trạng thái ASP.NET
Trong một chương trình Windows truyền thống, người dùng tương tác với một ứng dụng liên tục chạy. Một phần của bộ nhớ trên máy tính để bàn được phân bổ để lưu trữ các thiết lập hiện hành của thông tin làm việc.
Trong một ứng dụng web, một trang web ASP.NET chuyên nghiệp có thể trông giống như một ứng dụng liên tục chạy, nhưng đó là thực sự chỉ là một ảo ảnh thông minh. Trong một yêu cầu web điển hình, khách hàng kết nối đến máy chủ web và yêu cầu một trang. Khi trang được chuyển giao, kết nối được cắt đứt, và các máy chủ web từ bỏ bất cứ thông tin nó có về khách hàng. Với thời gian người sử dụng nhận được một trang, do mã trang web này đã ngừng chạy nên không có thông tin còn lại trong bộ nhớ của web server.
Thiết kế này có một lợi thế đáng kể. Bởi vì khách hàng cần phải được kết nối chỉ trong một vài giây là nhiều nhất, do đó một máy chủ web có thể xử lý một số lượng lớn các yêu cầu gần như đồng thời. Tuy nhiên, nếu bạn muốn giữ lại thông tin đủ hời gian để nó có thể được sử dụng trên nhiều postbacks hoặc trên nhiều trang, bạn cần phải thực hiện các bước bổ sung.
Xem trạng thái (View State)
Các điều khiển Web Server Controls lưu trữ hầu hết các giá trị của chúng vào view state, khi thuộc tính EnableViewState được thiết lập với giá trị true (mặc định). Thuộc tính ViewState của trang cung cấp thông tin view state hiện hành. Thuộc tính này là một thể hiện của lớp StateBag. StateBag là một từ điển, có mỗi mục được lưu trong một khe "riêng" bằng cách sử dụng một tên chuỗi duy nhất.
Ví dụ, hãy xem xét mã này:
this.ViewState["Counter"] = 1;
Lệnh này đặt giá trị 1 (hay đúng hơn, một số nguyên có chứa giá trị 1) vào trong ViewState. Nếu hiện tại không có mục có tên “Counter”, một mục mới sẽ được thêm tự động. Nếu một mục đã được lưu trữ dưới cái tên “Counter”, nó sẽ được thay thế.
Ví dụ:Tạo một trang Counter.aspx có một Button và Label.
Code trang Counter.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Counter.aspx.cs" Inherits="Counter" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"> <title>Untitled Page</title> </head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="cmdIncrement" runat="server" Text="Increment" OnClick="cmdIncrement_Click" /><br /> <br />
<asp:Label ID="lblCount" runat="server"></asp:Label> </div>
</form>
</body>
</html>
Code behind trang Counter.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Counter : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void cmdIncrement_Click(object sender, EventArgs e)
{
int counter;
if (ViewState["Counter"] == null)
{
counter = 1;
}
else
{
counter = (int)ViewState["Counter"] + 1;
}
ViewState["Counter"] = counter;
lblCount.Text = "Counter: " + counter.ToString();
}
}
Khi thực thi chương trình, đầu tiên chỉ xuất hiện button như hình sau:
Khi click vào button increment, giá trị counter được khởi tạo bằng 1 và gán cho ViewState với tên “Counter” , và hiện giá trị trên trang qua điều khiển nhãn lblCount:
ViewState["Counter"] = counter;
lblCount.Text = "Counter: " + counter.ToString();
Kết quả hiển thị:
Khi click tiếp hai lần trên button, giá trị của biến counter được tăng lên là 3, như vậy giá trị counter được duy trì qua các lần request nhờ vào ViewSate[“Counter”]
Khi xem mã nguồn của trang Counter qua trình duyệt, nội dung trang có chứa khai báo _VIEWSTATE với giá trị lưu dạng mã Base64 (kiểu mã hoá đặc biệt của chuỗi đó và luôn luôn được chấp nhận trong một tài liệu HTML bởi vì nó không bao gồm bất kỳ ký tự mở rộng nào) như sau:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="b1ft5bt8+Us2ecubdBWc9tZuBkJ7DfYiF7INzNyOCq+sneHQu
jl8CsXhrBrghO25WO8/33ldROgie+R81b8ikNgRdb327QiC2cWkMs9Bi
5JU8hFtfASunSAyKKG0cFVPY3B9lOqawU2kfaUau/UjjauLm62Zt2Y3tQOzRkCZla8=" />