private static int i;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            
            i = i + 1;
            Label1.Text =i.ToString();
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {      }
现象1. 第一次运行是Label1.Text为1,每次刷新自动加1。点击Button1 在刷新Label1.Text值不变
现象2. 第一次运行是Label1.Text为1,关闭运行或IE。在运行程序Label1.Text为2,再关闭、运行都自动加1
为什么呢,郁闷。

解决方案 »

  1.   

    if (!Page.IsPostBack)
            {
               
                i = i + 1;
                Label1.Text =i.ToString();
            } 
    仅第一次load的时候
      

  2.   

    要每次刷新都+1
    if (!Page.IsPostBack)
            {
             
            } 
                i = i + 1;
                Label1.Text =i.ToString();
      

  3.   

    if (!Page.IsPostBack) --主要排除了点击按钮提交以及非刷新页面提交俗称第一次载入页面执行因此第一现象好解释而由于你的i为static变量所以产生现象2
      

  4.   

    if (!Page.IsPostBack)
    只在首次加载的时候执行
      

  5.   

    你定义的是静态变量,所以每次执行都会加1,之所以点BUTTON没有加1不是说这个变量没加1,而是加了1没有执行 
    i = i + 1; 
    Label1.Text =i.ToString(); 
    ,但是你刷新之后,页面是重新打开,也就是第一次打开,所以要执行里面的代码。
    还有你说关闭之后再打开,其实跟你按F5一样,都是重新打开,那个静态变量在服务器端,所以每次访问都会加1。
      

  6.   

    if (!Page.IsPostBack)首次加载页面才会执行你点ie上的刷新按钮相当于第一次进入页面如果是页面postback就不会执行if里边了,点按钮就相当于postback
      

  7.   

    2. static是静态的,全局变量.
    有点类似于application,所以一般在b/s的程序中不要用静态变量
      

  8.   

    因为你写了 static 。
    不过,实际上在生产服务器上iis和asp.net经常会让你的应用程序重新启动,因此实际上生产环境下i可能随时被重新初始化(类似地,Session、Application集合内容会随时“丢失”),这是你在自己的单机上调试时容易忽视的,写出的程序很可能有这类没有考虑到此问题的bug。你可以试一试,调试时随时停止一下web服务器(对于iis需要再次启动),再继续在页面上按button,就可以看到数据被初始化了。
      

  9.   

    再加上每一次刷新,都是重复上一次的命令,如果上一次是 !IsPostback,那么就是重复加1,如果上一次不是就永远不加1.
      

  10.   

    static变量与asp.net 
     在C#中,static变量表示该变量属于类,而不是类的实例。可以说是该类的所有实例共享一个static变量。
    asp.net的页面就是一个类,我们访问一个页面。就会在服务器上实例化一个该类的实例,来响应我们的请求。“所有实例共享一个static变量” 这就意味着,所有的客户端访问到的asp.net页面中static变量都是同一个变量。由于我们每次访问asp.net页面都是一个全新的对象,而不是我们上一次访问的对象。所以上次页面访问时我们对页面中变量的改动都没有保留。遇到这个问题的时候,很多初学者的直觉就是将这个变量申明为static,自己在测试的时候发现还真的保留住了页面的状态。窃喜之余没有发现这又有引入了另外一个错误。因为你要的只是页面能保留住状态,而这个状态是针对一个客户端的(session的效果)。而得到的结果是只要一个客户端改变了该值所有的其他客户端都受到了影响(如同Applicatin的效果)。这种情况下,需要的极有可能就是个ViewState或者是Session。Application与static变量
    Application是通过一个集合保存所有的对象。强类型:
    Application中保存的是object,对对象的保存和使用需要作cast动作。对于值类型更需要Box&UnBox。对性能的影响较大。
    而static变量是强类型的对象。线程同步:
    Application将所有的对象放到一个集合,这样对访问集合中的任何对象都会锁定这个集合。
    假如有Application["A"]、Application["B"]、Application["C"],有线程访问Application["A"]其他线程不能访问Application["B"] and Application["C"]。
    而static变量,可以根据他们的作用分别放在不同的class当中。这样可以并行访问不同的static变量,而不存在线程安全问题。友情提示:
    1. 对static变量,做lock时。可以通过lock(typeof(classname))来锁定该变量所在的类的类型,达到线程同步的目的。
    2. 由于Aplication,static member是全局变量,而我们是在多线程服务器环境写程序,对他们的使用需要注意线程安全的问题。
      

  11.   

    一方面,刷新操作在大多数浏览器上都是重复上一次提交数据。另一方面,基本上,我不相信大多人使用静态变量、Session、Application的那些代码的可靠性,除非确实仔细考虑到这个内容随时会“丢失”的情况下。你是看到了第一次提交之后反复刷新会使i加1,实际上如果你告诉有时候刷着刷着i突然重新变成1了我也丝毫不奇怪。这在实际的web服务器上当资源紧张或者网站程序有一些涉及底级系统的bug时(例如你的程序向磁盘写某些文件时)是经常出现的。因此,这类使用static来统计某些东西编程只能算作对static的一个原理理解,实用中我认为这是不了解web程序和c/s程序的区别而出现的一个bug。i变量值会随时“丢失”,就像session内容会随时丢失一样。
      

  12.   

    在见面里能不用字段就别用  
    他是不保存状态的 
    可以用 viewdata  
    如果你真想知道为什么呢 ?
    你要去找“网页事件发生的顺序”和执行的任务...
      

  13.   

     if (!Page.IsPostBack) 
            { 
                 i = i + 1; 
                Label1.Text =i.ToString();         } 
    改为         i = i + 1; 
                Label1.Text =i.ToString();