我写了一个用户控件,放在一个页中使用。我用最经典的方式,通过IsPostBack来判断是否回传。实际上,我在这个控件的一个控件的itemBind事件中需要纪录一个用户选定的纪录的id,并且存放在session中。用户选定记录我通过一个button来实现的,按下button的时候,我把选择的item的序号存放在一个全局变量中,然后发起DataBind,在itemDataBind中判断当前序号是否与全局变量相同,如果相同,那么,就在Session中存放当前item对应的数据库记录中的id字段。结果,每次按下button,Page_Load执行了2次,一次是IsPostBack=true,还有一次IsPostBack是false的,我用跟踪调试观察的,结果,Session中始终只能存放第一个记录,因为那个全局变量在页面生成的时候初始化为0了。如果是IsPostBack,那么会执行数据控件的事件冒泡。就能正确的设置序号。但是,执行了2次,第二次就没法正确设定了,因为它不执行事件冒泡了,就像页面第一次装载的状态。这样Session的保留值就被冲掉了。更加郁闷和奇怪的是,客户端输出是正常的,就好像执行了一次Page_Load(我改变了选定的item的文字颜色)。奇怪死了。谁能告诉我,这是怎么回事?

解决方案 »

  1.   

    <%@page  autoeventwireup="false".....
      

  2.   

    是不是你的button在前后台都注册了事件.
    所以有多次调用.
      

  3.   

    <%@page  autoeventwireup="false".....
      

  4.   

    “Page_Load执行了2次”一定说明它是同一个用户控件执行了两次Page_Load。你自己查一下(通过调试查看堆栈、变量等)第二次是哪个对象的。另外,如果页面上放上多个此类用户控件,难道你所有的此类用户控件都操控 Session,这会不会搞乱?
      

  5.   

    如果你确定Page_Load被执行2次,那就查看一下“web窗体生成代码”(VS自动建立的那段托管代码)里是不是有2个Page_Load+事件。
      

  6.   

    是不是在前台页面部分的html代码的按钮中加入OnClick事件???
      

  7.   

    sorry! 刚刚重新看了一下我的回复,“一定说明它是同一个用户控件执行了两次Page_Load”前边少了一个“不”,意思完全相反啦!抱歉抱歉!
      

  8.   

    我搞明白了一点点。第二次执行,是Page对象自己引发的,他用来绑定页面属性和事件。都会有2次,很烦人。还有更加古怪的呢。我用,超级连接(服务器端的)转移到(用在客户端按下客户端的<a>标签)别的页面,在转移的时候,这个原来的页面会被刷新但不输出。还会伴随着客户端新页面的刷新继续刷新,除非新页面提交了参数或者转移,这个原来的页面才不会在服务器端持续刷新,很耗服务器资源。直接使用<a>标签引发的转移没有这个问题(应该也不会)只有那个服务器端的才有这个臭毛病。真的很郁闷,这样,要保持一个Session中的和页面相关的数据很啰嗦。真的太奇怪了。那个刷两次的我搞好了,修改了设计,使用超级连接控件了。并且使用查询字符串在页面间传递数据。用Session在页面之间传递数据,真的有很多的问题,工作不正常。还有那个用户表单验证的玩意,设计有缺陷,验证通过的函数非要绑定一个查询参数否则就要重定向到Default去,不知道为啥,她不增加一个参数,指定验证完毕后的页面地址。现在这个样子,要么,login分离出主页面,要么主页面带参数,搞得很啰嗦,还有,他自定前往根目录的Default,咳,他就没考虑到现在很多的网站都是双语种的吗?登陆完毕后怎么能自动回到根目录的Default呢?这个表单验证的控件,设计缺陷太大了。我生怕有人说我菜,研究了很久,才发表这个观点的。
      

  9.   

    databind();
    你写了2个这个吧,呵呵
      

  10.   

    我就是单步调试的。没有执行2个DataBind(),再说了,执行2遍,也不能执行2次Page_Loqd啊!