问题代码如下:
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。
前提是,要保存的对象必须可序列化,即在类前声明为 [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);
}