Les propriétés Asp.net BasePage utilisant ViewState sont effacées lors de la publication

StackOverflow https://stackoverflow.com/questions/627049

Question

Voici les bases de ma configuration:

J'ai une classe BasePage qui hérite de System.Web.UI.Page. BasePage a deux propriétés implémentées de telle sorte que leur get / set le fasse à partir de deux éléments différents de la collection ViewState (par exemple, this.ViewState [" Année "de la BasePage).

J'ai une autre classe qui hérite ensuite de BasePage, appelons-la SpecificBasePage.

Enfin, j'ai une page aspx qui hérite de SpecificBasePage.

J'ai ajouté des points d'arrêt, parcouru mon code et découvert que lors du chargement initial de la page, les deux propriétés de l'état d'affichage sont affectées à des valeurs et que les valeurs persistent tout au long du cycle de vie du chargement de la première page.

Toutefois, lorsque la page est postée à nouveau, lors de l'événement Page_Load et d'autres gestionnaires d'événements (lorsque ViewState doit être chargé), les deux propriétés retournent la valeur null. L’inspection de this.ViewState.Count indique qu’il n’ya aucun objet dans la collection.

Quelqu'un peut-il penser à quelque chose que je pourrais faire quelque part qui affecterait ViewState et provoquerait ce comportement?

- Ajout Je l'ai isolé à une partie de mon code. Lors du chargement initial, je donne les valeurs des propriétés viewstate dans OnInit. J'ai constaté que lorsque je déplace ceci vers OnLoad, les valeurs persistent lors du post précédent. J'imagine que même si les valeurs d'état d'affichage affichées persistent tout au long du cycle de vie de la page initiale, elles sont abandonnées dans la publication précédente.

Était-ce utile?

La solution

Les pages peuvent avoir EnableViewState = false sur l'aspx

Peut également être désactivé sur le fichier Web.config de l'application ou même sur l'ordinateur global de l'élément.

Mise à jour 1: lors du cycle de vie asp.net, ViewState est chargé après l'init et avant le chargement plus d'infos . Le voir comme n'importe quoi sur init est considéré comme faisant partie de la déclaration de la page. Plus tard, asp.net chargera le viewstate, et ensuite il commencera à suivre les modifications apportées au viewstate. C'est après cela qu'asp.net verra toute différence entre les informations initiales sur viewstate et les informations modifiées. Par conséquent, son chargement permet d'éviter le problème (car l'état initial n'existe pas et le nouvel état correspond à ce que vous avez mis sur l'état d'affichage). . À partir du lien ci-dessus:

  

" La raison en est que la classe StateBag   suit uniquement les modifications apportées à ses membres   après que sa méthode TrackViewState () ait   été invoqué. Si vous avez un   StateBag, tous les ajouts ou   les modifications qui sont faites avant   TrackViewState () est faite ne sera pas   enregistré lorsque la méthode SaveViewState ()   est invoqué. Le TrackViewState ()   la méthode est appelée à la fin de la   étape d'initialisation, ce qui arrive   après la phase d'instanciation.   Par conséquent, la propriété initiale   missions dans l'instanciation   stage: lors de l'écriture sur ViewState   dans les accesseurs d'ensemble des propriétés - sont   pas persisté pendant la   SaveViewState () appel de méthode dans le   enregistrer le stade de la vue, car le   La méthode TrackViewState () doit encore être   invoqué. "

Autres conseils

Voici une excellente réponse envoyée par un autre utilisateur à propos de Cycle de vie des pages ASP.NET , les problèmes ViewState valent le coup d'œil.

Consultez également " Comprendre vraiment ViewState "

Comme je l’ai dit dans la partie que j’ai ajoutée plus tard, il est apparemment impossible de définir quoi que ce soit dans l’affichage avant le chargement de la page, MÊME POUVANT Asp.net ne génère pas d’erreur et elle existera dans l’état de la vue pendant toute la durée initiale. cycle de vie de la page, il ne persistera PAS sur le cycle de vie du post suivant.

Regardez où vous définissez vos valeurs ViewState. Eventuellement, connectez votre événement OnUnload et inspectez l'objet ViewState pour vous assurer que les valeurs sont bien définies.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top