search
HomeDatabaseMysql TutorialViewState机制由浅入深2
ViewState机制由浅入深2Jun 07, 2016 pm 03:48 PM
archivehttpviewstatemechanism

http://archive.cnblogs.com/a/1122213/ 2.2.2 Pair 类及ViewState的存储 Page 及所有控件的ViewState、ControlState都是存储在Pair类的实例中,了解Pair类及ViewState如何存储在Pair类中很重要。Pair定义的System.Web.UI中具体定义如下: public sealed cla

http://archive.cnblogs.com/a/1122213/


2.2.2   Pair类及ViewState的存储

Page及所有控件的ViewState、ControlState都是存储在Pair类的实例中,了解Pair类及ViewState如何存储在Pair类中很重要。Pair定义的System.Web.UI中具体定义如下:

public sealed class Pair

{

    public object First;

    public object Second;

    public Pair();

    public Pair(object x, object y);

}

可以看出Pair类是用作存储两个相关对象的基本结构。Pair是一个工具类,使用它很容易形成一个树的数据结构。将__VIEWSTATE反序列化后就是一个Pair对象。这个对象即保存了控件之间的父子关系,也保存了ViewState信息。ViewState中的Key/Value对被转换为一个ArrayList对象保存在Pair对象中。下面我们来看看它是如何存储的。

ViewState机制由浅入深2
图3

图3是对Pair的一种图式表示方式,左边表示First对象,右边表示Second对象,根据这种图式方式,图4是利用Pair对象存储ViewState的结构,对于ControlState没有进行具体的展开。从savedState(Pair)开始采用了递归的存储方式,将所有控件的ViewState及关系存储起来,在Pair对象的First中存储ViewState数据,在Second中存储子控件的信息。

ViewState机制由浅入深2图4

2.2.3   Control中的处理

Page类继承自Control类,在实现ViewState机制的时候Page类中主要是涉及序列化和反序列化的工作,ViewState的保存、装载等功能都在Control类中实现由Page类来继承,
控件也都继承自Control类,下面对Control类中和ViewState机制相关的属性、方法进行介绍。
<strong>1)<span>     </span>ViewState属性</strong>
ViewState是Page及控件的一个属性,这个属性并不是在Page或控件中定义,它定义在System.Web.UI.Control类中。它的声明如下:

protected virtual StateBag ViewState{get}

由于所有服务器端的控件,用户自定义控件,及Page类都是继承自Control类,所以它们都会都具有一个protected的ViewState属性。这个ViewState属性在ViewState机制中
很重要,它用来存储控件需要记忆的一些数据。这些数据主要有两类,一类是需要记忆的控件的属性。另外一类是我们想利用ViewState机制来记住的一些数据,
比如我们在Web窗体中写如下的代码:

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!this.IsPostBack)

        {

            this.ViewState["Test"] = 0;

        }

        else

        {

            this.ViewState["Test"]=int.Parse(this.ViewState["Test"].ToString()) + 1;

        }

<span>    }</span>
因为我们创建的Web窗体都是继承自Page类,所以在Web窗体中能否访问Page类的protected的ViewState属性。我们可以通过ViewState属性利用ViewState机制,让它帮助我们
记住一些信息。
ViewState属性的主要作用还是用来记住一些控件的属性值。ViewState属性和控件的其他属性有什么样的联系,才能够利用ViewState属性来记住他们呢?下面用Button类
的Text属性举例来说明,Text属性和ViewState属性是什么关系。Button.Text的定义如下:

public string Text

{

    get

    {

        string str = (string) this.ViewState["Text"];

        if (str != null)

        {

            return str;

        }

        return string.Empty;

<span>    }</span>

    set

    {

        this.ViewState["Text"] = value;

<span>    }</span>

}

通过上面的代码我们可以看出Button.Text属性的值实际上和ViewState中Key为“Text”的Value是关联的。当然Button类的其他属性也是类似的方式,
只是对应ViewState中Key不同而已。这样只要ViewState的值能够被记忆,那么Button类的属性也就能够被记忆住了。记忆ViewState的方法就是在Page. SaveAllState中
将所有控件的ViewState属性生成一个对象(这是一个特殊的对象,它是一个树状态的存储了所有控件的ViewState属性),然后将这个对象序列化为字符串,发送到客户端。
在下次请求的时候,将这个字符串发送给服务器,在Page.LoadAllState中将这个字符串反序列化为一个对象,将这个对象中存储的各个控件的ViewState属性,
加载给各个控件的ViewState属性。当我们访问控件的属性的时候就实现了对控件属性的记忆,之前设置的控件属性没有丢失。
<strong>2)<span>     </span>LoadViewStateByID属性</strong>

LoadViewStateByID的声明如下:

protected bool LoadViewStateByID{get}

LoadViewStateByID获取一个值,该值指示控件是否通过ID方式加载其视图状态。默认情况下是通过索引方式加载视图状态,索引方式是依赖子控件在父控件的Controls集合中位置。ID方式会根据ID查找控件,效率比较低些,但是有些情形必须使用这种方式比如延迟创建子控件时。

<strong>3)<span>     </span>EnableViewState属性</strong>
EnableViewState是一个bool类型的属性,来决定当前控件的ViewState机制是否可用。其声明如下:

public virtual bool EnableViewState{get,set}

<strong>4)<span>     </span>LoadViewStateRecursive</strong>
LoadViewStateRecursive的声明如下:
<span>internal</span><span>void</span><span> LoadViewStateRecursive(<span>object</span> savedState)</span>
Page.LoadAllState中调用Control.LoadViewStateRecursive,传入的参数savedState是一个Pair类型的对象,Pair.Fisrt中保存当前控件的ViewState,
Pair.Second中保存子控件的ViewState。对于EnableViewState为true时,先通过调用Control.LoadViewState(savedState.First)装载当前控件的ViewState。
之后根据LoadViewStateByID<span>属性,装载子控件的ViewState。</span>如果LoadViewStateByID<span>属性为true调用Control.</span>LoadChildViewStateByID(savedState.Second)<span>,否则调用</span>
<span>Control.</span>LoadChildViewStateByIndex(savedState.Second)。savedState.Second是一个ArrayList类型的对象。

Control.LoadViewState的声明如下:

<span>protected</span><span> <span>virtual</span> void LoadViewState(object savedState)</span>
在Control.LoadViewState中并没有自己实现装载当前控件的ViewState,而是通过ViewState.LoadViewState(savedState)来实现,下面会介绍StateBag的LoadViewState方法。
LoadChildViewStateByID<span>的声明如下:</span>
<span>internal</span><span> void LoadChildViewStateByID(<span>ArrayList</span> childState)</span>
参数childState是ArrayList类型,childState中存储了当前控件的所有子控件的信息。它的格式是首先是一个控件的ID,其后是这个控件的Pair对象。对childState进行循环
,循环中取得控件的ID,根据ID找到控件调用这个控件的LoadViewStateRecursive方法。示意代码如下:

for (int i = 0; i 2)

    {

        string id = (string) childState[i];

        object savedState = childState[i + 1];

       Control control = this.FindControl(id);

        control.LoadViewStateRecursive(savedState);

<span>    }</span>

<span>LoadChildViewStateByIndex</span><span>的声明如下:</span>

internal void LoadChildViewStateByIndex(ArrayList childState)

childState的存储格式是首先是一个控件的索引,其后是这个控件的Pair对象。根据索引访问访问这个控件,调用其LoadViewStateRecursive方法,示例代码如下:

    for (int i = 0; i 2)

    {

        int num4 = (int) childState[i];

        object savedState = childState[i + 1];

        controls[num4].LoadViewStateRecursive(savedState);

     }

<strong>5)<span>     </span>LoadViewState</strong>

LoadViewState中直接调用ViewState的LoadViewState方法进行ViewState的装载,示意代码如下:

this.ViewState.LoadViewState(savedState);

<strong>6)<span>     </span>SaveViewStateRecursive</strong>
SaveViewStateRecursive的声明如下:

internal object SaveViewStateRecursive()

对于EnableViewState为true时,先调用Control.SaveViewState返回一个包含当前控件的ViewState信息的ArrayList类型对象x。之后对子控件进行递归处理获得一个ArrayList类型的对象z。它的格式是ID(String),savedState(Pair)或者Index(int)savedState(Pair)。最后创建一个Pair对象Pair(x, z)。示意代码如下:

object x = this.SaveViewState();

ArrayList z = null;

ControlCollection controls = this._occasionalFields.Controls;

int count = controls.Count;

bool loadViewStateByID = this.LoadViewStateByID;

for (int i = 0; i

{

          Control control = controls[i];

          object obj4 = control.SaveViewStateRecursive();

          if (loadViewStateByID)

                    z.Add(control.ID);

          else

                              z.Add(i);

          z.Add(obj4);

}

return new Pair(x, z);

<strong>7)<span>     </span>SaveViewState</strong>

SaveViewState中直接调用ViewState的SaveViewState方法进行ViewState的保存,示意代码如下:

return this.ViewState.SaveViewState();

<strong>8)<span>     </span>TrackViewState</strong>

在Control.InitRecursive中会调用Control.TrackViewState,因为Control.InitRecursive是被递归调用的,所以每个控件的TrackViewState都会在初始化阶段被调用到。Control.TrackViewState中之间调用ViewState的TrackViewState方法,示意代码如下:

this.ViewState.TrackViewState();



Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
JAVA发送HTTP请求的方式有哪些JAVA发送HTTP请求的方式有哪些Apr 15, 2023 am 09:04 AM

1.HttpURLConnection使用JDK原生提供的net,无需其他jar包,代码如下:importcom.alibaba.fastjson.JSON;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.net.HttpURLConnection;

viewstate是什么viewstate是什么Oct 09, 2023 pm 02:46 PM

viewstate是ASP.NET中的一项技术,用于在Web应用程序的页面间保存和恢复数据。ViewState的工作原理是将页面上的控件状态和数据序列化为一个字符串,并存储在隐藏字段中。这个隐藏字段在每个页面的HTML表单中都存在,被提交到服务器。ViewState的使用非常简单,只需在页面的属性中设置EnableViewState为true即可。

面试官问:一个TCP连接可以发多少个HTTP请求?面试官问:一个TCP连接可以发多少个HTTP请求?Feb 22, 2023 pm 12:00 PM

曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?

如何在 Golang 中优雅地关闭 HTTP 服务器如何在 Golang 中优雅地关闭 HTTP 服务器Mar 22, 2023 pm 02:23 PM

​Golang (又称为 Go) 是一门相对比较年轻的编程语言,它被广泛应用于后端服务和 API 的开发中。而 HTTP 是一个常用的协议,很多 Golang 开发人员会选择使用 Golang 中自带的 HTTP 包来进行 HTTP 服务器的开发。然而,当我们需要关闭 HTTP 服务器时会遇到一些问题。在本文中,我们将介绍如何在 Golang 中优雅地关闭 HTTP 服务器。

深入了解CSS布局重新计算和渲染的机制深入了解CSS布局重新计算和渲染的机制Jan 26, 2024 am 09:11 AM

CSS回流(reflow)和重绘(repaint)是网页性能优化中非常重要的概念。在开发网页时,了解这两个概念的工作原理,可以帮助我们提高网页的响应速度和用户体验。本文将深入探讨CSS回流和重绘的机制,并提供具体的代码示例。一、CSS回流(reflow)是什么?当DOM结构中的元素发生可视性、尺寸或位置改变时,浏览器需要重新计算并应用CSS样式,然后重新布局

一文分析go中判断请求是http还是https一文分析go中判断请求是http还是httpsMar 02, 2023 pm 05:11 PM

本篇文章给大家带来了关于go的相关知识,其中主要给大家聊聊golang中判断请求是http还是https(用于获取当前访问地址),感兴趣的朋友一起来看一下吧,希望对大家有帮助。

深入探讨Golang变量的存储位置和机制深入探讨Golang变量的存储位置和机制Feb 28, 2024 pm 09:45 PM

标题:深入探讨Golang变量的存储位置和机制随着Go语言(Golang)在云计算、大数据和人工智能领域的应用逐渐增多,深入了解Golang变量的存储位置和机制变得尤为重要。在本文中,我们将详细探讨Golang中变量的内存分配、存储位置以及相关的机制。通过具体代码示例,帮助读者更好地理解Golang变量在内存中是如何存储和管理的。1.Golang变量的内存

Yii框架中的ViewState:实现数据保护Yii框架中的ViewState:实现数据保护Jun 21, 2023 am 09:02 AM

ViewState是ASP.NET中的一种机制,用于保护页面的隐私数据。而在Yii框架中,ViewState同样也是实现页面数据保护的重要手段。在Web开发中,随着用户界面操作的复杂度增加,前端与后端之间的数据传输也愈发频繁。但是,不可避免的会有恶意用户通过网络抓包等手段截获数据。而未加保护的数据可能含有用户隐私、订单信息、财务数据等重要资料。因此,加密传输

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Hot Tools

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor