IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C#] ViewState. Enfin une explication simple ?


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 103
    Points : 92
    Points
    92
    Par défaut [C#] ViewState. Enfin une explication simple ?
    Bonjour,

    Depuis deux jours, je lis des documentations en anglais qui m'expliquent comment optimiser la taille de mon viewstate ou dans quel ordre surviennent les évènements d'une page serveur ... mais dans tout cela, je n'ai toujours pas compris l'enchainement simple qui me permet de l'utiliser.
    J'ai bien essayé d'accéder directement à ViewState["ddlListe1"], mais sans succès

    Donc, j'ai une question simple : comment détecter que la valeur d'un élément du formulaire à changé ?

    C'est à dire : dans quelle méthode mettre quelle donnée pour détecter ce changement.
    Prenons pour exemple deux DropDownList. Les valeurs de la seconde dépendent de l'item sélectionné dans la première et ne sont modifiées que si la valeur de la DropDownList a changé et est renseignée.

    Le code de l'ASPX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <asp:DropDownList ID="ddlListe1" AutoPostBack="true" runat="server" /><br />
    <asp:DropDownList ID="ddlListe2" AutoPostBack="true" runat="server" />
    Le code de l'ASPX.cs (l'item avec "-" doit permettre de ré initialiser) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    protected void Page_PreRender(object sender, EventArgs e)
    {
        // au premier chargement
        if ((ddlListe1.SelectedValue == "") || (ddlListe1.SelectedValue == "-1")) {
            // chargement de la liste 1
            DataSet liste1 = (DataSet)Session["liste1"];
            ddlListe1.DataSource = liste1 ;
            ddlListe1.DataTextField = "NOM";
            ddlListe1.DataValueField = "ID";
            ddlListe1.DataBind();
            ddlListe1.Items.Insert(0, new ListItem("-", "-1"));
            ddlListe2.Enabled = false;
        }
        else { 
            // si liste1 sélectionnée, récupération liste 2
            int idListe1 = Int32.Parse(ddlListe1.SelectedValue);
     
            // *** ici, il faudrait un truc pour dire "ou si changement"
            if ((ddlListe2.SelectedValue == "") || (ddlListe2.SelectedValue == "-1")) {
                // chargement de la liste 2 si liste 1 sélectionnée
                DataSet liste2 = MonObjet.getListe2(idListe1);
                ddlListe2.DataSource = listeSites;
                ddlListe2.DataTextField = "NOM";
                ddlListe2.DataValueField = "ID";
                ddlListe2.DataBind();
                ddlListe2.Enabled = true;
            }
        }
    }
    Merci d'avance pour votre aide.
    Stéphanie

    Remarque : j'ai déja suivi tous les liens que j'ai pû trouver sur le forum
    Pensez à mettre quand vous avez obtenu la réponse à votre question.

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 052
    Points : 8 735
    Points
    8 735
    Par défaut
    Je comprends pas trop.
    Tu veux savoir s'il y a eu un changement d'Item Selectionné?
    C'est justement le rôte de AutoPostBack = True

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 103
    Points : 92
    Points
    92
    Par défaut
    Ma question est plus généraliste que cela.
    Elle peut également concerner des champs de saisie ou autre checkbox ...

    En fait, savoir si entre deux soumissions d'un formulaire, il y a eu des changements et, si oui, lesquels.

    J'ai volontairement simplifié mon exemple (en fait, j'ai trois ddl et il faut que je sache laquelle à bougé pour ne pas tout recharger à chaque fois), mais la détection des changements me sera utile par la suite.

    Il me semble que c'est le rôle du Viewstate, c'est du moins ce que j'en ai compris ... et je veux juste savoir comment l'utiliser
    Pensez à mettre quand vous avez obtenu la réponse à votre question.

  4. #4
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 052
    Points : 8 735
    Points
    8 735
    Par défaut
    Je dirais un truc dans le genre

    1er submit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ViewState["ddl1"] = ddl1.selectedvalue
    2eme submit, tu vérifies si ça a changé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if viewstate["ddl1"] != ddl1.selectedvalue
    {
    //changement
    }
    J'ai jamais testé mais c'est comme ça que je le vois

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 103
    Points : 92
    Points
    92
    Par défaut
    A quel endroit dans le code ?
    Dans mon Page_PreRender ?
    Pensez à mettre quand vous avez obtenu la réponse à votre question.

  6. #6
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 052
    Points : 8 735
    Points
    8 735
    Par défaut
    Je sais pas trop. Moi je me sers que du OnLoad

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 103
    Points : 92
    Points
    92
    Par défaut
    Bon, j'ai fait comme vous m'avez dit ... et cela fonctionne.
    Mais du coup, je ne vois pas trop la différence entre le ViewState et le Response/Request.

    Tout ce fonctionnement reste quand même obscur pour moi : le ViewState et le cycle de vie évènementiel.
    Je reste preneuse d'articles simples expliquant le phénomène.

    Merci quand même.
    Pensez à mettre quand vous avez obtenu la réponse à votre question.

  8. #8
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 052
    Points : 8 735
    Points
    8 735
    Par défaut
    Pour moi, le ViewState est à comparé à des variables de session.
    Sauf que pour le ViewState, ça se passe au niveau de la page et qu'un gros viewstate peut nuire à la rapidité de transfert de la page.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    Pour le cycle de vie de la page, ici c'est pas mal expliqué : http://www.15seconds.com/issue/020102.htm .
    Pour le ViewState, c'est simplement l'état des controles de ta page lors de la requete précédente. Qd tu utilises Request/Response, tu demandes l'état d'un controle maintenant, qd tu le demandes au ViewState tu demandes l'état la fois d'avant.
    Le ViewState est maintenu coté client dans un champ caché et si tu as fait de l'asp avant de faire de l'asp.net tu te rappelleras que tu faisais surement la même chose mais manuellement pour maintenir l'etat de tes controles d'un postBack à l'autre. C'est à dire avoir un champ caché dans la page qui se souvient de ce que l'utilisateur avait mis dans chaque controle (on avait d'ailleurs plutot un champ caché par controle) , et à la fin de ta page tu remettais ces valeurs dans les controles en question.
    Le ViewState c'est simplement l'automatisation par asp.net de cette pratique. ça lui permet à la fois de maintenir l'etat des controles, mais aussi en comparant l'etat d'avant avec l'etat maintenant de générer les evenements qu'on connait bien (DropDownList.SelectIndexChanged etc...).
    J'espere que c'est un peu plus clair

    PS : le ViewState est a comparer a la Session comme le dit Lutefalco par ce qu'en plus de ce que j'ai dit avant on peut y stocker manuellement des variables qui n'ont rien a voir avec les controles. Une espece de Session coté client, mais qui est utilisé par asp.net pour gérer l'état des controles.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 103
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par Sphax
    Pour le cycle de vie de la page, ici c'est pas mal expliqué : http://www.15seconds.com/issue/020102.htm.
    Je l'ai lu et cela ne fait que dire dans quel ordre les fonctions sont exécutées ... mais pas ce qui se passe vraiment derrière et à quel moment il faut faire quoi. Danx ce sens, l'article suivant est bien mieux :
    http://aspnet.4guysfromrolla.com/articles/092904-1.aspx (j'avais pourtant déja fait la remarque dans mon premier POST )

    Citation Envoyé par Sphax
    Qd tu utilises Request/Response, tu demandes l'état d'un controle maintenant, qd tu le demandes au ViewState tu demandes l'état la fois d'avant.
    Etant donné qu'on doit soit même positionner le ViewState à l'exécution précédente pour avoir son état, je ne vois pas en quoi cela est automatisé. A moins qu'il y ait un truc à positionner :
    J'avais effectivement cru comprendre qu'il conservait l'état d'un formulaire avant modification, mais ce n'est pas le cas si on le positionne soit même.

    Sinon, étant donné que je viens de Java, je ne me rappelle pas ... hélas : ce serait pê plus clair

    Stéphanie
    Pensez à mettre quand vous avez obtenu la réponse à votre question.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Je l'ai lu et cela ne fait que dire dans quel ordre les fonctions sont exécutées ... mais pas ce qui se passe vraiment derrière et à quel moment il faut faire quoi.
    Mais qu'est ce que tu veux faire ? Si c'est gérer des controles dynamique effectivement ton lien est plus clair. Cela dit il doit y avoir deux ou trois post qui trainent dans le coin ou j'ai du expliquer en long en large et en travers ou et qd créer ces controles dynamiques

    j'avais pourtant déja fait la remarque dans mon premier POST
    ça ne coute rien de redonner le lien, des fois qu'il t'ai echappé hein

    Etant donné qu'on doit soit même positionner le ViewState à l'exécution précédente pour avoir son état, je ne vois pas en quoi cela est automatisé
    Comment ça positionner le ViewState soit meme ?? Je ne te suis pas là, pour maintenir l'état de tes controles, tu n'as pas a toucher le ViewState, jamais (eu... otes moi d'un doute, tes controles ont bien leur propriété EnableViewState à true ??). Donc je ne comprends pas.


    Sinon, étant donné que je viens de Java, je ne me rappelle pas ... hélas : ce serait pê plus clair
    Si malgré les liens et nos explications tu ne vois toujours pas, tu devrais essayer de désactiver le viewState sur tes pages et trouver le moyen de gérer l'etat de tes controles manuellement. Tu comprendras vite à quoi il sert

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 103
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par Sphax
    pour maintenir l'état de tes controles, tu n'as pas a toucher le ViewState, jamais (eu... otes moi d'un doute, tes controles ont bien leur propriété EnableViewState à true ??).
    Le enableViewState est à true par defaut et je ne l'ai pas modifié.

    Dans mon premier POST, j'ai dit :
    Citation Envoyé par slopera
    J'ai bien essayé d'accéder directement à ViewState["ddlListe1"], mais sans succès
    lutecefalco dans son deucième POST me dit de modifier moi même (par code) le ViewState, puisqu'il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ViewState["ddl1"] = ddl1.selectedvalue
    Dont, si tu me dis qu'il ne faut pas le toucher et qu'il gère tout tout seul, pourquoi n'ai je rien dans ViewState["ddlListe1"] à mon 2ème renvoi de la page :
    Y'aurait il un truc à positionner dans le web.config ?

    Remarque (pê importante ?) : je suis en 2.0
    Pensez à mettre quand vous avez obtenu la réponse à votre question.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Oulala ya de l'emmelage de pinceaux la.

    Tu n'as pas a maintenir l'etat de tes controles dans le ViewState manuellement ça c'est sur, puisque le ViewState est la pour ça. Donc il y a bien une valeur qui contient l'état de ta dropDownList dans le ViewState, le probleme c'est que tu ne sais pas sous quelle clée cette valeur est stockée (la clée ressemble trés surement à l'id du controle, mais peut etre plus l'id coté client et non coté serveur, ce n'est pas le même, il suffit que tu regardes le code html de ta page pour le voir) ! Normal, tu n'as pas a y accéder manuellement. Pour toi le seul moyen de savoir si ta drpDownList à changé d'état, c'est de t'abonner à son SelectedIndexChanged. Cet évenement sera levé automatiquement par asp.net s'il s'aperçoit que ta DropDownList à changée d'état. Tout ça c'est de l'encapsulation en gros : le composant DropDownList sait enregistrer son état dans le ViewState, et il sait aussi le récupérer, toi tu n'as pas besoin d'intervenir dans ce processus.

    Maintenant , si tu as vraiment besoin de récupérer la valeur de ta DropDownList le coup d'avant (je n'ai jamais eu besoin de ça), soit tu arrives a trouver ou se trouve cette info dans le ViewState (peut etre que c'est documenté) , soit tu essayes de la récupérer dans ta dropDownList apres l'evenement LoadViewState, mais surtout avant l'evenement LoadPostData (qui va renseigné ta DropDownList avec l'état actuel du controle). Derniere solution effectivement, c'est de maintenir cette valeur à la main dans le ViewState (ou ailleurs pour le coup, par exemple en session) mais alors sache que l'info sera en double dans le ViewState : celle maintenu par asp.net et celle que tu maintiens manuellement.

    L'embrouille vient du fait j'ai l'impression que le ViewState est une collection qui sert au framework asp.net à gérer l'etat des controles, mais dans laquelle tu peux egalement stocker ce que tu veux, tout comme dans la session par exemple (stockage coté serveur), mais le stockage aura lieu coté client.

    PS : je commence seulement a regarder asp.net 2.0 , mais je pense pas que le fonctionnement du ViewState ait changé. D'ailleurs soit dit en passant, je crois que pas grand chose n'a changé.

  14. #14
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 052
    Points : 8 735
    Points
    8 735
    Par défaut
    C'est justement parce qu'on connait pas la clé ds le viewstate que je lui ai dis de faire comme ça

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Oui mais du coup slopera a pensé que le ViewState ne servait a rien

  16. #16
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 052
    Points : 8 735
    Points
    8 735
    Par défaut
    Citation Envoyé par Sphax
    Oui mais du coup slopera a pensé que le ViewState ne servait a rien
    Je décline toute responsabilité

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 103
    Points : 92
    Points
    92
    Par défaut
    Effectivement, je n'ai pas besoin de connaître la valeur précédente, juste de savoir si elle a changé.
    J'ai donc tout modifié pour utiliser l'évènement OnSelectedIndexChanged et j'ai le fonctionnement que je voulais.

    Toutefois, je vous confirme que j'ai vérifié l'id dans le code HTML client (qui est le même que dans mon contrôle serveur) et si je fais ViewState["ddlListe1"], j'ai systématiquement null (je lance en debug pour le voir).

    D'autre part, je confirme également que pour les aspects de configuration et de ressources, les différences sont énormes entre le 1.0 et le 2.0 : j'ai suffisement galérer à démarer pour vous le dire

    Sphax, pourrais tu me dire dans quelle méthode je serai après LoadViewState et avant LoadPostData car si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected void Page_LoadViewState(object sender, EventArgs e)
    {
        base.LoadViewState(sender);
        string s = ddlListe1.SelectedValue;
    }
    Je ne passe jamais dans le code !

    Stéphanie
    Pensez à mettre quand vous avez obtenu la réponse à votre question.

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Effectivement, je n'ai pas besoin de connaître la valeur précédente, juste de savoir si elle a changé.
    J'ai donc tout modifié pour utiliser l'évènement OnSelectedIndexChanged et j'ai le fonctionnement que je voulais.
    Bon parfait

    Toutefois, je vous confirme que j'ai vérifié l'id dans le code HTML client (qui est le même que dans mon contrôle serveur) et si je fais ViewState["ddlListe1"], j'ai systématiquement null (je lance en debug pour le voir).
    Ok l'id coté client doit etre différent uniquement qd on est dans un UserControl alors, au temps pour moi. Et c'est que la clée n'est pas celle là , ou bien qu'a ce moment ce n'est pas accessible, mais je ne connais pas le détail de la mécanique du ViewState.

    Sphax, pourrais tu me dire dans quelle méthode je serai après LoadViewState et avant LoadPostData...
    J'aurai pensé que ça marcherait, normalement tu devrais passer par cette étape. La comme ça je ne sais pas pourquoi ça ne marche pas, je vais faire un test et je te tiens au courant.

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Aprés test je confirme, ce code marche (overrider le LoadViewstate). par contre cette fonction n'est lancée que sur un PostBack, pas lors de la premiere requete à la page, ce qui semble logique. Verifie bien de ton coté...

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 103
    Points : 92
    Points
    92
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected override void LoadViewState(object sender)
    {
        base.LoadViewState(sender);
        string s = ddlListeSocietes.SelectedValue;
    }
    Je n'y passe jamais !!

    Et quoi qu'il en soit, je n'arrive pas à accéder au ViewState, ce qui était la base de ma question
    Pensez à mettre quand vous avez obtenu la réponse à votre question.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Une explication simple de Dijkstra ..
    Par pierre1256 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 03/01/2007, 10h35
  2. Conseils sur une API simple pour Windows
    Par alejandro dans le forum Choisir un environnement de développement
    Réponses: 4
    Dernier message: 28/04/2005, 19h12
  3. Réponses: 4
    Dernier message: 28/12/2003, 16h50
  4. Réponses: 28
    Dernier message: 18/08/2003, 12h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo