2011-04-13 2 views
1

Suite aux conseils d'un autre post, j'ai déplacé mon état viewState vers une base de données au lieu de le désactiver complètement. Cependant, maintenant que je l'ai fait, lorsque je publie un formulaire avec une liste déroulante dans laquelle les éléments ont été ajoutés dynamiquement, la valeur est vide (cela se produisait lorsque j'ai désactivé le viewstate et est la raison pour laquelle je l'ai déplacé DB)Valeurs de publication manquant après que Viewstate a été déplacé vers la base de données

Pourquoi cela se produit-il? C'était OK quand le viewstate était sur la page alors pourquoi est-ce que ça ne fonctionnerait plus maintenant que Viewstate est dans la base de données? Utilisation du .NET 2.0

+0

Pourquoi êtes-vous invalidante en premier lieu et quelle version de ASP.NET êtes-vous? – IrishChieftain

+0

Je ne le désactive pas. Je l'ai déplacé pour être stocké dans la base de données. J'utilise ASP.NET 2. Je veux diminuer les temps de chargement de la page tout en gardant le viewstate. Le stocker dans la base de données me permet de le faire. – webnoob

+0

Comment l'enregistrez-vous dans le db? Quelle est la structure de votre table? – patmortech

Répondre

1

Ceci est probablement un problème de cycle de vie; vous n'obtenez probablement pas le ViewState assez tôt, quand la page l'attend. Essayez de charger ViewState dans la méthode PageInit et voir si cela le résout?

À moins que votre ViewState soit vraiment grand, je le garderais sur la page. Si vous souhaitez réduire les temps de chargement de la page, commencez par ajouter un attribut de trace à l'étiquette de la page et voyez où se trouve le véritable goulot de la bouteille (cela vous donnera également la taille exacte de ViewState). Sauf si vous avez affaire à des dizaines de milliers d'enregistrements, l'impact sur la performance dû à la taille de ViewState devrait être acceptable.

MISE À JOUR

Exemple de syntaxe pour enregistrer l'état de la sélection de bouton radio:

protected override void LoadViewState(object savedState) 
{ 
    base.LoadViewState(savedState); 

    if (ViewState["SomeValue"] != null) 
     someValue = stringViewState["SomeValue"]; 
} 


protected override object SaveViewState() 
{ 
    ViewState["SomeValue"] = someValue; 

    return base.SaveViewState(); 
} 
+0

Quand vous dites voir où les goulots d'étranglement utilisent trace, je regarde juste ce qui prend le plus d'espace dans le viewstate i.e le plus grand chiffre dans la colonne viewstate? BTW, passer à PageInit a fonctionné! Merci. – webnoob

+0

Encore une chose. J'ai un panneau de mise à jour autour de quelques boutons radio et pour une raison quelconque, cela ne fonctionne plus avec le viewstate tel qu'il est. Quand je clique sur un, je vois le postback Ajax arriver mais mon bouton radio n'est pas sélectionné et d'après ce que j'ai vu, le code dans le code derrière n'est pas exécuté. Cela pourrait-il être un problème de cycle de page? – webnoob

+0

La trace vous montrera tous les événements de page appelés, y compris celui contenant votre appel de DB - il est juste pratique de voir une ligne de temps pour tout en un coup d'oeil et de vérifier peut-être que quelque chose d'autre provoque le coup de performance. – IrishChieftain

1

Je ne sais pas comment vous implémentez mais la façon dont je l'ai fait était de créer une coutume PageStatePersister et PageAdapter. Si vous le faites correctement, cela fonctionne. Voici un article qui donne un exemple de la façon de le faire avec cette méthode.

http://forums.asp.net/t/1293397.aspx/1?Store+ViewState+in+the+Database+instead+of+Hidden+Form+Field

Matthew

+0

Avez-vous remarqué un changement du tout avec des publications, ajax formes ect? Je suis en train de surcharger la propriété PageStatePersister et d'envoyer une classe personnalisée à sa place. – webnoob

+0

Non. Tout a bien fonctionné. – Matthew

Questions connexes