我对于事件回发的理解
一直觉得学JAVA的看不起ASP.NET(我估计指的就是WEBFORM),觉得ASP.NET程序员只会拖控件。有些培训机构打着“不做只会拖控件的菜鸟”来教学生,也无可是非。
服务器控件是WEBFORM的基础,VIEWSTATE是服务器控件维护状态的依赖,VIEWSTATE则是在页面生命周期上使用和维护的,而页面生命周期又是整个WEBFORM机制的核心。所以想学好WEBFORM,建议最好学一下自定义控件开发。我就学了2个自定义控件,第一个是继承CONTROL来做一个能引起回发的自定义BUTTON,继承Control,重写Render方法,实现IPostBackEventHandler.RaisePostBackEvent方法,定义MyClick事件,这些对于初学者都不好理解,很多初学者都是知其然,却不知其所以然,当然我也是死背,却不知道为啥要这样。第二个是继承CONTROL来实现自定义REPEATER,也差不多,不再重写Render方法,而是重写OnDataBinding和CreateChildControls方法,通过VIEWSTATE维护控件的复杂属性(需要实现IStateManager),等等。但是麻烦的是必须知道在合适的时候做合适的事,如何时LOAD控件VIEWSTATE,何时SAVE控件VIEWSTATE。这样你就必须对页面生命周期需要有清楚的了解,不然你都不知道该重写那个方法。
举个简单例子,就拿Button控件来说,大家都知道在VS设计视图下,双击Button会在页面自动生成ButtonId_Click(object sender,EventArgs e)方法。但是很多新手不知道为什么当我运行页面时点击这个按钮为什么会调用这个ButtonId_Click方法。
其实按了Button后页面进行回发,在页面Load阶段后,是RaisePostBackEvent阶段,页面会根据是哪个控件引起的回发,则调用这个控件的RaisePostBackEvent方法。Button控件正是实现了IPostBackEventHandler.RaisePostBackEvent方法,而Button控件又定义了Click事件,控件内部会对应自动定义一个叫OnClick的方法,这个方法就是在实现IPostBackEventHandler.RaisePostBackEvent方法时调用的,在OnClick的方法中,会判断Click事件是否被页面注册过,如果注册过,则调用Click(),而Click正是指向页面的ButtonId_Click方法。
上述例子也就是我对页面事件回发的理解,如有不对之处,请懂的朋友指点下。