2008-10-30 16 views

Odpowiedz

17

można otworzyć klasę tak:

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

Ten pomysł zadziałał, ale musiałem nieco zmodyfikować twój przykład: ((global_asax) Context.ApplicationInstance) .Roles Z jakiegoś powodu w moim projekcie element global.asax miał typ global_asax. – minty

+5

Zajęło mi trochę czasu, aby zrozumieć, dlaczego to nie działa dla właściwości, które są przeznaczone do życia przez cały okres stosowania. Na przykład: Jeśli utworzysz "Role" w powyższym przykładzie w "Application_Start", wówczas użycie ApplicationInstance w celu uzyskania dostępu do właściwości "Role" może się nie powieść, ponieważ dla każdego żądania istnieje nie tylko jedna "instancja aplikacji globalnej". Aby mieć globalnie istniejące właściwości w global.asax, te właściwości muszą być statyczne. Poniższy wpis na blogu bardzo pomógł mi zrozumieć, co się dzieje: http://odetocode.com/articles/89.aspx – Slauma

+0

global_asax tworzy konflikt. Nie można znaleźć typu globalnego lub obszaru nazw. Co powinienem zrobić? –

3

Wygląda na to, że zależy to tylko od sesji - dlaczego więc nie zrobić pary statycznych metod, które przyjmą sesję jako parametr? Następnie możesz przekazać wartość właściwości "Sesja" ze strony. (Wszystko, co robi mieć dostęp do HttpApplication może po prostu odwołać swoją własność Session, oczywiście.)

+0

Przykro nam, obniżyłem twój post. Tak jak myślałem o tym, masz całkowitą rację. Chcę zmienić swój głos na przegraną, ale stackoverflow nie pozwoli mi już. Proszę przyjąć moje podziękowania. – minty

+0

@minty: Po prostu kliknij wyróżniony głos, a on go cofnie. To może ci umożliwić awans. –

+0

To jest dobry pomysł, ale zawijanie wartości w nieruchomości może pomóc chronić przed brakiem użycia. Oczywiście jeśli zmienna zaplecza znajduje się w sesji, nadal musisz się martwić o to, że ludzie mają do niej bezpośredni dostęp. – Trisped

2

Jeśli jest to nieruchomość trzeba uzyskać dostęp do wszystkich stron, to może być lepsze zdefiniowanie stronę podstawową, która wszystkie Twoje inne strony przedłużają się ...

np. domyślnie

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

Co można zrobić, to dodać BasePage.cs do katalogu App_Code

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

I wtedy strona będzie przedłużyć ten.

public partial class _Default : BasePage 
{ 
} 
+0

W jaki sposób wpłynie to na projektanta wizualnego itp.? – minty

0

Jeżeli wartości są zależne od sesji to jest rzeczywiście prosta przy użyciu Słownik HttpContext.Items:

Umieść ten kod w Global.asax do przechowywania wartości:

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

Powtórz to na stronie z tym kodem:

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

Oto link, który opisuje to bardziej szczegółowo: http://aspnet.4guysfromrolla.com/articles/060904-1.aspx

1

Hej, jestem pojawiały moje stackoverflow.com wiśnia! Moja pierwsza odpowiedź po czai się przez miesiąc.

Aby uzyskać dostęp do właściwości zdefiniowanych w globalnej klasy, należy zastosować jedną z następujących czynności:

  • własnością Zastosowanie zdefiniowane zarówno w HttpApplication i klasach strony (np Page.Application [ „TestItem”])

  • Mienie HttpContext.ApplicationInstance (np HttpContext.Current.ApplicationInstance)

z jednej z nich, można c a wynik do Twojego globalnego typu i uzyskaj dostęp do nieruchomości, której potrzebujesz.

0

W pliku global.asax dla .net 3.5 użyłem typeof (global_asax) i to działało dobrze. I to, co mnie tutaj doprowadziło, to wdrażanie przykładów DotNet OpenID. Zmieniłem niektóre z nich, aby korzystać z pamięci podręcznej aplikacji, tak jak zasugerował Will.

1

Można również użyć następującej składni:

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

dla innych warstw projektu, który nie jest to możliwe, aby mieć globalne jako klasa:

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

Tylko muszę być pewien, że Właściwość Roles w klasie Global nigdy się nie zmienia. i innym sposobem jest przez odbicie.

Powiązane problemy