ASP.NET 2.0 頁面狀態持續程式

來源:互聯網
上載者:User
asp.net|程式|頁面

ASP.NET 控制項的開發人員利用 ViewState 和控制項狀態來保持瀏覽器發出的各請求之間的狀態資訊。通常,該資訊作為由頁面呈現的 HTML 標籤中的隱藏欄位傳送給用戶端。然後,該頁面狀態作為下一個表單提交的一部分傳回伺服器並還原給控制項或頁面。即使瀏覽器使用 HTTP 協議(該協議定義為無狀態),但利用臨時儲存狀態資訊的功能,控制項的開發人員能夠輕鬆地提供更豐富的應用程式體驗。

ASP.NET 2.0 允許您修改臨時保持頁面狀態的位置和方式。在某些情況下,避免在用戶端與伺服器之間往返傳送資料可能更為可取。ASP.NET 2.0 提供的兩個頁面狀態持續程式分別是 HiddenFieldPageState 持續程式(我們已提到過)和 SessionPageStatePersister。SessionPageStatePersister 利用與瀏覽器會話相關的伺服器會話儲存資料。使用 SessionPageStatePersister 有正反兩個方面。對於發送到(自)瀏覽器的頁面而言,使用會話(而非隱藏欄位)可以避免其大小的增加。在許多情況中,頁面狀態是全部標記的一個重要部分。然而,在會話中儲存資料將佔用寶貴的伺服器資源。此外,隱藏欄位不像會話那樣具有相關的逾時。您可以配置一個應用程式,以便將會話保持到後端資料庫,並避免將負載直接加到 Web 服務器。這也將擴充至 Web 場方案。

要使用除預設持續程式之外的持續程式,需要重寫該頁的 PageStatePersister 屬性,並返回另一個持續程式的一個執行個體。首先,下面的一個簡單頁面只使用大量數字填充一個 ArrayList,然後將它綁定到一個 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 xmlns="http://www.w3.org/1999/xhtml" >
<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>

當查看該頁面所呈現的 HTML 時,您會看到一個用於傳送 ViewState 的較大隱藏欄位。

<!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><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>
...

當我們向 PageStatePersister 屬性添加重寫並使用內建 SessionPageStatePersister 時,該頁面的行為保持不變,但是用於大量狀態資料的儲存將從隱藏欄位轉換為工作階段狀態。

    protected override PageStatePersister PageStatePersister
    {
        get
        {
            return new SessionPageStatePersister(this);
        }
    }

請注意,在該頁面的原始碼中,隱藏欄位值要小得多,但並沒有完全消失。ASP.NET 仍將在頁面輸出中傳送一些最小的資料集。

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPaA8FDzhjNzkyNTMzNjE1YWEyNxgBBQlHcmlkVmlldzEPZ2QZw
44JLJFcglwRl9TiNliE82yAuQ==" />

在某些方案中,您可能只想將與之類似的代碼添加到一個較小的頁面集中,因此添加與之類似的簡單重寫也許是可接受的。當您希望一個完整的應用程式或一個較大的頁面集擁有該行為時,需要一個用於控制它的更集中化的方式。有幾種方式可以實現這一點。我們可以將建立該持續程式的代碼移動到從頁面繼承的類中:

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”頁面指令指定頁面的基底類型。然後,ASP.NET 為該頁面產生的程式碼從該基頁面繼承,而且無需在每個頁面中複製該代碼。

<%@ Page Language="C#"  Inherits="PagePersisterBasePage" %>

此外,配置選項使我們能夠設定頁面位置,以便所有頁面使用單一的基頁面類型。在該 web.config 頁中,我們設定了 pageBaseType,並且無需將 Inherits 屬性添加到任何頁面來擷取自訂的 PageStatePersister 行為。

<?xml version="1.0"?>
<configuration>
   <system.web>
    <pages pageBaseType="PagePersisterBasePage" />
   </system.web>
</configuration>

更改 PageStatePersister 並不是一件輕鬆的事。請仔細考慮您的應用程式和部署。儘管在隱藏欄位中往返傳送 ViewState 存在相關的開銷,但是要將狀態保持在那裡,則需要有直接的伺服器資源消耗。通過前面的樣本您可以看到,可以插入自訂持續程式以便將狀態儲存在其他地方,例如,後端資料庫或 Web 場共用的狀態服務。此外,正如我們所示範的,您可以集中控制應用程式的行為,或者按頁在頁面上進行控制。

 



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.