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 :

Global.asax et "variables de requêtes"


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Global.asax et "variables de requêtes"
    Bonjour,

    Je viens de lire ce très bon cours que le Global.asax et il pourrait bien résoudre un de mes problèmes, mais pour le moment, je patauge un peu. Voici l'histoire...

    Je voudrais, dans le Global.asax, déclarer une variable publique, mais non statique (qu'elle ne soit accessible que pendant la durée de la requête) et l'initialiser dans la méthode Application_BeginRequest. Jusque là, très bien.

    Seulement après, je voudrais pouvoir m'en servir partout dans mon code (y compris dans ma bibliothèque). J'ai lu que pour accéder aux variables de la classe Global, il suffisait de faire "Global.<nom de la variable>" seulement, cela ne fonctionne pas... Il me dit tout simplement à la compilation que "Global" n'existe pas dans le contexte courant... Ai-je loupé quelque chose ?

    Voici mon code du Global.asax (très simple pour le test) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <script runat="server">
    	public int Test = 0;
     
    	void Application_BeginRequest(object sender, EventArgs e)
    	{
    		Test = 0;
    	}
    </script>
    Et dans ma page test.aspx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <p id="test" runat="server"></p>
     
    <script runat="server">
    	protected override void OnInit(EventArgs e)
    	{
    		base.OnInit(e);
     
    		this.test.InnerHtml = "test : " + Global.Test;
    	}
    </script>
    Est-ce que quelqu'un saurait me dire comment accéder à cette variable définie dans Global ?

    Merci d'avance

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static int Test = 0;
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int x = Global.Test;

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse, mais ça ne fonctionne pas. Comme je le disais, dans ma page aspx, le "Global" que l'on me dit partout d'utiliser n'est pas connu dans le contexte et je me fais jeter lors de la compilation...

    De plus, je ne veux pas de variable statique, mais ça c'est un autre problème.

    J'ai fini par trouver une solution finalement, on peut accéder aux attributs publics définis dans le Global.asax par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HttpContext.Current.ApplicationInstance.<nom de l'attribut public>;
    Soit dans mon cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int x = HttpContext.Current.ApplicationInstance.Test;
    Cependant, avec cette méthode directement, il est difficile d'accéder à ces attributs dans une bibliothèque de classes (contenu dans un autre projet) puisque l'ApplicationInstance est en fait de type "ASP.global_asax" pas évident à trouver lorsque l'on est pas dans le projet du site.

    J'ai choisi la méthode suivante : dans ma bibliothèque, j'ai défini une classe BaseApplication dérivant de HttpApplication qui contient mes attributs, les propriétés publiques et les méthodes qui vont avec. Ensuite, dans le fichier Global.asax, j'indique que ASP.global_asax hérite de BaseApplication et le tour est joué, j'ai accès à mes propriétés publiques (c'est quand même plus joli que des attributs publics, surtout s'ils ne doivent pas être modifiés directement, ce qui est mon cas).

    Concrètement, voici ce que ça donne pour ma classe BaseApplication :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    namespace MonNameSpace
    {
    /// <summary>
    /// Classe héritant de HttpApplication.
    /// Ajoute des propriétés et des comportement à l'objet HttpApplication par défaut.
    /// Global.asax doit hériter de cette classe.
    /// </summary>
    public class BaseApplication : HttpApplication
    {
    	/// <summary>
    	/// Attribut privé.
    	/// </summary>
    	private int m_iTest;
     
    	/// <summary>
    	/// Fonction indiquant les opérations à effectuer au début d'une requête.
    	/// </summary>
    	void Application_BeginRequest(object sender, EventArgs e)
    	{
    		// Je ré-initialise mes attributs.
    		this.m_iTest = 0;
    	}
     
    	/// <summary>
    	/// Renvoie la valeur de l'attribut privé.
    	/// </summary>
    	public int Test
    	{
    		get { return this.m_iTest; }
    	}
     
    	// Ajouter les méthodes de gestion de l'attribut
    	// ou d'autres méthodes d'événements qui l'affecteront automatiquement.
     
    	/// <summary>
    	/// Renvoie l'application courante convertie en BaseApplication, comme ça pas de cast à faire.
    	/// </summary>
    	public static PftlApplication Current
    	{
    		get { return (BaseApplication)HttpContext.Current.ApplicationInstance; }
    	}
    }
    }
    Et dans mon Global.asax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <%@ Application Language="C#" inherits="MonNameSpace.BaseApplication" %>
     
    <script runat="server">
    	// Ajouter ici les méthodes d'événement propre au site courant.
    	// (par exemple la gestion des erreurs non gérées)
    </script>
    Ensuite, depuis n'importe quel endroit de mon code (page aspx, control ascx, classe du App_Code ou classe de ma bibliothèque), je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int x = MonNameSpace.BaseApplication.Current.Test;

    Voilà, en espérant que ça servira à d'autres

    C'est peut-être pas la meilleure méthode, mais elle me plaît bien

  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
    En fait, on te disait pas d'utiliser Global, mais bien le nom de l'objet de ton application ASP.NET qui dérive de HttpApplication.

    Le fait que cette classe s'appelait Global par défaut vient de VS.NET 2003 qui utilisait un Global.asax.cs avec une public class Global : HttpApplication par défaut. Depuis 2005, on ne peut plus faire de code-behind sur un Global.asax et donc la classe rejoint App_Code\ et en général le nom du projet.

    Au lieu de t'embêter à utiliser les instances, il est plus simple de passer par des membres static. Ca raccourci un peu le code à écrire pour accéder aux membres.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Aaaah... Ok... Bon, je comprends pas bien pourquoi les gens ne répondent pas ça directement quand on dit que le "Global." ne fonctionne pas (je suis pas la seule, j'ai trouvé plusieurs autres topics où la même question étaient posée, et jamais ils n'ont eu la réponse que tu viens de me donner) mais bon.

    Bref, merci pour ta réponse, mais en fait, les variables statiques ne m'arrangent pas, car (si j'ai bien compris, mais je l'avoue, j'ai du mal avec tous ces concepts) elles valent pour toute l'application, et moi je veux des variables qui ne valent que pour la requête courante.

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

Discussions similaires

  1. Les quotes dans ma requête "select"
    Par Jonathan_pingu dans le forum SQL
    Réponses: 37
    Dernier message: 14/05/2009, 10h53
  2. Accéder aux variables static du Global.asax
    Par tscoops dans le forum ASP.NET
    Réponses: 3
    Dernier message: 10/04/2007, 14h41
  3. rechercher variable contenant une quote
    Par fins51 dans le forum Access
    Réponses: 2
    Dernier message: 21/03/2007, 22h20
  4. Réponses: 3
    Dernier message: 20/01/2007, 20h36

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