La semaine dernière, j'ai écrit un article « Où est enregistrée la valeur de la propriété de contrôle ViewState ? » Il expliquait que Control.ViewState est finalement accessible via les deux méthodes Control.SaveViewState et Control.LoadViewState. Il y a une phrase dans l'article qui peut vous rendre confus : "Lorsque nous utilisons this.ViewState[key] pour lire et écrire après OnInit, cette propriété est vraie", où "cette propriété" fait référence à StateItem.IsDirty. Pourquoi la propriété IsDirty est-elle toujours vraie après OnInit ? Après avoir fait référence à VRAIMENT Comprendre ViewState, j'ai finalement compris que ce n'était pas toujours vrai. Veuillez m'écouter expliquer les raisons détaillées.
La première chose que vous devez examiner est la méthode StateBag.TrackViewState. Cette méthode sera appelée lorsque le contrôle OnInit. Sa fonction est de permettre à StateBag de commencer à suivre les modifications dans StateItem. Toute modification fera que la propriété IsDirty de StateItem deviendra vraie. . Autrement dit, avant OnInit, la propriété IsDirty est fausse et quelle que soit la façon dont vous définissez la valeur de la propriété Value, la propriété IsDirty ne sera pas modifiée. Après OnInit, la propriété IsDirty reste également fausse jusqu'à ce que vous modifiiez la valeur de la propriété Value pour la première fois (en faisant référence à la modification via la méthode this.ViewState[key]). A l'étape SaveViewState, seuls les StateItems dont l'attribut IsDirty est vrai seront enregistrés.
Pourquoi est-il conçu de cette façon ? Par exemple, la propriété Text d'une étiquette définie de manière déclarative se voit attribuer une valeur initiale dans ASPX, puis la valeur initiale est naturellement conservée via ViewState["Text"]. Dans le cycle de vie de la page suivante, la propriété Text de cette étiquette chargera d'abord la valeur initiale définie de manière déclarative dans ASPX pendant OnInit, puis l'écrasera avec ViewState["Text"] lu depuis ViewState pendant LoadViewState. Cependant, à moins que vous n'ayez modifié par programme la propriété Text au cours du cycle de vie de la page précédente, ViewState["Text"] est toujours la valeur initiale, vous utilisez donc ViewState["Text"] pour enregistrer la valeur initiale afin d'écraser la valeur initiale définie de manière déclarative. cela n'a aucun sens d'écraser la même valeur de cette manière, et cela gaspille également de l'espace ViewState. Afin de résoudre ce problème de gaspillage de ressources, toute valeur qui n'a pas été modifiée après la définition déclarative ne doit pas être conservée à l'aide de ViewState, et l'implémentation détaillée est le mécanisme TrackViewState mentionné ci-dessus.
En parlant de cela, Control.ViewState a été expliqué. Si vous êtes un concepteur de contrôles, vous pouvez stocker en toute sécurité les propriétés de contrôle dans ViewState des manières suivantes :
chaîne publique Texte
{
obtenez {return this.ViewState["Text"] sous forme de chaîne ;}
définir {this.ViewState["Text"] = valeur ;}
}
Son mécanisme interne saura distinguer si la valeur que vous enregistrez est la valeur initiale définie de manière déclarative sur ASPX, puis décidera si la valeur doit être conservée. Dans le même temps, si vous souhaitez modifier la détermination de la persistance d'une valeur ViewState à tout moment, vous pouvez la modifier via ViewState.SetItemDirty(key, dirty), qui répond essentiellement aux besoins de tous les développeurs de contrôles.
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html