标签集

Aspx页面中对象生存期问题

 

问题代码如下:

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

{

    private WindMachine bb ;  

    protected void Page_Load(object sender, EventArgs e)

    {   if (!Page.IsPostBack)

        {           bb = new WindMachine();

                               bb.Name = "h";

                               bb.Ispeed = 7;

                               bb.TI902 = 6;      

        }

    }

    protected void Button1_Click(object sender, EventArgs e)

    {        Response.Write(bb.Name);

    }

}

调试,发现首先执行Page_Load,由于Page.IsPostBack = false,所以bb得到内容。然后点击按钮 Button1,引起回送,于是,又调用Page_Load,此时,bb = null;当然里面的东西也没有了。如果将bb = new WindMachine();写到bb声明的地方,则引起回送以后,虽然bb不等于null,但bb里的内容也不见了。

也就是说,在一个事件处理程序中创建的对象,其生命期为回送发生之前。于是,将代码改写如下:

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

{

    private WindMachine bb ;

    public test()

    {

        bb = new WindMachine();

        bb.Name = "h";

        bb.Ispeed = 7;

        bb.TI902 = 6;

    }

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!Page.IsPostBack)

        {

          

        }

    }

    protected void Button1_Click(object sender, EventArgs e)

    {

        Response.Write(bb.Name);

}

问题解决。

 

实际问题并没有解决,在一次显示之后,所有的对象都销毁了,当页面回送时,重新执行代码。比如下面的代码:

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

{

   private string connectionString3 = ConfigurationManager.ConnectionStrings["connectiontoSQL"].ToString();

private int tt = 5;

 

protected void Button1_Click1(object sender, EventArgs e)

    {

      TimeSpan aaa = new TimeSpan(0, 0, tt);

        tt = tt + 5;

这里我希望tt的值会不断地增加,实际情况是,每次点击按钮后,tt=5,也就是说,对象销毁了,回送时重新创建了对象,所以其成员tt的值又得5。

所以要完成上述需求,需要使用session

使用viewstate

如上带来的问题是:服务器内存占用太多,所以不推荐,最后使用的解决方法:viewstate

前提是,要保存的对象必须可序列化,即在类前声明为 [Serializable],比如,下面用的类的声明为:

namespace FD.Model

{

    [Serializable]

    public class WindMachine

    {

代码如下:

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

{

    private WindMachine bb ;

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!Page.IsPostBack)

        {

            bb = new WindMachine();

           bb.Name = "h";

           bb.Ispeed = 7;

             bb.TI902 = 6;

Viewstate["bbb"] = bb;

        }

    }

    protected void Button1_Click(object sender, EventArgs e)

    {

        Response.Write(bb.Name);

}

posted on 2009-10-16 21:35  宋亚奇  阅读(227)  评论(0编辑  收藏  举报

导航