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 :

Pas tout compris à l'utilisation du viewstate


Sujet :

ASP.NET

  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Pas tout compris à l'utilisation du viewstate
    Bonjour à tous.

    Je voudrais utiliser le ViewState mais je crois que j'ai du louper un épisode en lisant la MSDN.

    Alors voilà, j'ai une page avec deux ASCX dedans. L'un est un formulaire de recherche, l'autre contient un GridView qui va se nourrir d'une requête.

    Sur le click du bouton du formulaire je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ViewState("rq") = "EXEC dbo.IMMO_SelectionBienRecherche " & ddlTypeBien.SelectedValue & ", " & ddlTypeTransac.SelectedValue & ", " & PrixMini & ", " & PrixMaxi & ", " & PieceMini & ", " & PieceMaxi & ", " & dacVille.IdVille
            Response.Redirect(GetPage("Accueil", enTypeRetour.Lien))
    En gros, je fabrique ma requête SQL de toute pièce et je redirige vers la page qui contient le Composant ASCX du GridView. Dans le cas présent il se trouve que c'est la même page, mais cela ne sera pas toujours le cas.

    Et dans le composant ASCX qui contient le GridView je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    With sdsListeBien
                .SelectCommandType = SqlDataSourceCommandType.Text
                If ViewState("rq") <> "" Then
                    .SelectCommand = ViewState("rq")
                Else
                    .SelectCommand = "EXEC dbo.IMMO_SelectionBienDefault"
                End If
            End With
    J'ai une Procédure Stockée qui me remonte les 10 biens les plus récents par défaut (quand on arrive sur le page d'accueil par exemple) sinon, on prend les critères envoyés précédement et on envoi la requete fabriquée pour renvoyer les biens selon les critères.

    Sauf que dans mon cas, j'ai du louper un truc car je n'ai jamais de retour de la requête.

    Pouvez vous m'aider ?

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Salut,

    C'est le Response.Redirect qui provoque un chargement de la page (et une remise a 0 du viewstate) car ce n'est pas un postback.

    Si c'est une communication inter-pages, tu peux passer par une variable session (qui ne sera pas remise à 0 par le changement de page).

  3. #3
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour ton aide.

    Ah, d'accord, je comprends.

    Mais j'aurais préféré une méthode moins "long terme" que la variable de session. Va faloir la gérer et ça m'embête un peu.
    Du temps de ASP 3.0 j'aurais pu utiliser un truc du genre Request.Form, mais là, en .NET, je sais pas quoi utilser.

    Une idée ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 47
    Par défaut
    J'utilise une solution un peut "bourrin" pour sauvegarder les requêtes SQL, j'ai balancé un asp:label avec visibility à False, et quoi que tu fasse sa propriété Text est toujours disponible.

  5. #5
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour ton aide.
    Ton label, tu le mets dans quel composant ?
    Et une fois qu'il est dans le composant, tu recupère comment sa propriété Text ?

    Si je le mets dans le composant où se trouve le formulaire, je ne sais pas récupérer son Text depuis le composant du GridView et s'il est dans le composant du GridView, je ne sais pas comment mettre la requête dans le Text.

    @hwoarang : j'ai réfléchi un peu plus, mais vu l'heure, je testerais demain matin. Si je ne fais pas de Response.Redirect, ça va bien déclcneher un Post Back ?
    Et donc, ça va bien charger le truc dans le ViewState et donc je vais pouvoir récupérer ça dans le composant du GridView et récupérer aussi le remplissage des champs du formulaire, j'ai bon là ?

    Reste à ce que je trouve le moyen de rester toujours sur la même page, donc ne pas mettre le composant de formulaire sur d'autre page.
    Si l'idée tiens la route, je peux suivre cette piste.

  6. #6
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut Conception
    A mon avis c'est une erreur de mettre du SQL dans une page web ....Il fait faire des objets qui s'adresse a une couche DAL et DAO ....il faut reserverver le code des pages web à la présentation ...


    P.JEAN

  7. #7
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    @hwoarang : bon, ben j'ai testé et ça marche pas !!! J'ai mis en oeuvre la version avec variable de session, ça marche bien, dans l'absolu. Reste à voir le comportement d'une telle variable en production.
    Je le vide juste aprés son utilisation, comme ça au mins je suis presque pénard, mais je garde un léger doute.


    @PatStan17 : merci pour ton "avis" mais trois choses :
    - j'avais besoins d'aide et pas d'un avis
    - le sujet n'est pas "la gestion des requêtes SQL" mais "le stockage d'une variable String dans le Viewstate
    - le DAL et le DAO sont des grands mots que je ne maitrise pas, je suis un gars simple et pragmatique. Mais aprés enquête avec mon ami Google, je me suis rendu compte que dans mon système j'ai un DAL que j'ai fabriqué avec mes petites mains, donc j'ai suivi ton "avis" depuis le départ (il y a trois ans) et je trouve ça cool.

    Maintenant, dans le cas précis qui m'occupe, si tu as une méthode pour envoyer autre chose qu'une requête texte dans le SQLDataSource.SelectCommand lorsque le SQLDataSource.SelectCommandType est à Text, moi, je prends, je suis ouvert.

  8. #8
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut ??????
    moi aussi je suis un gars simple comme tu dis ...ce qui ne m'empêche pas de pas aimer du tout le ton de ta réponse qui n'est pas aimable et ne correspond pas à mon avis à l'esprit de ce forum ...

    Mais bon je ne suis qu'un simple utilisateur

    ...donc je te laisse et ne donnerai plus du tout mon "avis" ,( j'avais remarqué les " ")

    sur ceci bonne journée ...


    P.JEAN

  9. #9
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Ton label, tu le mets dans quel composant ?
    Et une fois qu'il est dans le composant, tu recupère comment sa propriété Text ?
    Cette technique ne marchera pas sur des pages différentes.

    Citation Envoyé par zooffy Voir le message
    @hwoarang : j'ai réfléchi un peu plus, mais vu l'heure, je testerais demain matin. Si je ne fais pas de Response.Redirect, ça va bien déclcneher un Post Back ?
    Et donc, ça va bien charger le truc dans le ViewState et donc je vais pouvoir récupérer ça dans le composant du GridView et récupérer aussi le remplissage des champs du formulaire, j'ai bon là ?
    Si ton bouton est configuré pour declancher un postback, oui (c'est le comportement par defaut des boutons asp).

    Citation Envoyé par zooffy Voir le message
    Reste à ce que je trouve le moyen de rester toujours sur la même page, donc ne pas mettre le composant de formulaire sur d'autre page.
    Si l'idée tiens la route, je peux suivre cette piste.
    2 solutions en vrac (qui valent ce qu'elles valent) :
    1 Methodes bourrine (et moche) : passer par un parametre de la page => adresse de la page : default.aspx?req=SELECT... Bien sur, tu pourras passer par un encodage quelconque pour ne pas passer directement une requete. Mais c pas terrible
    2 Encapsuler tes pages. L'idée, c'est que ce soit la meme page qui affiche les différents ecrans de maniere dynamique. Comme ca, les changements se feront sur postback et le viewstate sera maintenu. Mais ca peut necessiter pas mal de modifs...


    Bref, à mon avis, la solution la plus simple qui necessite pas trop de boulot reste la variable session.

  10. #10
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par zooffy Voir le message
    @hwoarang : bon, ben j'ai testé et ça marche pas !!!
    QU'est ce qui ne marche pas? Poste un bout de code parce que le pb vient surement d'ailleurs.

    Citation Envoyé par zooffy Voir le message
    J'ai mis en oeuvre la version avec variable de session, ça marche bien, dans l'absolu. Reste à voir le comportement d'une telle variable en production.
    Je le vide juste aprés son utilisation, comme ça au mins je suis presque pénard, mais je garde un léger doute.
    La variable session a une durée de vie correspondant à la session de l'utilisateur. Elle est donc differente pour chaque client qui se connecterait mais commune si un client ouvre plusieurs onglets avec le meme explorateur (je souligne ce cas parce que c'est celui qui pourrait te poser probleme). Si ca ne pose pas de pb, ca roule!

    Pour rappel :
    - Variable Application : durée de vie de l'application complete et commune à tous les clients qui se connectent. Ces variables sont stockées sur le serveur. Exemple : Pour stocker les infos de connexion à la BDD)
    - Variable Session : durée de vie de la connexion du nouveau client jusqu'a sa deconnexion. Ces variables sont stockées sur le serveur. Exemple : stocker la langue de l'utilisateur.
    - Variable Viewstate : durée de vie de la page en cours de visu (donc perdues si raffraichissement). Ces variables sont stockées sur la page - elles font donc des allers-retours client-serveur. Exemple : la couleur d'un bouton ou l'id de l'element affiché.

  11. #11
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour ton aide hwoarang.

    Tu as bien fait de souligner la portée de la variable de session car je ne savais pas bien ce qu'il se passait avec les différents onglets.
    Et du coup, oui, ça me pose un souci car pas mal de gens, dans le cadre de recherche immobilière, ouvre plusieurs onglet pour avoir un aperçu selon différents critères.

    Alors, du coup, vu les portées, c'est vraiment le ViewState qu'il me faut.

    Alors, ça marche pas, c'est que je ne récupère pas le contenu du ViewState, mais je pense que je ne dois pas savoir le gérer tout simplement.

    Je vais tenter de t'exposer simplement le princpe de mon système, car je ne programme pas de manière standard (j'ai même ouvert un blog pour expliquer tout ça, mais j'arrive pas à trouver le temps de le remplir !!!)

    Alors j'ai une page Default.aspx qui est appellée en permanence, non pas sur toutes les pages D'UN site, mais sur toutes les pages de TOUS LES SITES de mon serveur.

    Là, c'est la clé du système. Je te passe le volume de code qui se trouve derrière ce truc et qui me permet d'exploiter un DAL commun, des Méta et des modifications de design à la vollée, juste pour donner quelques exemples.
    En gros le système me permet de fabriquer un site (hors design) en 1 heure chrono avec tout ce qu'il faut dedans pour produire du texte, des images, le référencement, l'accès aux données, l'inscription de membre (avec toute la gestion de leur compte) et plein de module métier sur plein de sujet.

    Bon, descendons dans le pragmatisme :
    - une page Default.aspx qui contient des ContentPalceHolder
    - un composant ascx qui contient un formulaire (avec son bouton)
    - un composant ascx qui contient un GridView

    Voilà, le schéma simple du souci actuel. Je te passe le code de la page Default (sauf si tu veux le voir), je te passe le code du formulaire côté HTML (pareil sauf si tu veux le voir) et je te passe le code de mise en place du GridView (toujours sauf si tu veux le voir)

    Donc, dans mon formulaire j'ai des DDL, des TexteBox, bref du classique.
    Je construis ma requête SQL en String pour y coller les paramettres de la Procédure Stockée en fonction de champs de formulaire remplis (ou pas).

    Ensuite je voudrais donc récupérer cette String et l'envoyer dans le SelectCommand du SQLDataSource du GridView, tout simplement, mais juste sur le temps de la page.

    Donc sur le click du bouton de formulaire je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ViewState("rq") = "EXEC dbo.IMMO_SelectionBienRecherche " & ddlTypeBien.SelectedValue & ", " & ddlTypeTransac.SelectedValue & ", " & PrixMini & ", " & PrixMaxi & ", " & PieceMini & ", " & PieceMaxi & ", " & dacVille.IdVille
    Bien sur il y a le travail de remplissage des variables que tu vois juste au dessus de ça. Cette ligne est la dernière de la Sub qui gère le click

    Et dans le Init du composant qui contient de GridView je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    With sdsListeBien
                .SelectCommandType = SqlDataSourceCommandType.Text
                If ViewState("rq") <> "" Then
                    .SelectCommand = Session("rq")
                Else
                    .SelectCommand = "EXEC dbo.IMMO_SelectionBienDefault"
                End If
            End With
    En gros ça fait quoi : s'il y a un truc dans le ViewState, c'est le requête, donc on la prends, sinon, il faut envoyer la sélection par défaut.

    Et lorque que je click sur le bouton, il ne se passe rien, j'ai toujours la sélection par défaut, jamais la requête du ViewState.

    Je dois me gaufrer quelque part, mais je vois pas où.

    Vois tu la chose ?

  12. #12
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    La réponse est dans la question

    Et dans le Init du composant qui contient de GridView je mets :
    Dans le init, le viewstate n'est pas disponible. Il faut deplacer ton code dans le onload (si tu peux)

    Un article interessant sur le life cycle (c'est celui d'une page mais celui d'un composant n'est pas tres différent) :
    http://dotnet.developpez.com/faq/asp...ge=wflyfecycle

    a+

  13. #13
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Je dois avoir un souci, ça ne marche pas mieux.
    Dans mon test, il passe pas, il détecte que le ViewState("rq") est égale = ""

    C'est ennuyeux parce que je vois pas bien où il ne se rempli pas.

  14. #14
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Bon bah falloir mettre les mains dans le cambouis alors.

    Le premier truc a verifier, c de mettre un breakpoint dans les fonctions loadviewstate et saveviewstate du composant ou tu sauves la requete pour t'assurer que ta requete est bien sauvée puis récupérée.

    Si elle n'est pas récupérée, il faut verifier que l'id du composant ou tu as sauvé le viewstate n'a pas changé !! Cela arrive en particulier pour les composants créés dynamiquement dans le code-behind (vu l'architecture de ton site, il est probable que ce soit le cas).

    Il ne faut pas oublier non plus que dans le life cycle, les control events arrivent apres le load. Donc, si tu charges ta requete sur la callback d'un bouton, il faut re-binder ton composant s'il est bindé dans le load.

  15. #15
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour ton aide.

    Alors premier souci : je ne trouve pas les fonctions que tu évoques dans les évènements de page du composant.

    Donc je suis remonté jusqu'à ma page Default.aspx et j'ai trouvé une fonction SaveStateComplete dans la laquelle j'ai placé mon outil de logage (vu l'archi de mon site je ne peux pas utiliser les BreakPoint mais le logage fais la même chose).
    Dans cette fonction la variable ViewState("rq") est vide aprés le click sur le bouton du formulaire.

    Deuxième souci : j'ai tout de même cherché à vérifier l'Id des composants. Je ne sais pas trop comment faire, car je ne maitrise pas totalement cette histoire d'ID.
    En tout cas, dans le code interprété je vois toujours la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <table id="ctl00_cphGauche_RechercheBien1003_tblRechercheBien"
    la table est le premier contrôle posé dans le composant du formulaire. Par contre je n'ai rien concernant le composant lui même.
    Si on décortique l'ID de cette table je reconnais pas mal de chose :
    ctl00_ : ça je sais pas trop d'où ça vient.
    cphGauche_ : ça c'est le nom du ContentPlaceHolder dans la MasterPage
    RechercheBien1003_ : ça c'est le nom du composant suivi de son identifiant dans le base de donnée. Lorsque je Parse mon composant pour l'insérer dans la page je concatène pour avoir un identifiant unique. Parfois je mets plusiuer le même composant dans la page.
    tblRechercheBien : ça c'est l'Id de la table que je place en premier dans le composant, côté HTML

    Lorsque tu parles de Binder le composant, tu entends le Parser ?
    Si c'est le cas, c'est une opération qui est déclenchée dans le PageInit de la page Default.aspx sans gestion du PostaBack, donc quoi qu'il arrive, c'est fait.
    Le souci vient peut-être de là ?

    Mais s'il faut changer ça, une, je ne sais pas trop comment faire, et deux, plus grave, je n'ai aucune idée des effets de bords que cela va avoir.

    Si tu as une idée, je suis preneur.

  16. #16
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Alors premier souci : je ne trouve pas les fonctions que tu évoques dans les évènements de page du composant.
    Elles existent dans tout composant html asp (les System.Web.UI.WebControls):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    protected override object SaveViewState();
    protected override void LoadViewState(object savedState);
    Citation Envoyé par zooffy Voir le message
    Deuxième souci : j'ai tout de même cherché à vérifier l'Id des composants. Je ne sais pas trop comment faire, car je ne maitrise pas totalement cette histoire d'ID.
    Pour le voir, tu peux utiliser dans le code behind monComposant.ID; Attention, cet ID ne correspond pas à ce que tu vois en regardant le source de ta page ! (pour cela, c'est monComposant.ClientID

    Citation Envoyé par zooffy Voir le message
    En tout cas, dans le code interprété je vois toujours la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <table id="ctl00_cphGauche_RechercheBien1003_tblRechercheBien"
    Ca, ca ressemble à un ID de composant créé en code behind. Les remarques que j'ai faites s'appliquent donc.

    Citation Envoyé par zooffy Voir le message
    Lorsque tu parles de Binder le composant, tu entends le Parser
    Non. J'entends binder. C'est à dire appeler monComposant.DataBind(); Cette fonction permet au composant de savoir qu'il faut lire sa source de données pour recuperer les données à afficher. Mais bon, si ton probleme est que tu ne recupere pas ton viewstate, ce n'est pas ca le probleme. Le databind, ce sera le probleme suivant, quand tu reussiras à recupérer ta requete mais que les enregistrements dans la table ne correspondront pas

    J'imagine que tu l'as deja verifié mais est ce que tu es sur que ta variable Viewstate["rq"] est bien positionnée ?
    Si oui, tu as mis le code qui le positionne dans quelle fonction ? Et le code qui la lit ?

  17. #17
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Elles existent dans tout composant html asp (les System.Web.UI.WebControls):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    protected override object SaveViewState();
    protected override void LoadViewState(object savedState);
    Alors pour ça, j'ai cherché dans la liste des déclarations des Page événements (la liste déroulante en haut de la zone de codage dans VS) et j'ai pas trouvé.
    Du coup je me suis risqué à taper du code et j'ai fini par faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Protected Overrides Function SaveViewState() As Object
            Return MyBase.SaveViewState()
        End Function
     
        Protected Overrides Sub LoadViewState(ByVal savedState As Object)
            MyBase.LoadViewState(savedState)
        End Sub
    Mais maintenant, je ne sais pas quoi en faire.

    Citation Envoyé par hwoarang Voir le message
    Pour le voir, tu peux utiliser dans le code behind monComposant.ID; Attention, cet ID ne correspond pas à ce que tu vois en regardant le source de ta page ! (pour cela, c'est monComposant.ClientID
    Là, j'ai un souci car je n'ai pas d'objet de type monComposant, en fait.
    Mais bon, je vais chercher.
    La vraie question, sur ce point, c'est : ou est-ce que je place ce code ?
    Dans le Init du composant du formulaire ?

    Citation Envoyé par hwoarang Voir le message
    J'imagine que tu l'as deja verifié mais est ce que tu es sur que ta variable Viewstate["rq"] est bien positionnée ?
    Si oui, tu as mis le code qui le positionne dans quelle fonction ? Et le code qui la lit ?
    Heu, comment dire, là non, je n'ai aps vérifier ça car je ne comprends pas à quoi cela correspond.
    Comment on "positionne" une variable ViewState ?
    Donc, les deux autres questions, je sais pas !

    Merci pour ton aide et désolé de ne pas capter plus vite.

  18. #18
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Là, j'ai un souci car je n'ai pas d'objet de type monComposant, en fait.
    Mais bon, je vais chercher.
    La vraie question, sur ce point, c'est : ou est-ce que je place ce code ?
    Dans le Init du composant du formulaire ?
    Non, ca c'est juste un exemple pour dire que si tu regardes le source de ta page, l'ID ne correspondra pas à composant.ID. Mais monComposant n'est pas un type, c'est n'importe quel composant web.

    Citation Envoyé par zooffy Voir le message
    Heu, comment dire, là non, je n'ai aps vérifier ça car je ne comprends pas à quoi cela correspond.
    Comment on "positionne" une variable ViewState ?
    Donc, les deux autres questions, je sais pas !
    Je veux dire est ce que tu as mis une trace la ou tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ViewState("rq") = "EXEC dbo.IMMO_SelectionBienRecherche " & ddlTypeBien.SelectedValue & ", " & ddlTypeTransac.SelectedValue & ", " & PrixMini & ", " & PrixMaxi & ", " & PieceMini & ", " & PieceMaxi & ", " & dacVille.IdVille
    pour etre sur que tu y passes


    Sinon, une page sur laquelle je suis tombé par hasard mais qui peut t'aider :
    http://geekswithblogs.net/AzamSharp/.../03/52331.aspx

    a+

  19. #19
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Pour être bien sûr, j'ai mis une trace en dur.
    Donc le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Logage("Avant : " & ViewState("rq"))
            ViewState("rq") = "EXEC dbo.IMMO_SelectionBienRecherche " & ddlTypeBien.SelectedValue & ", " & ddlTypeTransac.SelectedValue & ", " & PrixMini & ", " & PrixMaxi & ", " & PieceMini & ", " & PieceMaxi & ", " & dacVille.IdVille
            Logage("Aprés : " & ViewState("rq"))
    Pour info, Logage() fait un truc tout simple : il prend la String qui est en paramettre et l'inscrit dans un fichier texte. Du coup, je peut voir plein de truc grâce à ça sans perturber le fonctionnement du code.

    Et je résultat dans le fichier texte, aprés avoir cliquer sur le bouton du formulaire est le suivant.
    Pour l'application : www.immo.maison : 18/02/2011 10:28:48 : Avant :
    Pour l'application : www.immo.maison : 18/02/2011 10:28:48 : Aprés : EXEC dbo.IMMO_SelectionBienRecherche 0, 0, 0, 10000000, 0, 100, 0
    La requête est bonne, elle correspond à ce que j'attends.

    Mais une fois la page rechargée a variable ViewStat("rq") est vide dns le composant du GridView.

    C'est là que je décroche.

  20. #20
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Deja tu passes dans la fonction qui sauve la requete, ca elimine pas mal de causes.

    Maintenant, la question, c'est dans quelle fonction tu as mis cette sauvegarde de requete et dans quelle fonction tu la lis ?

Discussions similaires

  1. [AJAX] Transmission de variable, j'ai pas tout compris
    Par msg_dracula dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/07/2007, 00h15
  2. Réponses: 1
    Dernier message: 28/03/2007, 19h13
  3. je n ai pas tout compris dans le script
    Par letigre dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2006, 10h44
  4. bouton et bitmap - a pas tout compris
    Par mat_monroe dans le forum MFC
    Réponses: 7
    Dernier message: 20/06/2006, 15h25

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