Как получить доступ к свойствам из global.asax в другом коде страницы

Представьте, что у меня есть свойство, определенное в global.asax.

public List<string> Roles
{
    get
    {
        ...
    }
    set
    {
        ...
    }
}

Я хочу использовать значение на другой странице. как я к нему отношусь?

Ответ 1

Вы можете получить доступ к классу следующим образом:

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

Ответ 2

Мне кажется, что это зависит только от сеанса - так почему бы не сделать его парой статических методов, которые принимают сеанс как параметр? Затем вы можете передать значение свойства "Сессия" со страницы. (Все, что имеет доступ к HttpApplication, может просто ссылаться на его свойство Session, конечно.)

Ответ 3

Если это свойство, которое вам нужно получить на всех страницах, возможно, вам лучше определить базовую страницу, на которой распространяются все ваши другие страницы...

например. по умолчанию

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

Что вы можете сделать, это добавить BasePage.cs в свою папку App_Code

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

И тогда ваши страницы расширят это.

public partial class _Default : BasePage
{
}

Ответ 4

Эй, я вывожу свою вилку из stackoverflow.com! Мой первый ответ после скрытия в течение месяца.

Чтобы получить доступ к свойству, определенному в вашем глобальном классе, используйте одно из следующих действий:

  • свойство приложения, определенное как в классах HttpApplication, так и в классах страницы (например, PageApplication [ "TestItem" ])

  • Свойство HttpContext.ApplicationInstance(например, HttpContext.Current.ApplicationInstance)

С помощью любого из них вы можете применить результат к своему глобальному типу и получить доступ к требуемому вам ресурсу.

Ответ 5

Вы также можете использовать следующий синтаксис:

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

Ответ 6

Если значения зависят от сеанса, то это действительно просто, используя словарь HttpContext.Items:

Поместите этот код в Global.asax для сохранения значения:

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

Пусть он возвращает его на странице с этим кодом:

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

Здесь ссылка, которая описывает ее более подробно: http://aspnet.4guysfromrolla.com/articles/060904-1.aspx

Ответ 7

В самом global.asax для .net 3.5 я использовал typeof (global_asax), и это отлично работало. И, что на самом деле привело меня сюда, было внедрение примеров DotNet OpenID. Я изменил некоторые из них, чтобы использовать кэш приложений, как предложил Уилл.

Ответ 8

Для других слоев проекта, которые невозможно иметь глобальный как класс:

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

Просто я должен быть уверен, что свойство Roles в глобальном классе никогда не меняется. а другой путь - отражением.