2009-12-01 10 views
2

Je rencontre un problème dans mon application ASP.NET avec l'actualisation de la page Viewstate et F5.Problème avec LoadViewState après la mise à jour de la page F5 - Impossible de charger viewstate

Si, après la navigation d'une page à une autre, je immédiatement frappé F5, je reçois l'erreur suivante:

System.InvalidCastException 
"Unable to cast object of type 'System.Web.UI.Triplet' 
to type 'System.Web.UI.Pair'." 

Cela conduit à l'exception suivante affichée sur la page:

HttpException (0x80004005): Failed to load viewstate. The control tree 
into which viewstate is being loaded must match the control tree that 
was used to save viewstate during the previous request. 
For example, when adding controls dynamically, the controls added during a 
post-back must match the type and position of the controls added during 
the initial request.] 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +310 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Page.LoadAllState() +439 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1092 

Le point à laquelle il échoue est dans la méthode LoadViewState substituée pour un contrôle d'étiquette personnalisée, lorsqu'il appelle le parent LoadViewState

System.Web.UI.WebControls.Label.LoadViewState(ByVal savedState As Object) 

L'objet savedState semble être un contrôle complètement différent (une liste déroulante) qui est un System.Web.UI.Triplet, au lieu de l'objet System.UI.Pair attendu par le contrôle Label.

Si je fais exactement la même chose en utilisant une page différente dans la même application, la page se charge bien après la publication F5. Les deux pages Web héritent de la même classe de base et utilisent les mêmes contrôles personnalisés. La page qui cause des problèmes n'a aucun contrôle ajouté dynamiquement. Après avoir débogué le processus, il semble que l'événement LoadViewState ne soit pas déclenché après la publication F5 pour les contrôles de la page qui se chargent correctement. SaveViewState est déclenché dans les deux cas.

Des idées pour lesquelles l'événement LoadViewState serait déclenché pour une page mais pas l'autre? Je suis assez nouveau sur ASP.NET et je continue à comprendre comment ViewState fonctionne.

Répondre

1

Il est difficile de dire grand chose sans voir votre code. Cependant, quelques choses qui pourraient aider:

  1. Vous pouvez regarder l'échange HTTP lors de l'échec à l'aide d'un débogueur web comme Fiddler; il y a de bonnes chances que la réponse vous saute aux yeux.
  2. Rappelez-vous que F5 ré-émet la dernière requête. Si vous naviguez d'une page à l'autre, il ne devrait pas y avoir de ViewState, à moins que vous ne fassiez une publication inter-pages.
  3. Si ViewState n'est pas envoyé avec la demande, la nature de l'échec peut-elle être liée à la façon dont vous l'avez encodé?
  4. LoadViewState() ne doit être appelé que lorsque la requête entrante contient ViewState qui doit être chargée dans le contrôle associé.
  5. SaveViewState() est appelé pour chaque demande de page, pour conserver l'état du contrôle dans un champ masqué de la page, afin qu'il soit disponible pendant une publication.