已解决

【精华】Session的问题已解决

学员:徐豫锋提问时间:2008-09-12 21:54:01

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;
public partial class _Default : System.Web.UI.Page
{
public temp t ;
public void showtimu()
{
lblTitle.Text=t.num1.ToString()+"+"+t.num2.ToString()+"=";

}
public void showjieguo()
{
lblTitle.Text = t.num1.ToString() + "+" + t.num2.ToString() + "=";
lblSuggestion.Text = lblTitle.Text + t.answer.ToString() + t.trueorfalse;
lblStatistics.Text = "你做对了" + t.answer_true.ToString() + "题," + "你做错了" + t.answer_false.ToString() + "题。";
}

protected void Page_Load(object sender, EventArgs e)
{

if (!IsPostBack)
{
t = new temp();
showtimu();
ViewState["mytemp"] = t;//⑶⑶⑶
}
else
{

t = ViewState["mytemp"] as temp;
//⑵⑵⑵

}


}
protected void btnAnswer_Click(object sender, EventArgs e)
{
t.answer = Convert.ToInt32(txtAnswer.Text);
if ((t.num1 + t.num2) == t.answer)
{ t.answer_true++; t.trueorfalse = ",对"; }
else
{ t.answer_false++; t.trueorfalse = ",错"; }
txtAnswer.Enabled = false;
btnAnswer.Enabled = false;
btnNext.Enabled = true;
ViewState["mytemp"] = t;
showjieguo();//⑴⑴⑴


}
protected void btnNext_Click(object sender, EventArgs e)
{
txtAnswer.Enabled = true;
btnAnswer.Enabled = true;
btnNext.Enabled = false;
txtAnswer.Text = "";
t = ViewState["mytemp"] as temp;
Random k = new Random();
t.num1=k.Next(1,100);
t.num2 = k.Next(1,100);
ViewState["mytemp"] = t;
showtimu();
lblSuggestion.Text = "";
lblStatistics.Text = "";
}
}
自己的作业,有几个问题不明白:
讲讲viewstae的机理吧,⑶⑶⑶处有什么作用,为什么必不可少?
showjieguo();为什么必须在⑴⑴⑴处,放在⑵⑵⑵为什么不行,viewstae不是起了传递的作用了吗?

采纳为答案

回答人:金旭亮回答时间:2008-09-13 15:26:19

事件的发生顺序与是否第一次访问页面有关。
第一次访问页面时,不会激发任何按钮单击事件。但Page_Load()会执行。这时,IsPostBack=false,可在此书写代码初始化控件。
当用户点击按钮引发一次回发,Page_Load()仍会执行,但IsPostBack=true,写在这一条件满足情况下的代码被运行,这些代码一般用于重建状态信息(比如从Session或ViewState中恢复变量的值)。注意,这时,按钮的Click事件还没有运行,要等到Page_Load执行完毕之后才执行按钮的Click事件。
你可以设置页面的Page指令中的的Trace=true,就可以看到事件的激发次序。
后面的在讲到ASP.NET编程原理时会介绍这部分内容。
掌握ASP.NET应用程序和页面生命周期非常重要,也是学习的难点。

学员对该答案的评价 回答准确,清晰,谢谢。。

其他回答

回答人:amandag(高歌 .NET学习顾问)回答时间:2008-09-13 00:24:30
if (!IsPostBack)
{
//只有页面第一次加载的时候才创建temp类的对象
t = new temp();
showtimu();
//并将此对象保存在ViewState中
ViewState["mytemp"] = t;//⑶⑶⑶
}
else
{
//以后页面再回传后加载,无须再创建temp类的对象,直接从ViewState中得到此对象
t = ViewState["mytemp"] as temp;//⑵⑵⑵
}
至于showjieguo()既然是显示结果的,当然是应该放在按钮的Click事件中,总不能用户还没点按钮就显示吧
回答人:amandag(高歌 .NET学习顾问)回答时间:2008-09-13 00:29:27
还有楼主这个题目起的..貌似和Session没什么关系,到是和ViewState还有IsPostBack属性有些关系
回答人:徐豫锋回答时间:2008-09-13 07:47:51
至于showjieguo()既然是显示结果的,当然是应该放在按钮的Click事件中,总不能用户还没点按钮就显示吧??????还是不明白:
1、页面显示前总会先执行page_load事件,再显示网页,为什么就一定要在Click事件中?
2、btnAnswer_Click已经有ViewState["mytemp"] = t;if (!IsPostBack)中为什么还要有这一句?
回答人:徐豫锋回答时间:2008-09-13 08:09:51
我想还是asp页面运行机理的理解问题,
我的理解肯定有误,请指出:
1、向服务器请求网页,。。。。,服务器执行if (!IsPostBack),把生成的html发给浏览器
2、点击btnAnswer_Click,激发Click事件,再次向服务器发送请求,服务器执行Click代码,服务器执行if (!IsPostBack),把生成的html发给浏览器
回答人:徐豫锋回答时间:2008-09-13 08:14:50
还是这样的顺序:
2、点击btnAnswer_Click,激发Click事件,再次向服务器发送请求,服务器执行if (!IsPostBack),服务器执行Click代码,把生成的html发给浏览器
回答人:徐豫锋回答时间:2008-09-13 08:21:52
简单的说,就是这四件事的顺序??
再次向服务器发送请求,服务器执行if (!IsPostBack),服务器执行Click代码,把生成的html发给浏览器??????????
回答人:徐豫锋回答时间:2008-09-13 08:23:21
简单的说,就是这四件事的顺序??
再次向服务器发送请求,服务器执行if (!IsPostBack)<page_load事件>,服务器执行Click代码,把生成的html发给浏览器??????????