新聞中心
ASP.NET 2.0頁(yè)面狀態(tài)持續(xù)程序

ASP.NET 控件的開(kāi)發(fā)人員利用 ViewState 和控件狀態(tài)來(lái)保持瀏覽器發(fā)出的各請(qǐng)求之間的狀態(tài)信息。通常,該信息作為由頁(yè)面呈現(xiàn)的 HTML 標(biāo)記中的隱藏字段傳送給客戶端。然后,該頁(yè)面狀態(tài)作為下一個(gè)窗體提交的一部分傳回服務(wù)器并還原給控件或頁(yè)面。即使瀏覽器使用 HTTP 協(xié)議(該協(xié)議定義為無(wú)狀態(tài)),但利用臨時(shí)存儲(chǔ)狀態(tài)信息的功能,控件的開(kāi)發(fā)人員能夠輕松地提供更豐富的應(yīng)用程序體驗(yàn)。
ASP.NET 2.0 允許您修改臨時(shí)保持頁(yè)面狀態(tài)的位置和方式。在某些情況下,避免在客戶端與服務(wù)器之間往返傳送數(shù)據(jù)可能更為可取。ASP.NET 2.0 提供的兩個(gè)頁(yè)面狀態(tài)持續(xù)程序分別是 HiddenFieldPageState 持續(xù)程序(我們已提到過(guò))和 SessionPageStatePersister。SessionPageStatePersister 利用與瀏覽器會(huì)話相關(guān)的服務(wù)器會(huì)話存儲(chǔ)數(shù)據(jù)。使用 SessionPageStatePersister 有正反兩個(gè)方面。對(duì)于發(fā)送到(自)瀏覽器的頁(yè)面而言,使用會(huì)話(而非隱藏字段)可以避免其大小的增加。在許多情況中,頁(yè)面狀態(tài)是全部標(biāo)記的一個(gè)重要部分。然而,在會(huì)話中存儲(chǔ)數(shù)據(jù)將占用寶貴的服務(wù)器資源。此外,隱藏字段不像會(huì)話那樣具有相關(guān)的超時(shí)。您可以配置一個(gè)應(yīng)用程序,以便將會(huì)話保持到后端數(shù)據(jù)庫(kù),并避免將負(fù)載直接加到 Web 服務(wù)器。這也將擴(kuò)展至 Web 場(chǎng)方案。
要使用除默認(rèn)持續(xù)程序之外的持續(xù)程序,需要重寫該頁(yè)的 PageStatePersister 屬性,并返回另一個(gè)持續(xù)程序的一個(gè)實(shí)例。首先,下面的一個(gè)簡(jiǎn)單頁(yè)面只使用大量數(shù)字填充一個(gè) ArrayList,然后將它綁定到一個(gè) GridView 控件。
- < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- < script runat="server">
- protected override PageStatePersister PageStatePersister {
- get {
- return new SessionPageStatePersister(this);
- }
- }
- protected override void OnLoad(EventArgs e) {
- base.OnLoad(e);
- if (!IsPostBack) {
- ArrayList list = new ArrayList();
- for (int i = 0; i < 1000; i++)
- {
- list.Add(Convert.ToString(i));
- }
- GridView1.DataSource = list;
- GridView1.DataBind();
- }
- }
- < /script>
- < html >
- < head id="Head1" runat="server">
- < title>Untitled Page< /title>
- < /head>
- < body>
- < form id="form1" runat="server">
- < div>
- < asp:GridView ID="GridView1" runat="server" />
- < asp:Button ID="Button1" runat="server" Text="Submit" />< /div>
- < /form>
- < /body>
- < /html>
當(dāng)查看該頁(yè)面所呈現(xiàn)的 HTML 時(shí),您會(huì)看到一個(gè)用于傳送 ViewState 的較大隱藏字段。
- < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- < html >
- < head>< title>
- Untitled Page
- < /title>< /head>
- < body>
- < form name="form1" method="post" action="default2.aspx" id="form1">
- < div>
- < input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
- value="/wEPDwUKMTQ0MDQzNjk2Ng9kFgICBA9kFgICAQ88KwANAgAPFgYeC18hRGF0YUJv
- dW5kZx4JUGFnZUNvdW50AgEeC18hSXRlbUNvdW50AhRkDBQrAAEWBh4EVHlwZRkrAh4ETmF
- tZQUESXRlbR4JRGF0YUZpZWxkBQEhFgJmD2QWKgIBD2QWAmYPDxYCHgRUZXh0BQEwZGQCAg
- 9kFgJmDw8WAh8GBQExZGQCAw9kFgJmDw8WAh8GBQEyZGQCBA9kFgJmDw8WAh8GBQEzZGQCB
- Q9kFgJmDw8WAh8GBQE0ZGQCBg9kFgJmDw8WAh8GBQE1ZGQCBw9kFgJmDw8WAh8GBQE2ZGQC
- CA9kFgJmDw8WAh8GBQE3ZGQCCQ9kFgJmDw8WAh8GBQE4ZGQCCg9kFgJmDw8WAh8GBQE5ZGQ
- CCw9kFgJmDw8WAh8GBQIxMGRkAgwPZBYCZg8PFgIfBgUCMTFkZAIND2QWAmYPDxYCHwYFAj
- EyZGQCDg9kFgJmDw8WAh8GBQIxM2RkAg8PZBYCZg8PFgIfBgUCMTRkZAIQD2QWAmYPDxYCH
- wYFAjE1ZGQCEQ9kFgJmDw8WAh8GBQIxNmRkAhIPZBYCZg8PFgIfBgUCMTdkZAITD2QWAmYP
- DxYCHwYFAjE4ZGQCFA9kFgJmDw8WAh8GBQIxOWRkAhUPDxYCHgdWaXNpYmxlaGRkGAEFCUd
- yaWRWaWV3MQ9nZMhHZ3iQZp62S8IR8fTJ5ZL42ira" />
- < /div>
- ...
當(dāng)我們向 PageStatePersister 屬性添加重寫并使用內(nèi)置 SessionPageStatePersister 時(shí),該頁(yè)面的行為保持不變,但是用于大量狀態(tài)數(shù)據(jù)的存儲(chǔ)將從隱藏字段轉(zhuǎn)換為會(huì)話狀態(tài)。
- protected override PageStatePersister PageStatePersister
- {
- get
- {
- return new SessionPageStatePersister(this);
- }
- }
請(qǐng)注意,在該頁(yè)面的源代碼中,隱藏字段值要小得多,但并沒(méi)有完全消失。ASP.NET 仍將在頁(yè)面輸出中傳送一些最小的數(shù)據(jù)集。
- < input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
- value="/wEPaA8FDzhjNzkyNTMzNjE1YWEyNxgBBQlHcmlkVmlldzEPZ2QZw
- 44JLJFcglwRl9TiNliE82yAuQ==" />
ASP.NET 2.0頁(yè)面狀態(tài)持續(xù)的其他方案
在某些方案中,您可能只想將與之類似的代碼添加到一個(gè)較小的頁(yè)面集中,因此添加與之類似的簡(jiǎn)單重寫也許是可接受的。當(dāng)您希望一個(gè)完整的應(yīng)用程序或一個(gè)較大的頁(yè)面集擁有該行為時(shí),需要一個(gè)用于控制它的更集中化的方式。有幾種方式可以實(shí)現(xiàn)這一點(diǎn)。我們可以將創(chuàng)建該持續(xù)程序的代碼移動(dòng)到從頁(yè)面繼承的類中:
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- public class PagePersisterBasePage : Page
- {
- public PagePersisterBasePage() {
- }
- protected override PageStatePersister PageStatePersister {
- get {
- return new SessionPageStatePersister(this);
- }
- }
- }
ASP.NET 2.0 使您能夠使用“Inherits”頁(yè)面指令指定頁(yè)面的基類型。然后,ASP.NET 為該頁(yè)面生成的代碼從該基頁(yè)面繼承,而且無(wú)需在每個(gè)頁(yè)面中復(fù)制該代碼。
- < %@ Page Language="C#" Inherits="PagePersisterBasePage" %>
此外,配置選項(xiàng)使我們能夠設(shè)置頁(yè)面位置,以便所有頁(yè)面使用單一的基頁(yè)面類型。在該 web.config 頁(yè)中,我們?cè)O(shè)置了 pageBaseType,并且無(wú)需將 Inherits 屬性添加到任何頁(yè)面來(lái)獲取自定義的 PageStatePersister 行為。
- < ?xml version="1.0"?>
- < configuration>
- < system.web>
- < pages pageBaseType="PagePersisterBasePage" />
- < /system.web>
- < /configuration>
更改 PageStatePersister 并不是一件輕松的事。請(qǐng)仔細(xì)考慮您的應(yīng)用程序和部署。盡管在隱藏字段中往返傳送 ViewState 存在相關(guān)的開(kāi)銷,但是要將狀態(tài)保持在那里,則需要有直接的服務(wù)器資源消耗。通過(guò)前面的示例您可以看到,可以插入自定義持續(xù)程序以便將狀態(tài)存儲(chǔ)在其他地方,例如,后端數(shù)據(jù)庫(kù)或 Web 場(chǎng)共享的狀態(tài)服務(wù)。此外,正如我們所演示的,您可以集中控制應(yīng)用程序的行為,或者按頁(yè)在頁(yè)面上進(jìn)行控制。
以上就是ASP.NET 2.0頁(yè)面狀態(tài)持續(xù)程序的實(shí)現(xiàn)原理。
【編輯推薦】
- ASP.NET 2.0數(shù)據(jù)綁定控件的自定義集合
- 列表控件示例:HeadlineList
- ASP.NET 2.0數(shù)據(jù)綁定機(jī)制:生成控件
- ASP.NET 2.0數(shù)據(jù)綁定的發(fā)展簡(jiǎn)述
- 概述ASP.NET調(diào)用Excel進(jìn)程
文章題目:ASP.NET2.0頁(yè)面狀態(tài)持續(xù):ViewState與控件
網(wǎng)頁(yè)鏈接:http://www.fisionsoft.com.cn/article/dpppghe.html


咨詢
建站咨詢
