网上有很多关于 asp.net 生命周期的文章,不过都是千篇一律,出自于同一篇文章。
看了之后有几点不明白的地方:
1、对于文章中第二点(加载视图状态数据)的疑惑。
该断大致意思是,在LoadViewState事件中,已初始化的控件获得第一个属性:上一次提交存留到服务器的视图状态信息。
文章中说可以通过 LoadViewState方法重载,为了验证 ViewState 是在该事件中被加载的,我就重载了 LoadViewState方法,想办法把所有的 ViewState清空,用了很多方法(可能都是错误的)比如ViewState.Clear ();this.ClearChildViewState ();但是都不行,不知道什么原因,我随便按了一个按钮,保存在 Repeater 控件里的值还是不变,也就是 ViewState没有被删除。2、对于文章中的第三点(LoadPostData处理回传数据)
该断大致都明白了,就是用用户提交的数据来更新控件状态,该控件必须是实现了IPostBackDataHandler接口,比如 TextBox。但也有一点不明白的,如果我把 TextBox的EnableViewState设为 false ,当页面回传时,TextBox 的值也是能被保存的,相信应该就是在这阶段被更新保存的,可是这样一来 TextBox 的 EnableViewState 还有什么意义,永远都设为 false 不是更好?3、文章中的第五点(激发RaisePostDataChanged 事件)
在文章中的第三点说道LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执行了。
不明白的是在 RaisePostDataChanged事件中到底可以做什么,RaisePostDataChanged好像不是虚拟的。4、文章中的第六点(处理客户端回传事件)
文章中说道:当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理。这种激发回传的对象往往是其状态改变而引发回传的控件(其autopostback被启用)或者是一个被点击的窗体提交按钮。
我断点跟踪了 protected override void RaisePostBackEvent,发现如果单击一个 Button确实会引发RaisePostBackEvent事件,之后 执行Button_Click事件。但 DropDownList确不会触发该事件(AutoPostBack以设为 true),相信是 DropDownList 没有继承 IPostBackDataHandler,可这样一来
DropDownList 的 SelectedIndexChanged事件又是如何激发的呢?

解决方案 »

  1.   

    你看的是什么文章?
    都没一个连接啊?
    我不是太懂不过有本书应该值得去看看<ASP.NET服务器控件与组件开发>
      

  2.   

    哈哈,果然,不好意思啊.
    http://dev.csdn.net/Develop/article/18/article/18/18085.shtm
      

  3.   

    1.2.一些实现了IPostBackDataHandler接口的控件会处理Post方法传上来的数据,所以这些数据和ViewState无关。ViewState会存放其它一些数据,如:Attribute等,禁用或清空ViewState会使这些属性不可用3.RaisePostDataChanged中会引发数据改变的事件,比如TextChanged等4.Page类会把回发控件的字符串标识和控件的UniqueID进行比较,如果一致并且控件实现了IPostBackEventHandler接口就会调用此控件的RaisePostBackEvent函数,由此函数遍历控件的相关事件
      

  4.   

    谢谢bugsbuddy(兔兔鞋) 的回复,对于第三点,可不可以说得详细一点.比如举个例子.
      

  5.   

    3.RaisePostDataChanged中会引发数据改变的事件,比如TextChanged等:可以用来激发自己写在页面内的事件,也就是对应的TextBox的TextChanged事件。另外,我觉得你没有把问题描述清楚,无从解答。
      

  6.   

    楼主知其然不知其所以然!!!
    拿"EnableViewState"来说吧:
    请做这样一个实验:
    1、建立一个Web工程,在WebForm1.aspx中
    加入两个TextBox(TextBox1,TextBox2)一个Button(Button)
    2、修改属性
    TextBox1:Width=200px、EnableViewState=true
    TextBox2:Width=200px、EnableViewState=false
    3、在WebForm1.aspx.cs的Page_Load中加入下列代码
    if(!this.IsPostBack)
    {
    this.TextBox1.Width=100;
    this.TextBox2.Width=100;
    }
    4、运行
    1)、请观察两个文本框的宽度
    2)、按Button1后再观察两个文本框的宽度
    5、请再读一个对EnableViewState的注释
    如果服务器控件维护自己的视图状态,则为 true;否则为 false。默认为 true。
      

  7.   

    对于数据控件来说,你应该设置EnableViewState的状态为false...因为你如果有大量的数据库填充数据控件的话,ViewState会自动加载一个相同数量的数据到ViewState..会影响到你的运行速度.你问的那些问题.看不太懂..只能说些题外话咯....Sorry..
      

  8.   

    满足你的心愿,upppppppppppppppppppppppppppppppppp
      

  9.   

    非常感谢各位的热心回答.但是还有些不明白的地方.
    1、比如在 LoadViewState事件或者 SaveViewState中,可不可以控制 ViewState 的大小,即只保存有用的数据去除一些没用的数据,如果直接把 EnableViewState设为 false 的话,绝大部分对该控件的操作就失效了。
    2、就如bugsbuddy(兔兔鞋)所说的,控件实现了IPostBackEventHandler接口就会调用此控件的RaisePostBackEvent函数,由此函数遍历控件的相关事件。但那些没有实现 IPostBackEventHandler接口的控件比如 DropDownList是如何触发 SelectedIndexChanged事件的?
      

  10.   

    <ASP.NET服务器控件与组件开发>很好的,推荐
      

  11.   

    <ASP.NET服务器控件与组件开发>
    不错,值得推荐
      

  12.   

    如果有控件局部的状态希望保持那可以用例外的viewstate单独保存,而此控件的EnableViewState为false
    DropDownList也实现IPostBackEventHandler接口了呀.
      

  13.   

    <ASP.NET服务器控件与组件开发>早就听说过这么一本书,就是没有机会看啊。网上有没有这本书?