2008-10-30 26 views

Répondre

17

Vous pouvez accéder à la classe comme ceci:

((Global)this.Context.ApplicationInstance).Roles 
+1

Cette idée a fonctionné pour moi mais j'ai dû modifier légèrement votre exemple: ((global_asax) Context.ApplicationInstance) .Roles Pour une raison quelconque dans mon projet l'article global.asax avait type global_asax. – minty

+5

Il m'a fallu du temps pour comprendre pourquoi cela ne fonctionnait pas pour les propriétés qui sont destinées à vivre pendant toute la durée de l'application. Par exemple: Si vous créez "Rôles" dans l'exemple ci-dessus dans "Application_Start", l'utilisation de ApplicationInstance pour accéder à la propriété "Roles" peut échouer car il n'y a pas une seule "instance d'application globale" pour chaque requête. Pour avoir des propriétés globalement existantes dans global.asax, ces propriétés doivent être statiques. Le blog suivant m'a beaucoup aidé à comprendre ce qui se passe: http://odetocode.com/articles/89.aspx – Slauma

+0

global_asax crée un conflit. Et le type global ou namspace n'est pas trouvé. Que devrais-je faire? –

3

Il me semble que cela dépend uniquement de la session - alors pourquoi ne pas en faire une paire de méthodes statiques qui prennent la session en paramètre? Ensuite, vous pouvez transmettre la valeur de la propriété "Session" de la page.

+0

Désolé, j'ai downlisté votre message. Comme je l'ai pensé, vous avez totalement raison. Je veux passer mon vote à un upvote mais stackoverflow ne me laissera plus. Veuillez accepter mes remerciements à la place. – minty

+0

@minty: Il suffit de cliquer sur le vote en surbrillance et il l'annulera. Cela peut vous permettre d'augmenter votre vote après. –

+0

C'est une bonne idée, mais envelopper la valeur dans une propriété peut aider à la protéger contre l'utilisation abusive. Bien sûr, si la variable de support est dans la session, vous devez toujours vous préoccuper de l'accès direct des personnes. – Trisped

2

S'il s'agit d'une propriété dont vous avez besoin d'accéder à toutes les pages, mieux vaut peut-être définir une page de base dans laquelle toutes vos pages doivent avoir accès à la propriété Session. autres pages étendues ...

par défaut

public partial class _Default : System.Web.UI.Page 
{ 
} 

Ce que vous pouvez faire est d'ajouter un BasePage.cs à votre dossier App_Code

public class BasePage : System.Web.UI.Page 
{ 
    public List<string> Roles 
    { 
     get { ... } 
     set { ... } 
    } 
} 

Et puis ont vos pages étendent ce.

public partial class _Default : BasePage 
{ 
} 
+0

Comment cela affecterait-il le concepteur de studio visuel, etc.? – minty

0

Si les valeurs dépendent de la session alors ceci est en fait simple en utilisant le HttpContext.Items Dictionnaire:

place ce code dans le Global.asax pour stocker la valeur:

Dim someValue As Integer = 5 
Context.Items.Add("dataKey", someValue) 

Laissez retreive dans une page avec ce code:

Dim someValue As Integer = CType(HttpContext.Current.Items("dataKey"), Integer) 

est ici un lien qui décrit plus en détail: http://aspnet.4guysfromrolla.com/articles/060904-1.aspx

1

Hey, je suis éclater ma cerise stackoverflow.com! Ma première réponse après s'être caché pendant un mois.

Pour accéder à une propriété définie dans votre classe mondiale, utilisez une des opérations suivantes:

  • la propriété d'application définie dans les deux HttpApplication et des classes (par exemple la page Page.Application [ "TestItem"])

  • la propriété HttpContext.ApplicationInstance (par exemple HttpContext.Current.ApplicationInstance)

Avec ces deux, vous pouvez c ast le résultat à votre type global et accéder à la propriété dont vous avez besoin.

0

Sur le global.asax lui-même pour .net 3.5 j'ai utilisé typeof (global_asax) et cela a fonctionné très bien. Et, ce qui m'a amené ici, c'était l'implémentation des exemples DotNet OpenID. J'ai changé certains d'entre eux pour utiliser le cache de l'application comme Will suggéré.

1

Vous pouvez également utiliser la syntaxe suivante:

((Global)HttpContext.Current.ApplicationInstance).Roles 
0

Pour d'autres couches de projet, il est impossible d'avoir global en tant que classe:

dynamic roles= ((dynamic)System.Web.HttpContext.Current.ApplicationInstance).Roles; 
if (roles!= null){ 
    // my codes 
} 

Juste je dois être sûr que le La propriété Roles dans la classe Global ne change jamais. et une autre façon est par réflexion.

Questions connexes