全局变量为null

时间:2011-08-12 12:07:29

标签: c# asp.net global-variables

Dictionary<string, string> propertyCompany = new Dictionary<string, string>();//gloabal variable

protected void Page_Load(object sender, EventArgs e)
{
   if(!isPostBack){
      propertyCompany .add("a","1"); 
      propertyCompany .add("b","2");
      propertyCompany .add("c","3");
   }
}

protected void btnGetProperty_Click(object sender, EventArgs e)
{
      string a=propertyCompany["a"];//error this key is not exist
     //propertyCompany is null
}

定义propertyCompany并填写form_load时。在单击按钮propertyCompany上为空!?

我使用static但我不明白有时候说错误是空的。

6 个答案:

答案 0 :(得分:4)

每个请求都会创建新的页面对象,因此您无法在第一个请求中创建的第二个请求(bnt click)字典中使用(加载而不回发)

删除回发测试以便快速修复。

其他修复可能性: *在viewstate中存储字典。

答案 1 :(得分:1)

继承Web.UI.Page的类中定义的每个变量都将在Page-Lifecycle结束时销毁,因此如果不重新初始化,它将在Postback中null

将其保留在回发中的一种方法是将其存储在Session-variable

您可以在此处找到有关如何在回发中保留变量的所有选项的完整列表:http://msdn.microsoft.com/en-us/magazine/cc300437.aspx

  • 应用
  • 缓存
  • 表格发布/隐藏表格字段
  • 查询字符串
  • 会话
  • ASP.NET中的新状态容器
  • 高速缓存
  • 上下文
  • 视图状态
  • Web.config和Machine.config文件 结论

HTTP-protocol的性质是无国籍

答案 2 :(得分:1)

我很确定你的标题应该是“全局变量没有我想要的数据”。每次加载页面时都会构造 (回发或其他方式),但由于这一行:

if(!isPostBack) {
}

按钮点击时不会有你想要的数据。

为了通知点击页面,回复,所以说!isPostBack(我假设是通过Page.IsPostBack在某处设置的)是还说“如果我没有点击按钮”,这当然不是你想要的。

为了获得你想要的功能,你应该将字典的数量移出if if块,否则就有了一个else条件,它也用你想要的数据填充它。

使用类变量的另一种方法是将数据存储在另一个位置。选项包括ViewStateSessionApplication(如果它确实是应用程序范围的数据),Cache以及其他一些选项。目前还不清楚字典究竟在做什么,因此很难说哪个位置最合适。

答案 3 :(得分:0)

让字典在请求之间生效的一种方法是将其声明为静态,或者在前面建议的视图状态中声明。

答案 4 :(得分:0)

如何在按钮点击事件中访问propertyCompany中的项目?如果你这样做不正确,那更可能是问题。

答案 5 :(得分:-1)

试试这个

    Dictionary<string, string> propertyCompany;//gloabal variable

protected void Page_Load(object sender, EventArgs e)
{ 
   propertyCompany = new Dictionary<string, string>();
   if(!isPostBack){
      propertyCompany .add("a","1"); 
      propertyCompany .add("b","2");
      propertyCompany .add("c","3");
   }
}

protected void btnGetProperty_Click(object sender,EventArgs e) {      // propertyCompany为null }