Maison base de données tutoriel mysql ViewState机制由浅入深2

ViewState机制由浅入深2

Jun 07, 2016 pm 03:48 PM
archive http viewstate 机制

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机制相关的属性、方法进行介绍。
Copier après la connexion
<strong>1)<span>     </span>ViewState属性</strong>
Copier après la connexion
ViewState是Page及控件的一个属性,这个属性并不是在Page或控件中定义,它定义在System.Web.UI.Control类中。它的声明如下:
Copier après la connexion

protected virtual StateBag ViewState{get}

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

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

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属性。当我们访问控件的属性的时候就实现了对控件属性的记忆,之前设置的控件属性没有丢失。
Copier après la connexion
<strong>2)<span>     </span>LoadViewStateByID属性</strong>
Copier après la connexion

LoadViewStateByID的声明如下:

protected bool LoadViewStateByID{get}

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

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

public virtual bool EnableViewState{get,set}

<strong>4)<span>     </span>LoadViewStateRecursive</strong>
Copier après la connexion
LoadViewStateRecursive的声明如下:
Copier après la connexion
<span>internal</span><span>void</span><span> LoadViewStateRecursive(<span>object</span> savedState)</span>
Copier après la connexion
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>
Copier après la connexion
<span>Control.</span>LoadChildViewStateByIndex(savedState.Second)。savedState.Second是一个ArrayList类型的对象。
Copier après la connexion

Control.LoadViewState的声明如下:

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

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>
Copier après la connexion

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>
Copier après la connexion

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

this.ViewState.LoadViewState(savedState);

<strong>6)<span>     </span>SaveViewStateRecursive</strong>
Copier après la connexion
SaveViewStateRecursive的声明如下:
Copier après la connexion

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>
Copier après la connexion

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

return this.ViewState.SaveViewState();

<strong>8)<span>     </span>TrackViewState</strong>
Copier après la connexion

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

this.ViewState.TrackViewState();



Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que signifie le code d'état http 520 ? Que signifie le code d'état http 520 ? Oct 13, 2023 pm 03:11 PM

Le code d'état HTTP 520 signifie que le serveur a rencontré une erreur inconnue lors du traitement de la demande et ne peut pas fournir d'informations plus spécifiques. Utilisé pour indiquer qu'une erreur inconnue s'est produite lorsque le serveur traitait la demande, ce qui peut être dû à des problèmes de configuration du serveur, à des problèmes de réseau ou à d'autres raisons inconnues. Cela est généralement dû à des problèmes de configuration du serveur, des problèmes de réseau, une surcharge du serveur ou des erreurs de codage. Si vous rencontrez une erreur de code d'état 520, il est préférable de contacter l'administrateur du site Web ou l'équipe d'assistance technique pour plus d'informations et d'assistance.

Comprendre les scénarios d'application courants de redirection de pages Web et comprendre le code d'état HTTP 301 Comprendre les scénarios d'application courants de redirection de pages Web et comprendre le code d'état HTTP 301 Feb 18, 2024 pm 08:41 PM

Comprendre la signification du code d'état HTTP 301 : scénarios d'application courants de redirection de pages Web Avec le développement rapide d'Internet, les exigences des utilisateurs en matière d'interaction avec les pages Web sont de plus en plus élevées. Dans le domaine de la conception Web, la redirection de pages Web est une technologie courante et importante, mise en œuvre via le code d'état HTTP 301. Cet article explorera la signification du code d'état HTTP 301 et les scénarios d'application courants dans la redirection de pages Web. Le code d'état HTTP 301 fait référence à une redirection permanente (PermanentRedirect). Lorsque le serveur reçoit le message du client

Solution d'erreur de requête http 415 Solution d'erreur de requête http 415 Nov 14, 2023 am 10:49 AM

Solution : 1. Vérifiez le type de contenu dans l'en-tête de la requête ; 2. Vérifiez le format des données dans le corps de la requête ; 3. Utilisez le format de codage approprié. 4. Utilisez la méthode de requête appropriée ;

Problèmes et solutions courants en matière de communication et de sécurité réseau en C# Problèmes et solutions courants en matière de communication et de sécurité réseau en C# Oct 09, 2023 pm 09:21 PM

Problèmes courants de communication réseau et de sécurité et solutions en C# À l'ère d'Internet d'aujourd'hui, la communication réseau est devenue un élément indispensable du développement logiciel. En C#, nous rencontrons généralement certains problèmes de communication réseau, tels que la sécurité de la transmission des données, la stabilité de la connexion réseau, etc. Cet article abordera en détail les problèmes courants de communication réseau et de sécurité en C# et fournira les solutions correspondantes et des exemples de code. 1. Problèmes de communication réseau Interruption de la connexion réseau : pendant le processus de communication réseau, la connexion réseau peut être interrompue, ce qui peut entraîner

Comment implémenter le streaming HTTP en utilisant C++ ? Comment implémenter le streaming HTTP en utilisant C++ ? May 31, 2024 am 11:06 AM

Comment implémenter le streaming HTTP en C++ ? Créez un socket de flux SSL à l'aide de Boost.Asio et de la bibliothèque client asiohttps. Connectez-vous au serveur et envoyez une requête HTTP. Recevez les en-têtes de réponse HTTP et imprimez-les. Reçoit le corps de la réponse HTTP et l'imprime.

HTTP 200 OK : comprendre la signification et le but d'une réponse réussie HTTP 200 OK : comprendre la signification et le but d'une réponse réussie Dec 26, 2023 am 10:25 AM

Code d'état HTTP 200 : explorez la signification et l'utilisation des réponses réussies Les codes d'état HTTP sont des codes numériques utilisés pour indiquer l'état de la réponse d'un serveur. Parmi eux, le code d'état 200 indique que la demande a été traitée avec succès par le serveur. Cet article explorera la signification spécifique et l'utilisation du code d'état HTTP 200. Tout d’abord, comprenons la classification des codes d’état HTTP. Les codes d'état sont divisés en cinq catégories, à savoir 1xx, 2xx, 3xx, 4xx et 5xx. Parmi eux, 2xx indique une réponse réussie. Et 200 est le code d'état le plus courant dans 2xx

Comment résoudre l'erreur HTTP 503 Comment résoudre l'erreur HTTP 503 Mar 12, 2024 pm 03:25 PM

Solution : 1. Réessayez : vous pouvez attendre un certain temps et réessayer, ou actualiser la page ; 2. Vérifiez la charge du serveur : vérifiez l'utilisation du processeur, de la mémoire et du disque du serveur. Si la limite de capacité est dépassée, vous pouvez essayer. pour optimiser la configuration du serveur ou augmenter la capacité. 3. Vérifiez la maintenance et les mises à niveau du serveur : vous ne pouvez attendre que le serveur revienne à la normale. 4. Vérifiez la connexion réseau : assurez-vous que la connexion réseau est stable, vérifiez si le réseau est actif. les paramètres du périphérique, du pare-feu ou du proxy sont corrects ; 5. Assurez-vous que la configuration du cache ou du CDN est correcte ; 6. Contactez l'administrateur du serveur, etc.

Quel code d'état est renvoyé pour un délai d'expiration d'une requête HTTP ? Quel code d'état est renvoyé pour un délai d'expiration d'une requête HTTP ? Feb 18, 2024 pm 01:58 PM

La requête HTTP expire et le serveur renvoie souvent le code d'état 504GatewayTimeout. Ce code d'état indique que lorsque le serveur exécute une requête, il ne parvient toujours pas à obtenir les ressources requises pour la requête ou à terminer le traitement de la requête après un certain temps. Il s'agit d'un code d'état de la série 5xx, qui indique que le serveur a rencontré un problème temporaire ou une surcharge, entraînant l'incapacité de traiter correctement la demande du client. Dans le protocole HTTP, divers codes d'état ont des significations et des utilisations spécifiques, et le code d'état 504 est utilisé pour indiquer les problèmes d'expiration du délai de demande. chez le client

See all articles