基于昨天你帮助我的一个帖子。做了个测试。    int a
    {
        get { return (int)ViewState["a"]; }
        set { ViewState["a"] = value; }
    }    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        ViewState["a"] = 1;
        Response.Write(a);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        a += 1;
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        a -+= 1;
    }这里是我的源文件,执行时,首次打开页面,输出1。当点击button1后,理论上应该是ViewState["a"]=2,int类型的变量a也是等于2,页面输出2,结果页面却还是输出1。当我再次点击button1,理论上应该是ViewState["a"]=3,int类型的变量a也是等于3,页面输出3,结果却是页面输出2,为什么噢?我Debug时的情况,在Button设置断点。点击Button后,a的值为2。回发页面完毕,在Page_Load中新建了一个int c =a,测试C的值为1,也就说,我在点击Button后a的值确实正确加1,可回发后,却错误了。

解决方案 »

  1.   

    当点按钮后的执行顺序为:page_load(..)//先执行的这个
    button1_click(..)
      

  2.   

        int a
        {
            get { return (int)ViewState["a"]; }
            set { ViewState["a"] = value; }
        }    protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            ViewState["a"] = 1;
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            a += 1;
            Response.Write(a);
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            a -+= 1;
            Response.Write(a);
        }
      

  3.   


    因为我是用ViewState进行 Gridview控件分页 实现UpdatePanel中无刷新翻页,用ViewState保存页面数。
    所以不在Button中进行额外操作。
      

  4.   

    protected void Button1_Click(object sender, EventArgs e)
        {
            a += 1;
    ViewState["a"] =a;
        }
    这样就出来了
      

  5.   

    呵呵,如果你要看a在页面输出html时的值,应该在 Page_PreRender 中来输出,而不是 Page_Load。Page_Load 只是用来刚刚加载装载好页面对象,还没有触发各种(click、selectedindexchanged等等)事件的时候。可以看看“asp.net页面的生命周期”,了解什么时候触发什么事件。
      

  6.   

    为什么点击Button回发后,先执行新页面的Page_Load函数,而后响应上一个页面的Button操作啊。
    我以为当点击Button后,回发本页状态到服务器,a的值已经成功+1,新请求页面的Page_Load才开始执行啊,然后从ViewState中取出数据。
    给我说说细节吧,这点真的不懂,查资料也没查到。
      

  7.   

    许多入门书会把刚开始编写的程序,其代码写在Page_Load中。实际上这个时候其功能还非常简单,甚至还没有交互功能。结果一些人就养成了一个习惯,以为凡是代码都要写在Page_Load中,这是确实存在的,我遇到过好多人问“显示的前后次序颠倒紊乱”的问题。其实如果我们仔细研究事件驱动流程,就会发现入门“范例”上的许多代码有相当一部分其实也不应该写在 page_load 中,而应该写在 Page_PreRender 或者 Page_PreRenderComplete 中。
      

  8.   

        protected void Button1_Click(object sender, EventArgs e)
        {
            a += 1;
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            a -+= 1;
        }为什么有两个Button1_Click 事件
      

  9.   

    一个是+1,一个是—1,是我代码的事物,应该是btn1,btn2,好眼力啊,哈哈
      

  10.   

    asp.net与winform截然不同点在于,服务器每一次处理请求时,都要重新创建页面对象,它不会保存前一个对象。因此,每一次处理请求都会有Init、Load等等事件,等输出了html字符串给浏览器端,这个对象即刻就作废了。当下一个请求到了,比如你点击了Button1,又会重新创建同一类页面的新的对象。所以ViewState是用来在同一页面的不同实例之间保持状态,让你看起来像是WinForm似地。所以每一次处理请求都有page_load执行。同时,之所以控件看起来没变,比如你可以修改Button1.Text或者Button1.ForColor,但后可以看到页面怎么样回发都不会丢失这个状态,也是因为这些控件自己内部会利用它的ViewState来保存和重绘这些信息。
      

  11.   

    .net控件生命周期:初始化 加载视图状态 处理会发数据 加载 发送回发通知 处理会发事件 预呈现 保存视图状态 呈现 处置 加载