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 :

Navigation dans 2 onglets/fenêtres = problème gestion session


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut Navigation dans 2 onglets/fenêtres = problème gestion session
    Bonjour,

    Nous utilisons ASP.Net pour des applications de gestion, en stockant les paramètres en session, pour les transmettre d'une page à l'autre.
    Problème : si l'utilisateur ouvre l'appli dans un 2e onglet ou une 2e fenêtre du navigateur, les variables de session sont écrasées. Quand on revient sur le 1er onglet, les données affichées ne sont plus du tout en phase avec les paramètres en session, et ça devient vite le bazar.

    Je vois 2 pistes :
    - Passer les paramètres de page à page par autre mécanisme que la session
    => Par le ViewState ?? Mais comment, puisqu'il est au niveau des composants, et pas au niveau de la page ?
    - Réussir à détecter que l'utilisateur a ouvert un nouvel onglet/fenêtre, et générer un identifiant différent pour chaque onglet, qui sert de suffixe aux clefs des variables stockées en session.
    => C'est à priori possible de détecter l'ouverture d'un nouvel onglet en jouant avec le window.name côté client. Mais j'ai ensuite des difficultés à remonter l'info côté serveur. J'y arrive en ajoutant dynamiquement un champs caché dans le formulaire, mais si la personne modifie l'URL et valide, on est en GET (et non plus en POST), et le champs caché ne remonte pas vers le serveur, on n'a donc plus accès aux variables en session !

    J'ai fait des recherches et des tests dans ces 2 sens, mais je n'arrive à rien de concret.

    Quelqu'un aurait-il trouvé une solution à cette problématique (sur une de ces 2 pistes ou sur toute autre idée), ou des infos pour me mettre sur le bon chemin ?

    Merci d'avance.
    Marine

  2. #2
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    En ouvrant deux onglets tu te retrouves avec l'accès à la même session. Donc si dans chacun des onglets tu accèdes aux mêmes objets stockés en session, il risque en effet d'y avoir du grabuge!

    Si tu passes d'une page test1.aspx à test2.aspx, tu vas perdre ton viewstate car celui ne fonctionnera qu'en circuit fermé sur une page en postback.

    Pour ton cas, afin de ne pas tout redevelopper, je penserais à développer ta propre méthode de persistance. Pour cela tu peux t'appuyer sur ce qui existe déjà mais en y rajoutant un couche supplémentaire. Je m'explique.

    Si dans ta session, tu as un objet A. Ce qu'il faut c'est que ton objet A soit différencié pour chacun des onglets qui ouvre ton application. de façon a avoir A et A' et ainsi éviter les problèmes.

    Concrètement, la seule façon de le faire est d'envoyer une information dans ton querystring , un identifiant qui te permettrait de savoir à quel objet ( A ou A') la navigation demandée par le client fait référence.Ensuite par exemple un listDictionnary ou une hashtable te permettront de stocker tes différents objets A et d'y accéder en fonction de l'identifiant compris dans ta querystring.

    Cela signifie aussi trouver un systeme pour changer cet identifiant à chaque demande (postback ou changement de page), car si quelqu'un copie une Url d'un onglet dans un nouvel onglet, Il va falloir partir de l'objet qui existe déjà et le copier afin de lui faire subir (peut etre) des modifications que l'objet initial ne doit pas subir afin de lui permettre de continuer son propre chemin.

    Bref, je te souhaite pas mal de plaisir, cela semble intéressant au moins à faire.

    si tu as des questions n'hésites pas, c'était ma pensée du soir, juste avant le repas, j'ai faim, et je suis peut etre passé a coté de deux trois trucs plus simples

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut
    Merci beaucoup pour cette pensée du soir, Arthis ! ;-)

    C'est en effet la piste la plus sérieuse que j'ai trouvée. J'ai fait des tests en ce sens cet après-midi :
    Sur le Body/OnLoad, j'exécute une fonction JavaScript :
    - si window.name est vide, je génère un identifiant (heure courante) que je stocke dans window.name, car cette valeur ne bougera pas durant toute la navigation dans cet onglet, et elle sera systématiquement vide quand j'ouvrirai un nouvel onglet ou une nouvelle fenêtre.
    - Puis, dans tous les cas (toujours dans le unload), j'ajoute (ou je remplace) dans l'URL, un paramètre "MonParam" avec pour valeur cet identifiant
    Côté serveur, je peux alors récupérer cet identifiant, et je l'utilise comme suffixe à mes noms de variables de session :
    Session["UnObjet" + IdentifiantOnglet] = uneValeur;

    Dans la théorie (car je ne suis pas allée jusqu'au bout), je suppose que ça pourrait marcher. Mais j'ai été confrontée à un problème de droit d'accès à la page :
    http://localhost/MonSite/Accueil.aspx fonctionne, mais
    http://localhost/MonSite/Accueil.asp...aram=UneValeur m'amenais sur une page d'erreur.
    J'en suis restée là, d'autant que l'idée d'avoir un paramètre dans le QueryString (visible par l'utilisateur) me plait moyennement.
    Si je n'ai aucune autre piste, je serai peut-être obligée de persévérer là-dessus.

    Qu'en penses-tu, Arthis ?

    D'autres idées ou expériences peut-être ?

  4. #4
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    soit du querystring soit un champ hidden et transmettre tes infos par post plutôt que par get. mais dans ces cas la la navigation entre deux pages ne pourrait se faire que via l'intermédiaire d'un formulaire.

  5. #5
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Salut,

    tu peux aussi essayer de stocker dans le viewstate/quesystring de ta page un guid, et préfixer tes identifiants de session par ce guid.

    On le fait sur une grosse appli en ce moment, ca marche pas mal

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut
    Arthis,
    j'ai essayé aussi via un HiddenField. Mais ce qui me gêne, c'est que je ne suis pas sûre qu'on soit en GET dans tous les cas de figure. Par exemple quand l'utilisateur saisit l'URL dans son navigateur, on est en GET.

    Philippe,
    As-tu une idée (un bout de code) sur la façon de stocker le GUID dans le ViewState ? J'ai voulu faire quelque chose comme ça tout à l'heure, mais je me suis aperçue qu'il n'y avait pas de propriété ViewState sur l'objet Page. Alors comment accéder au ViewState (de façon générique de préférence) ?
    Et sur votre projet, comment vous-y êtes vous pris plus précisément ?

    Merci encore pour votre aide !

Discussions similaires

  1. Navigation dans une même fenètre (Page ? Frame ? User Control ? Navigate ?)
    Par te8teur dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 12/03/2014, 19h43
  2. Problème Gestion Session Intraweb
    Par Ouail1825 dans le forum Web & réseau
    Réponses: 1
    Dernier message: 04/12/2013, 08h44
  3. problème gestion session
    Par OLman135 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 12/10/2011, 17h14
  4. [A-00] Navigation dans des onglets
    Par ellak dans le forum IHM
    Réponses: 3
    Dernier message: 10/10/2008, 06h32
  5. Problème disparition fenêtre dans un onglet
    Par tiboo dans le forum MFC
    Réponses: 3
    Dernier message: 14/02/2008, 11h48

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