[ASP .NET2] Utilisation du control state

cs_prezz Messages postés 71 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 10 octobre 2008 - 10 oct. 2008 à 12:25
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 - 11 oct. 2008 à 00:13
Bonjour à tous,
je possède deux pages. Une première avec une liste paginée qui contient un webcontrol que j'ai créé moi-même. Une deuxième avec un détail.

Lorsque je navigue à l'intérieur de ma liste ma persistance de control est correctement gérée (Tri et pagination conservée).
Par contre lorsque je navigue vers ma seconde page et que je reviens à ma page de liste je perds mes données de pagination.
Pourtant après m'être renseigné sur le control state (notemment ici : http://fredrik.nsquared2.com/viewpost.aspx?PostID=265), j'ai implémenté ce qui était écrit...

Quelqu'un aurait-il une piste?

D'avance merci

5 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
10 oct. 2008 à 13:52
Bonjour,

je pense que c'est normal.

D'après ce que je comprend voici la séquence des actions quetu fais entre tes pages

1. GET                             ==> Page1 ==> remplissage du viewstate
2. Post (viewstate)            ==> Page1 ==> récuperation du viewstate + reremplissage viewstate
3. GET (pas de viewstate) ==> Page2 ==> remplissage viewstate
4. GET (pas de viewstate) ==> Page1 ==> remplissage viewstate

Quand tu reviens sur ta premiere page, ton viewstate n'existe plus, tu n'as donc plus de persistance. Il n'existe pas de solution simple pour résoudre le problème, il faut revoir la logique de la page, et jouer avec des sessions ...
La solution "la plus simple", serait de n'avoir qu'une seule page ca corrigerais ce problème mais ca complexifierais la page et risque grandement de rajouter d'autres problèmes.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
cs_prezz Messages postés 71 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 10 octobre 2008
10 oct. 2008 à 14:30
Pourtant j'ai utilisé le même prcédé en .NET et cela fonctionnait bien
0
cs_prezz Messages postés 71 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 10 octobre 2008
10 oct. 2008 à 14:35
Au passage je me rends compte que si je suis sur la page 2 et que je rafraichis ma page je retombe sur ma page 1 et quand je récupère mon viewstate et que je le décrypte :
lorsque je suis sur la page 2 j'ai bien dans ce viewstate une donnée qui indique que je suis sur la page 2
Par contre après rafraichissement de la page je n'ai plus l'information sur la page
0
cs_prezz Messages postés 71 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 10 octobre 2008
10 oct. 2008 à 14:36
Pardon quand je parle de page 1 et de page 2 c'est bien évidemment la page 1 et 2 de ma liste paginée (sinon la ca devient incompréhensible )
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
11 oct. 2008 à 00:13
Bonsoir,

La solution la plus immédiate est d'utiliser l'historique client, et donc un simple retour par javascript : évidemment, cela dépend des restrictions éventuelles que le client impose à son historique (à la limite, dans ce cas, je dirais que c'est de sa faute, mais bon...).
JSonline à raison, je pense, dans son explication.
Dans ce cas, si tu ne veux pas passer par l'historique client, tu dois passer le pageindex de ton gridview à ta page de détail.
La session est une possibilité, ou alors, tu peux aussi lire dans ta page de détail le pagindex du gridview de la page précédente, et le mettre par exemple dans un hiddenfield, qui sera à son tour lu lors du retour... Ce ne serait pas d'une élégance folle, mais ça marcherait. 
Si tu utilises des "buttonlink", pour qu'il y ait postback, et non pas navigation simple, tu pourras lire dans ta page 2 (détails) le pageindex à l'aide de page.previouspage... et le passer dans un hiddenfield. En mettant un autre buttonlink sur ta page 2, qui renvoie à la page de départ (celle de ta gridview), tu pourras lire cet hiddenfield à l'aide de la même méthode, par exemple, en vb (ici sur l'init de la gridview) :

Protected Sub GridView1_Init(ByVal sender As Object, ByVal e As System.EventArgs)
        If Not Page.PreviousPage Is Nothing Then 
            Dim hf As HiddenField = CType(Page.PreviousPage.FindControl("HiddenField1"), HiddenField)
            If Not hf Is Nothing Then
                GridView1.PageIndex = hf.Value
            End If
        End If   
    End Sub

Evidemment, il faut se méfier dans ce cas de la manière d'accéder à ta page (pour éviter l'ambiguïté éventuelle sur l'hiddenfield). Mais c'est une simple convention de nom à adopter.
Ce n'est pas forcément plus compliqué qu'avec une session, puisqu'il faut prévoir lors des sessions le cas où l'utilisateur ne revient pas directement sur la page précédente... à moins évidemment que tu veuilles conserver de manière plus durable la pagination de ta gridview.

GGtry
0
Rejoignez-nous