想象一下,我在 global.asax 中定义了一个属性。
public List<string> Roles
{
get
{
...
}
set
{
...
}
}
我想在另一个页面中使用该值。我如何参考它?
想象一下,我在 global.asax 中定义了一个属性。
public List<string> Roles
{
get
{
...
}
set
{
...
}
}
我想在另一个页面中使用该值。我如何参考它?
您可以像这样访问该类:
((Global)this.Context.ApplicationInstance).Roles
在我看来,这只取决于会话 - 那么为什么不让它成为一对以会话为参数的静态方法呢?然后您可以从页面传入“Session”属性的值。(当然,任何可以访问 HttpApplication 的东西都可以引用它的 Session 属性。)
如果这是您需要在所有页面中访问的属性,您最好定义一个所有其他页面都扩展的基本页面......
例如默认情况下
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
{
}
嘿,我正在弹出我的 stackoverflow.com 樱桃!潜伏一个月后我的第一个答案。
要访问 Global 类中定义的属性,请使用以下任一方法:
在 HttpApplication 和 Page 类中定义的 Application 属性(例如 Page.Application["TestItem"])
HttpContext.ApplicationInstance 属性(例如 HttpContext.Current.ApplicationInstance)
使用其中任何一个,您都可以将结果转换为您的 Global 类型并访问您需要的属性。
您还可以使用以下语法:
((Global)HttpContext.Current.ApplicationInstance).Roles
如果值依赖于 Session 那么使用 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
在 .net 3.5 的 global.asax 本身上,我使用了 typeof(global_asax) 并且效果很好。而且,真正引导我到这里的是实现 DotNet OpenID 示例。我更改了其中的一些以使用 Will 建议的应用程序缓存。
对于无法将 Global 作为一个类的其他项目层:
dynamic roles= ((dynamic)System.Web.HttpContext.Current.ApplicationInstance).Roles;
if (roles!= null){
// my codes
}
只是我必须确保 Global 类中的 Roles 属性永远不会改变。另一种方法是通过反射。