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 :

Pb : propriété static conservée au chargement de la page


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
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Par défaut Pb : propriété static conservée au chargement de la page
    Bonjour,

    Je suis en train de développer un contrôle web, et j'ai un petit soucis concernant la propriété ID : Si ce contrôle est ajouté par l'IDE de Visual studio, pas de problème un ID unique est attribué par l'éditeur. Mais si ce contrôle est ajouté à la page par code, et que le développeur ne précise pas l'ID alors cette propriété reste null, ce qui rend le fonctionnement de la couche Javascript associé impossible. J'avais donc ajouté le code suivant :
    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
     
    public class MonControle : System.Web.UI.Control {
        static int lastUid;
     
        ....
     
        public MonControle {
            this.ID = "MonControleAuto" + (lastUid ++).toString();
            ....
        }
     
        static MonControle {
            lastUid = 0;
        }
    }
    Comme cela, un ID était attibué, avec la garantie d'être unique. Si l'utilisateur fixe ensuite un ID manuellement alors tant mieux, sinon l'ID auto permettait le fonctionnement normal du code Javascript associé

    MAIS :
    La propriété static lastUid est conservée même après un rechargement de page. Pire encore, il n'est même pas lié à une session car tous les utilisateurs se partagent cette propriété... Donc on rique d'atteindre assez rapidement un dépassement de capacité

    Ma question :
    Comment faire en sorte que cette propriété ne soit pas conservée entre deux chargement de page ? (Etant donné que c'est un contrôle que je développe, je ne peux pas utiliser l'évènement Page_Load)
    Ou bien comment attribuer un ID unique par défaut ?

    Dans le pire des cas, je gère le problème comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected override void Render(System.Web.UI.HtmlTextWriter output) {
       if (this.ID == null) {
           output.write ("Erreur ID non défini");
           return;
       }
       ....
    }
    Mais c'est dommage de le forcer à attribuer cet ID.

    PS : J'avais essayé ceci avant de passer par une propriété static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class MonControle : System.Web.UI.Control {
        ....
     
        public MonControle {
            this.ID = "MonControleAuto" + (new Random()).Next().ToString();
            ....
        }
    }
    Mais en créant deux controles l'un derrière l'autre, ils héritaient du même ID (différent à chaque changement de pagde grâce à Random, mais identique à chaque fois pour les deux objets)

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Un truc qui devrait fonctionner avec le framework 2.0 :

    Page contient un IDictionnary Items. Tu peux donc faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    protected override void Render(System.Web.UI.HtmlTextWriter output) {
       if (this.ID == null) {
           int nextid = 0;
           if(Page.Items.Contains("SpecialControlId")) {
               nextid = (int)Page.Items["SpecialControlId"];
               Page.Items["SpecialControlId"] = nextid + 1;
           } else {
               Page.Items.Add("SpecialControlId", 1);
           }
           this.ID = "SpecialControl_" + nextid;
       }
       base.Render(output);
    }
    Si tu dois réutiliser cet ID dans un PostBack, il faudrait bien entendu le sauvegarder dans le ViewState car cette méthode ne garantit pas que le même contrôle dans deux PostBack successifs aient le même ID.

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Tu déclares pas ta variable static et c'est fini

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Autre solution : tu forces le constructeur de ton Control à avoir un ID.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    Tu déclares pas ta variable static et c'est fini
    Oui, mais si elle n'est pas de type static alors elle ne sera plus commune à toutes les instances du contrôle.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Par défaut
    Merci à tous pour vos réponses....

    Je vais étudier tout cela

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par frochard Voir le message
    Oui, mais si elle n'est pas de type static alors elle ne sera plus commune à toutes les instances du contrôle.
    Je pense pas que ça soit génant

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Lui ne va pas oublier de mettre l'ID. C'est d'autres dev = son contrôle est dans une bibliothèque utilisable par d'autres personnes. Autant si toi tu dev tu peux te rajouter une variable dans ta Page qui n'est pas statique, autant tu ne peux pas demander à d'autres dev de le faire. C'est comme ça que j'ai compris son problème.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    Page contient un IDictionnary Items.
    Merci, cela fonctionne bien... Cela évitera les erreurs de scripts (Javascript) qui se produisaient si plusieurs contrôles identiques étaient placés sur une page (sans donner d'ID).
    Maintenant, si l'utilisateur du contrôle veut utiliser le postback, il est évident qu'il sera obligé de donner un ID valide et fixe

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Une Page reste une classe : donc un membre static est commun à toute l'application.

    Je n'ai pas exactement compris ton problème, car je ne me rapelle pas l'avoir eu...

    Mais voici un article qui pourrait t'intéresser :
    http://www.dotnetguru2.org/amethyste...&c=1&tb=1&pb=1

    Il y a une fonction EnsureId() décrite à la fin :
    Même si son emploi est assez rare, on dispose de la méthode EnsureID() qui assure que tous les contrôles disposent d’un ID.

    Pour cette histoire d'ID sinon : pour moi ce n'est pas le control qui doit créer ni vérifier son ID, mais la page.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Par défaut
    Citation Envoyé par Chubyone Voir le message
    Une Page reste une classe : donc un membre static est commun à toute l'application.
    Effectivement, je n'y avait pas pensé. Vu de cette manière c'est logique

    Citation Envoyé par Chubyone Voir le message
    Pour cette histoire d'ID sinon : pour moi ce n'est pas le control qui doit créer ni vérifier son ID, mais la page.
    Je suis tout à fait d'accord. Si le développeur fait son travail correctement, il doit assigner un ID valide. Mais dans le cas contraire, gérer cette négligence au niveau du contrôle peut être utile ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/10/2011, 09h26
  2. Cycle de vie d'une propriété "static final"
    Par andlio dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 06/07/2011, 15h26
  3. Réponses: 1
    Dernier message: 22/06/2010, 16h09
  4. Réponses: 4
    Dernier message: 08/06/2004, 09h01
  5. Attendre la fin du chargement de la page dans un WebBrowser
    Par core1 dans le forum Web & réseau
    Réponses: 5
    Dernier message: 15/06/2003, 04h12

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