日期:2014-05-17  浏览次数:20697 次

ASP.NET 全局变量的问题
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections;

public partial class _Default : System.Web.UI.Page 
{
  public string strName;
   
  ArrayList Sample = new ArrayList(); 
  protected void Page_Load(object sender, EventArgs e)
  {
  if (!IsPostBack)
  {
  strName = "abcd";
  Sample.Add("a");
  Sample.Add("b");
  }

  }
  protected void Button1_Click(object sender, EventArgs e)
  {
  TextBox1.Text = strName;
  TextBox2.Text = Sample[0].ToString() + Sample[1].ToString();
  }

}
代码如下,很简单的,就是一个传值显示问题,就是strName最后是NULL,为什么呢?把private string strName改成public string strName也不行,我知道改成private static string strName就可以了,可是改成静态的会有其他异常现象的,还有直接把IsPostBack判断去掉也是可以的,可这2个方法都不是我想要的方法,我想问下大家有什么好方法呢?还有我想定义个全局的ArrayList Sample = new ArrayList(),又该如何定义?

------解决方案--------------------
一定要了解TCP/IP协议。Page页面的创建和销毁。唯一解决的办法就是:page对象创建的时候,不管是不是初次访问strName 都要赋值。因为回发客户端后 服务器里的数据会销毁。
------解决方案--------------------
你在if (!IsPostBack) 里面赋的值,也就是说你第一次访问页面的时候给它赋了值,但是你触发了按钮的click事件,引起了页面的回发,回发之后
程序不会再给strName赋值,所以它还是null
------解决方案--------------------
原因很简单,当第一次页面加载时strName的值是"abcd",可以在Page_Load方法中写入Response.Write(strName)来测试。当你点击Button1_Click后,由于页面回发,if (!IsPostBack) {} 里面的语句不会执行,所以在执行回发的过程中,Page_Load方法没有给strName赋值。当你第一次在客户端Render(呈现)完这个页面后,在服务器端已经将这次请求的资源释放,同时strName也就消失了。当点击Button1发出请求,在执行你的请求过程中strName再次在服务器端分配资源,但这事的strName和第一次的strName是两个不同的东东。
小问题,但这确实需要了解web的机制、ASP.net页面的生命周期、变量的作用域、回发等许多基本概念,从这个小问题中能反映出要学好ASP.Net,一定要了解我所提到的这些基本知识。
------解决方案--------------------
劝你先了解一下ASP.NET页面生命周期:
http://blog.csdn.net/ojlovecd/archive/2008/07/22/2691116.aspx
------解决方案--------------------
解决的办法:静态变量、ViewState、Cookie、Session、Cache、隐藏字段。
根据情况自己选择吧

------解决方案--------------------
当页面加载完成后是会有值存在,但是当再点击Button的时候页面会再一次加载的,而此时你if (!IsPostBack) 会判定你为响应客户端回发的数据而不是页面加载if (!IsPostBack)的值会为假,所以不执行
strName = "abcd"; 
Sample.Add("a"); 
Sample.Add("b"); 
的操作了!
TextBox1.Text = strName; 
TextBox2.Text = Sample[0].ToString() + Sample[1].ToString(); 
就会为空了!
如果是每次都要执行
strName = "abcd"; 
Sample.Add("a"); 
Sample.Add("b"); 
你可以把他们放到if (!IsPostBack)的外面去
------解决方案--------------------
可以保存在viewstate里嘛,这种地方没必要使用静态成员
------解决方案--------------------
第一个问题我就不说了,说第二个,全局的ArrayList Sample = new ArrayList(),又该如何定义?
你可以把
Sample存在Cache里,Cache是网站全局的,而且速度快,使用方法请看:
http://hi.baidu.com/grrc/blog/item/cdf6c9f8689a2908d8f9fdf4.html

------解决方案--------------------
[code=C#]

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

public string strName;