session_end publicas net example asp asax c# asp.net global-asax

c# - publicas - ¿Cómo accedo a las propiedades de global.asax en el código de alguna otra página detrás?



global.asax example (8)

Imagina que tengo una propiedad definida en global.asax.

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

Quiero usar el valor en otra página. ¿Cómo me refiero?


También puede usar la siguiente sintaxis:

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


¡Hola, estoy sacando mi cherry de .com! Mi primera respuesta después de acechar durante un mes.

Para acceder a una propiedad definida en su clase Global, use cualquiera de los siguientes:

  • la propiedad Aplicación definida en las clases HttpApplication y Page (por ejemplo, Page.Application ["TestItem"])

  • la propiedad HttpContext.ApplicationInstance (por ejemplo, HttpContext.Current.ApplicationInstance)

Con cualquiera de estos, puede convertir el resultado a su tipo global y acceder a la propiedad que necesita.


Me parece que eso solo depende de la sesión, ¿por qué no hacer un par de métodos estáticos que toman la sesión como un parámetro? Luego puede pasar el valor de la propiedad "Sesión" de la página. (Todo lo que tiene acceso a HttpApplication solo puede hacer referencia a su propiedad Session, por supuesto).


Puedes acceder a la clase de esta manera:

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


Si los valores dependen de la sesión, entonces esto es realmente simple usando el diccionario HttpContext.Items:

Coloque este código en Global.asax para almacenar el valor:

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

Permita que lo retire en una página con este código:

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

Aquí hay un enlace que lo describe con más detalle: http://aspnet.4guysfromrolla.com/articles/060904-1.aspx


Si se trata de una propiedad a la que debe acceder en todas las páginas, será mejor que defina una página base que se extienda a todas las otras páginas ...

por ejemplo, por defecto

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

Lo que podría hacer es agregar una BasePage.cs a su carpeta App_Code

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

Y luego haz que tus páginas amplíen esto.

public partial class _Default : BasePage { }


En el .asax global para .net 3.5 usé typeof (global_asax) y funcionó bien. Y, lo que realmente me llevó aquí fue implementar los ejemplos de OpenID de DotNet. Cambié algo para usar el caché de la aplicación como lo sugirió Will.


Para otras capas de proyecto que no es posible tener global como clase:

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

Solo tengo que asegurarme de que la propiedad Roles en la clase Global nunca cambia. y otra forma es por reflexión.