全局变量为空
本文关键字:全局变量 | 更新日期: 2023-09-27 18:05:38
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
,但我不明白有时说错误是空的。
每个请求都创建新的页面对象,因此您不能在第二个请求(bnt click)中使用您在第一个请求(加载而不回发)中创建的字典
为快速修复删除回发测试。
其他修复的可能性:
在继承Web.UI.Page
的类中定义的每个变量将在页面生命周期结束时被销毁,因此如果您不重新初始化它,它将在Postback中成为null
。
跨回发保存它的一种方法是将它存储在会话变量中。
您可以在这里找到关于如何在回发中持久化变量的所有选项的完整列表:http://msdn.microsoft.com/en-us/magazine/cc300437.aspx
- <
- 应用程序/gh><
- 饼干/gh>
- 表单Post/隐藏表单字段
- 属性 <
- 会话/gh>
- ASP中的新状态容器净 缓存
- <
- 上下文/gh>
- 视图状态
- 网络。配置和机器。配置文件结论
http协议的本质是无状态的
我很确定你的标题应该是"全局变量没有我想要的数据。"每次加载页面(回发或其他)时,字典都将构造,但是由于这一行:
if(!isPostBack) {
}
它不会有你想要的数据点击按钮。
为了通知页面的点击,一个post back 是执行的,所以说!isPostBack
(我假设是通过Page.IsPostBack
设置的)也在说"如果我没有点击按钮",这当然不是你想要的。
为了得到你想要的功能,你应该把字典的填充移出if块,或者用你想要的数据填充一个else条件。
使用类变量的另一种替代方法是将数据存储在另一个位置。选项包括ViewState
、Session
、Application
(如果它真的是应用程序范围的数据)、Cache
以及其他一些。目前还不清楚字典在做什么,所以很难说哪个位置最合适。
让您的字典在请求之间存在的一种方法是将其声明为静态,或者像前面建议的那样声明为viewstate
如何在按钮单击事件中访问propertyCompany中的项?如果你做得不正确,那更有可能是问题所在。
try this
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(对象发送者,EventArgs e){//propertyCompany为空}