Viewstate ne persiste pas après la publication
Je vais avoir quelques problèmes dans la persistance de l'état d'affichage sur la publication d'un Contrôle (vb.net)
voici un code que j'ai mis dans mon contrôle:
Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
MyBase.OnInit(e)
Me.EnableViewState = True
Me.ViewStateMode = System.Web.UI.ViewStateMode.Enabled
If Not Page.IsPostBack Then
_SortTime = DateTime.Now
_SortTime.AddSeconds(-10) ' incase the fileserver and webserver date are out of sync
ViewState("PageLoadTimeStamp") = _SortTime
End If
End Sub
onload:
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
_SortTime = CType(ViewState("PageLoadTimeStamp"), DateTime)
End Sub
Mais sur chaque publication, le viewstate est à nouveau vide.
Mise à jour: Que dois-je faire?
Je veux stocker le temps lorsque l'utilisateur charge la page. Ensuite, l'utilisateur va faire de multiples publications. Sur chaque publication j'ai besoin de savoir que le temps.
Mise À Jour 2: Contexte:
- Une page aspx (de l'Éditeur.aspx) vous permettra de charger un contrôle web (ObjectsEditor.ascx) dynamicly
- ObjectsEditor.ascx contient un seul contrôle personnalisé (des Objets.vb)
- Objets.vb va créer un contrôle personnalisé (ObjectsContainer.vb) et l'ajouter à cela des contrôles
C'est le ObjectsContainer qui doit persister le viewstate.
Je suis EnableViewState = "true" partout où je le peux, mais toujours pas de résultat. Ai-je vraiment besoin de définir ces propriétés ici. (ViewStateMode et EnableViewState) Si non, où puis-je gérer cela et quelle est la différence entre ces propriétés?
Merci beaucoup.
Vous devez vous connecter pour publier un commentaire.
Je vois certaines réponses correctes ici, mais je ne vois pas d'explications détaillées, alors j'ai pensé que je voudrais mentionner:
ASP.NET a une assez compliqué de demande de réponse du cycle de vie. Chaque cycle s'exécute par le biais d'un ensemble d'événements tels que
Init
,Load
, etc.. Selon cet article, et plus précisément cette image, il existe une méthode appeléeTrackViewState()
qui s'exécute après l'Init
événement, mais avantInitComplete
événement. Cela signifie que toute modification deViewState
ne sera pas persisté (suivi) si elles sont faites dans leInit
événement comme l'OP a fait.Il existe une autre méthode appelée
LoadViewState()
qui prend leViewState
de données qui a été posté via la__VIEWSTATE
forme de la valeur et des charges dans le courant deViewState
collection. Cela s'exécute après l'InitComplete
événement, mais avant de lePreLoad
événement. Ce qui signifie que les valeurs d'ores et déjàViewState
avantLoadViewState()
exécute seront probablement remplacées.Maintenant, sachant que lors de ces 2 événements se produisent, et la connaissance de la
ViewState
persistance des méthodes exécuter avant et après eux, nous pouvons en déduire que le premier événement où il est sûr de définirViewState
valeurs est laPreLoad
événement. Les valeurs définies précédemment que cet événement seront probablement remplacées et ne sont donc pas conservées.Donc, pour répondre à votre question, définissez votre
ViewState
valeur dans laOnPreLoad()
méthode ou faire comme d'autres l'ont suggéré, et le faire dans leOnLoad()
méthode et vos valeurs doivent être conservés.De la page
ViewState
ne sera pas chargé jusqu'à ce queVide
-événement. Ainsi, vous pouvez stocker votre valeur mais pas la recharger enOnInit
.http://msdn.microsoft.com/en-us/library/ms972976.aspx
Modifier: Pour être honnête, je suis pas encore sûr de ce que les causes de votre problème(et n'ont pas le temps d'étudier de plus), mais essayer de cette façon, qui fonctionne comme prévu:
Dim time = SortTime
est juste pour des fins de démonstration, en fait, c'est aussi redondant.control.LoadViewState
(le premier appelbase.LoadViewState
) pour le lire.EnableViewState
va être héritées du parent à l'enfant des contrôles(par exemple, vous avez défini un GridViewEnableViewState=false
et a déclaré cette commande dans l'un de ses TemplateFields, alors votre controll héritera de ce paramètre, même si vous définissezEnableViewState=true
).Lorsqu'une publication qui se passe (c'est à dire lorsqu'un formulaire est envoyé à un serveur), les valeurs des variables qui sont définies dans le code-behind de la page sont effacés de la mémoire du système client
http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/961985e8-37fe-4b0d-8eb9-9920e4b298d7/
Écrire ce code
Je ne trouve pas pourquoi l'état d'affichage n'a pas persister après la publication, mais j'ai trouvé une autre façon de tenir la valeur à l'aide de la controlstate. Voici mon oeuvre:
Ajouter les éléments suivants méthodes de remplacement:
Donner une valeur à la propriété OnLoad
Maintenant, je peux appeler la propriété une fois la page chargée, et elle aura toujours la valeur définie sur le premier chargement de la page. Il ne changera pas sur la publication et de ne pas être allé sur la publication.
Je suis sûr que c'est possible avec le viewstate trop, mais pour une raison quelconque, ce n'était pas de travail pour moi.
Merci de m'aider à comprendre le Viewstate, je suis sûr que je vais avoir à utiliser le viewstate, tôt ou tard.