转自:http://www.cnblogs.com/549504182/archive/2010/05/02/1725882.html
最近一段时间一直在学习自定义控件学习相关的资料,个人觉得在自定义开发过程中首先要明白自定义控件中各个事件调用的顺序,只有在了解事件调用顺序的基础上,才能够有的放矢的去在适当的时候加载适当的控件和事件,下面首先说明事件调用的顺序,这个也是从网上摘录
- CreateChildControls;
- Init();
- TrackViewState;
- LoadViewStates();
- LoadPostData();
- Onload();
- RaisePostDataChangeEvent();
- OnbubbleEvent();
- OnpreRender();
- SaveViewState();
- RenderControl();
- Render();
- RenderBeginTag();
- AddAttributeToRender();
- CreateControlStyle();
- RenderContents();
- RenderChildren();
- RenderEndTag();
- OnUnload();
然后我们要掌握一些Ajax回发的原理,现在做的控件都流行用局部刷新技术,当然在我们的控件中如何去放开属性是比较容易的,事件的几种注册方式比较容易下面说说自定义控件注入脚本代码的方式:
ClientScriptManager类公开了使用客户端脚本的主要应用程序接口,HttpBrowserCapabilities类方便我们开发不同种类浏览器使用的控件,Ajax让我们实现自定义控件不必将包含控件的页面提交到Web服务器端就与其通讯。
关于ClientScriptManager类
ClientScriptManager支持添加javascript到页面的方法:
1) RegisterArrayDeclaration——添加javascript数组到页面;
2) RegisterClientScriptBlock——添加javascript脚本到页面的起始服务器端<form>标签后;
3) RegisterClientScriptInclude——添加外部js文件引用到页面的起始服务器端<form>标签后;
4) RegisterClientScriptResource——添加已编译到程序集中的js到页面中;
5) RegisterExpandAttribute——添加为页面中某个元素附加扩展属性的脚本;
6) RegisterHiddenField——在页面的起始服务器端<form>标签后添加一个隐藏表单域;
7) RegisterOnSubmitStatement——添加在页面回传服务器之前执行的js脚本;
8) RegisterStartUpScript——在页面的结束服务器端<form>标签前添加js脚本。
这些方法都是可以安全调用多次的,不会造成重复添加。
另外有一些属性可以用来检测一段脚本是否已经在页面中注册:
1) IsClientScriptBlockRegistered——当一段脚本通过RegisterClientScriptBlock()方法注册到页面时,返回true;
2) IsClientScriptIncludeRegistered——当一个外部脚本文件引用已经通过RegisterClientScriptInclude()方法注册到页面中时,返回true;
3) IsOnsubmitStatementRegistered——当一段脚本已经通过RegisterOnSubmitStatement()方法注册到页面中时,返回true;
4) IsStartupScritpRegistered——党一段脚本已经通过RegisterStartupScript()方法注册到页面时,返回true;
检测浏览器功能
HttpBrowserCapabilities对象通过Request对象公开,可以使用Request.Browser获得起对象的引用。e.g.
if (Request.Browser.Browser.Equals("IE") && Request.Browser.MajorVersion >= 5)
{
Page.Response.Write(Request.Browser.Browser);
}
HttpBrowerCapabilities对象使用浏览器发送的User-Agent头来检测浏览器的功能
创建Ajax控件
要在自定义控件中实现Ajax,需要执行以下步骤:
1. 生成引发Ajax调用的JavaScript;
2. 在服务器端创建响应Ajax调用的方法;
3. 在浏览器上创建Javascript,显示服务器端返回的结果。
为了执行服务器端的方法而引发Ajax调用,然后将服务器端执行的结果返回到客户端显示。
通过Page.ClientScripts.GetCallBackEventReference()方法创建引发Ajax调用的javascript,该方法返回一个表示javascript函数调用的字符串,如示:
WebForm_DoCallBack(‘mycontrol’,null,showResult,null,showError,false)
GetCallBackEventReference()方法的一些重载参数:
Control——引发Ajax的控件;
Argument——在Ajax调用中传给服务器端的参数;
clientCallBack——当结果从Web服务器端返回时执行的javascript函数名;
context——Ajax调用完成后传回clientCallback()和clientErrorCallback()方法的参数
clientErrorCallback——Ajax调用在服务期端产生错误结果时执行的javascript函数名
useAsync——为true时,Ajax调用异步执行。
需要实现在服务器端相应Ajax调用的方法,要达到这一目的,需要实现ICallbackEventHandler接口。
接口ICallbackEventHandler的两个方法:
RaiseCallbackEvent——回调时首先执行该方法进行处理;
GetCallbackResult——返回结果到客户端。