程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 庖丁解牛Asp.net3.5控件和組件開發技術系列—頁面狀態機制(一)

庖丁解牛Asp.net3.5控件和組件開發技術系列—頁面狀態機制(一)

編輯:關於ASP.NET

本章內容

6.1 頁面狀態概述

6.2 視圖狀態機制

6.3 控件狀態機制

6.4 視圖狀態和控件狀態的關系

6.5 加密頁面狀態

6.6 清除頁面狀態

6.7 對動態添加控件的視圖狀態分析

6.8 自定義類型轉換器實現高效率序列化

6.9 頁面狀態性能優化策略

6.10 視圖狀態和控件狀態的總結

6.1 頁面狀態概述

在 ASP.NET技術的服務器處理機制中,服務器每處理完客戶端的一個請求就認為任務結束,當客戶端再次請求時,服務器會將其作為一次新的請求處理,即使是相同的客戶端也是如此。也就是說服務器不會保存兩次請求之間的一些前後相接的數據,這對開發人員經常實現一個前後銜接的操作來說就比較麻煩了,比如輸入一些信息到一個文本中,然後提交一個按鈕,很多時候我們要在按鈕提交的服務端事件中處理提交之前的數據和提交按鈕時用戶輸入的最新數據,即想同時得到文本框的舊值和新值,但是服務端不會保存前一個請求的任何信息,那怎麼才能做到這一點呢?

兩次頁面請求之間的數據關聯性,ASP.NET是通過視圖機制實現的,簡單地講,視圖區域信息(ViewState)存儲於頁面上的一個隱藏字段(名為__VIEWSTATE,只是視圖狀態中的值經過哈希計算和壓縮,並且針對Unicode實現進行編碼,其安全性要高於我們自己設置的隱藏域控件),每次需要視圖機制保存的一些信息都存儲在此字段中,每次提交時,它都會以"客戶端到服務端"的形式來回傳遞一次,當處理完成後,最後會以處理後的新結果作為新的ViewState存儲到頁面中的隱藏字段,並與頁面內容一起返回到客戶端。

視圖機制支持很多類型的數據存儲,其中基本類型的有字符串、數字、布爾值、顏色、日期、字節,各種類型的數組等。視圖機制已經對一些如ArrayList和哈希表集合等類型對象進行了優化;除了基本類型視圖狀態視圖機制還支持自定義的類型,由於ViewState數據是作為序列化格式串存儲的,因此默認情況下使用.NET Framework提供的二進制序列化功能來序列化對象,對於一些比較復雜的對象,一般都使用專門的類型轉換器TypeConvert序列化,要比默認.NET提供的二進制序列化節省資源。關於TypeConvert類的實現在第4章已經講了很多例子了,在後面會介紹類型轉換器應用於視圖狀態的說明和示例。

為了提高性能,通常禁用頁面或禁用服務端控件的狀態視圖,有些控件不需要維護其狀態,如Label控件只是顯示文本,而標簽的文本,值不參與回發,可以設置其屬性:EnableViewState=false;

如果整個頁面控件都不需要維持狀態視圖,則可以設置整個頁面的狀態視圖為false:<%@ Page EnableViewState="false"%>。

由於控件內部使用的視圖狀態,這樣會導致視圖狀態失效,甚至會產生致命的問題-控件無法使用。說明一點,禁用視圖是合法的,一個好的控件應該允許視圖狀態在適當情況下被開發人員禁用,並且仍然能夠正確運行。

為了解決這個問題,ASP.NET 2.0開始支持控件狀態機制。控件的狀態數據現在能通過控件狀態而不是視圖狀態被保持,控件狀態是不能夠被禁用的。如果控件中需要保存控件之間的邏輯,比如選項卡控件要記住每次回發時當前已經選中的索引SelectIndex時,就適合使用控件狀態。當然ViewState屬性完全可以滿足此需求,如果視圖狀態被禁用的話,自定義控件就不能正確運行。控件狀態的工作方式與視圖狀態完全一致,並且默認情況下在頁面中它們都是存儲在同一個隱藏域中。

總結一下,一般開發人員主要通過以下三種方式使用ASP.NET視圖:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved