Tìm hiểu về ViewState trong website Asp.Net

ViewState là gì ?

ViewState là một kĩ thuật giúp bạn để giữ lại trạng thái của trang mặc dù trang được Postbacks.Thường thì khi một trang được postback thì mọi giá trị trên trang sẽ không được giữ lại.

Để giữ lại giá trị trên trang thì bạn phải sử dụng ViewState để lưu lại giá trị đó. Các giá trị lưu trong ViewState sẽ được lần lượt lưu trữ và gửi tới client browser theo giá trị của một hidden form input. Khi bạn xem source (Trên trình duyệt của mình) của một trang sử dụng ViewState, bạn sẽ thấy hidden viewstate input được khai báo có dạng như sau:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTM1ODM3Nj......." /> 
 
Trường hidden sẽ chứa các giá trị viewstate cho tất cả các controls trên trang. Đây là một phần quan trọng của viewstate mà bạn cần nắm vững.
 
ViewState theo mặc định là sẽ được gửi tới client browser sau đó sẽ trở lại server trên form của một hidden input control trên trang của bạn, Việc lưu trữ một lượng lớn dữ liệu trong viewsate có thể làm tăng kích cỡ trang web của bạn, và có thể có ảnh hưởng đến việc thực thi nó nữa.
 
Để Disable ViewState cho một control, bạn chỉ cần thiết lập thuộc tính EnableViewState là false. Khi ViewState được diasbled cho một control, nó sẽ tự động disabled cho các controls khác là con của control này.
Ví dụ:
<asp:Label ID="lblRequestCount" runat="server" EnableViewState="false"></asp:Label>
Điều này không có nghĩa là bạn nên tránh sử dụng viewstate mà để bạn có thể kiểm soát dữ liệu được lưu và sự ảnh hưởng của nó tới toàn trang.
ViewState có ưu điểm và cũng có nhược điểm. Nhưng bạn hoàn toàn có thể kiểm soát được nó.
 
 

Tìm hiểu hoạt động của ViewState ?

Hầu như tất cả các công cụ trong ASP.NET điều có sử dụng ViewState và thường ở chế độ mặc định là Enable. Chúng ta có thể tắt nó ở các Control không cần thiết (như các Control chỉ hiển thị không truyền tham số) việc này làm nhẹ website rất nhiều.
 
Nhưng nếu các Control bắt buộc phải bật ViewState như TextBox thì sao ?
Chúng ta sẽ tìm hiểu và phân tích sâu một xíu:
 
Các ViewState từ phía clien (ví dụ một Textbox) truyền dữ liệu lên Server, ViewState được lưu trữ trong lĩnh vực ẩn với ID tên là __VIEWSTATE. Thông thường, các thông tin được lưu trữ ViewState trông như dưới đây:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="GRkPCsABQACBWRkZGYC/////w9kMFkwydi/bMqhtfuYCDm8Lfp1mMU=" />
Chúng ta nhìn chuỗi giá trị, hình như nó được mã hóa, thật sự là chuỗi mã hóa Base64 và nó nhưng không phải là một chuỗi mã hóa. Vì vậy, nó có thể dễ dàng giải mã.
 
Những lý do chính để làm cho nó mã hóa Base64 như sau:
  • Base64 làm cho một chuỗi phù hợp với HTTP chuyển
  • Nó làm cho chúng ta một chút khó khăn hơn để đọc, và người ta thường bị lẫn lộn rằng đây là một chuỗi mã hóa.
 
Để giải mã chuỗi bằng cách sử dụng tool online ViewState Decoder  hoặc download một phần mềm nhỏ tại đây. Đó là cách làm việc của một ViewState, Theo mặc định, ViewState là chuỗi tuần tự vào một cơ sở mã hoá Base64. Nên việc bị chặn dữ liệu và đọc chúng là việc khá đơn giản.
 

Mã hóa ViewState

Chúng ta có 2 kiểu mã hóa là :
 
1. Mã hóa ViewState theo từng trang, trang nào thấy nhạy cảm thì mã hóa không thì thôi:
Cách làm: Ở phần khai báo trang chúng ta thêm những dòng sau: EnableViewStateMAC=true và ViewStateEncryptionMode=”Always”
<%@ Page Title="" Language="C#" MasterPageFile="~/skin_3_cot.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"  
EnableViewStateMAC=true ViewStateEncryptionMode=”Always” 
%>  

2. Cấu hình cho toàn bộ site chúng ta cấu hình 2 dòng trên trong file web.config

Mô hình hoạt động sau khi mở chế độ mã hóa

ViewStateEncryptionMode có 3 chế độ:
  1. Always: Luôn luôn bật cho toàn site
  2. Auto: Tùy thuộc vào cấu hình của từng trang
  3. Never: không bao giờ mã hóa

Kết luận

+ Chỉ với vài dòng cấu hình đơn giản nhưng website của chúng ta cũng đã an toàn hơn nhiều so với việc để mặc định.
+ Việc nắm vững sự điều khiển ViewState của các Control trong ASP.NET giúp website bạn hoạt động nhanh chống và hiệu quả hơn. 
+ Chúng ta nên tắt bớt các ViewState của các Control không cần thiết để site có thể load nhanh hơn.
 

Related Post


Hiển thị ảnh xem trước khi upload trong Asp.Net
Thursday, October 3, 2013
Hiển thị ảnh xem trước do người dùng lựa chọn trước khi upload là một chức năng rất hay, thứ nhất nó thân thiện với người dùng, thứ hai đảm bảo không nhầm lẫn khi cập nhật hình ảnh. Trong bài này, ta sẽ áp dụng tính năng tiên tiến của HTML5 để thực hiện việc này
Rewrite Url website với Asp.net Routing
Sunday, September 29, 2013
Rewrite Url không phải là một khái niệm xa lạ đối với những lập trình viên web, ngoài vấn đề về bảo mật, nó còn giúp tạo được một đường dẫn thân thiện với người dùng và SEO hơn. Những năm trước đây, khi phát triên web trên nền tảng .Net 2.0 và 3.5, tôi hay sử dụng một dll có tên UrlRewritingNet.UrlRewriter để hỗ trợ việc này. Tuy nhiên đến khi nâng cấp lên .Net 4.5 tôi nhận thấy một vấn đề là Urlwrite theo cách cũ đã không còn hoạt động, lên google lục lọi thì mới biết dll này hiện tại chỉ hỗ trợ với .Net 1.1 đến 4.0.... và sử dụng Asp.net Routing là một phương pháp khá hay để giải quyết vấn đề này.
Search

Đăng ký nhận bài mới


Category

Blog Archive