ASP.NET组件设计之ASP.NET Timer浅析
创始人
2024-04-27 05:31:05
0次

ASP.NET组件设计之ASP.NET Timer一、思考组件需求

在网页上编写一个Timer组件,首先得解决这个问题:如何让网页定时Post回Server端。 正常情况下这个动作是由用户按下某个按钮后触发的,但Timer组件的需求是自动在特定时间触发,例如设计者设定在每5秒产生一个Post动作,网页就得每5秒做出一个Post动作,这该如何完成呢?事实上,这可以通过Javascript提供的一个setTimeout函数来完成,只要运用此函数每5秒调用一次由ASP.NET产生的_doPostBack函数即可达到定时自动Post的需求,下面是setTimeout函数的原型。

  1. setTimeout(﹤function﹥,﹤interval﹥); 

***个参数是当Timeout时间到时所调用的函数,第二个是Timeout时间的长度,单位是毫秒(millisecond)。解决网页定时自动Post的问题后,接着就是Server端如何接收这个信息的问题,答案就是Post-Back机制,只要实现此机制,组件就能在网页自动Post后取得主控权,并引发用户所挂载的事件函数。

ASP.NET组件设计之ASP.NET  Timer二、实现Post-Back与绘制JavaScript

现在我们面临两个问题:***是组件的基类选择。由于WebTimer属于不可视组件,并不需要任何外观睥属性,所以自然是继承自Control类;第二是WebTimer必须实现Post-Back接口,宋才能在网页自动Post取得主控权后触发用户所挂载的事件函数。 下面是WebTimer处理Post-Back机制的部分程序代码

  1. public class WebTimer:Control,IPostBackEventHandler  
  2. {  
  3.     …………  
  4.     IPostBackEventHandler implements#region IPostBackEventHandler implements  
  5.     void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)  
  6.     {  
  7.         OnTimer(EventArgs.Empty);  
  8.     }  
  9.     #endregion  
  10.     …………  
  11. } 

由程序易知,WebTimer继承自Control类,同时实现了IPostBackEventHandler接口。当组件实现了该接口之后,Post-Back发生时Page对象会一一调用已注册参与Post-Back运作组件的IPostBackEventHandler.RaisePostBackEvent函数,此处WebTimer组件调用了OnTimer函数将控制权转交给设计者所绑定的事件上,下面是OnTimer函数及事件处理部分的代码:

  1. private static readonly object EventTimer = new object();  
  2.  
  3. …………  
  4. Events#region Events  
  5. public event EventHandler Timer  
  6. {  
  7.     add{Events.AddHandler(EventTimer,value);}  
  8.     remove{Events.RemoveHandler(EventTimer,value);}  
  9. }  
  10. #endregion  
  11.  
  12. event handler functions#region event handler functions   
  13. protected virtual void OnTimer(EventArgs e)  
  14. {  
  15.     EventHandler timerHandler = (EventHandler)Events[EventTimer];  
  16.     if(null != timerHandler)  
  17.     {  
  18.         timerHandler(this,e);  
  19.     }  
  20. }  
  21. #endregion 

接下来要做的就是绘制JavaScript函数。在这之前,还有一件很重要的事,那就是绘制默认的_doPostBack函数。默认情况下Page对象为了节省带宽,并不是每次都绘制此函数。只有在某个组件明确调用Page.GetPostBackEventReference或Page.GetPostBackClientHyperlink其中的一个函数时,_doPostBack函数才会被绘制到网页中。因此,WebTimer组件必须得调用Page.GetPostBackEventReference或是Page.GetPostBackClientHyperlink函数,但是在哪里调用呢?Render函数?不行!此时Page对象已经进入绘制状态,在此时调用Page对象的任何函数都已经太迟了,所以***的地方是调用OnPreRender函数,下面是相关代码:

  1. protected override void OnPreRender(EventArgs e)  
  2. {  
  3.     base.OnPreRender(e);  
  4.     //call this method to ensure that the _doPostBack method will be called   
  5.     Page.ClientScript.GetPostBackEventReference(this,"");  
  6. } 

接下来就是编写JavaScript函数并在Render函数中绘制相关动作:

  1. Utility functions#region Utility functions  
  2. private string BuildJavaScript()  
  3. {  
  4.     StringBuilder sb = new StringBuilder();  
  5.     sb.Append("\n﹤script language=\"javascript\"﹥\n ﹤!-- ");  
  6.     sb.AppendFormat("\n setTimeout(\"{0}\",{1});",  
  7.         new object[]{this.Page.GetPostBackEventReference(this),interval.ToString()});  
  8.     sb.Append("\n //--﹥\n﹤/script﹥");  
  9.     return sb.ToString();  
  10. }  
  11. #endregion  
  12.  
  13. protected override void Render(HtmlTextWriter writer)  
  14. {  
  15.     /**//*to ensure that this component is in the "runat=server" HtmlForm,  
  16.     or there'll be no Post-Back event,as a result that this component will be of no avail  
  17.     */ 
  18.     if(null != Page)  
  19.         Page.VerifyRenderingInServerForm(this);  
  20.     if(enabled)  
  21.         writer.Write(BuildJavaScript());  
  22. } 

除了Render函数之外,程序中尚用到两个函数:Page.VerifyRenderingInServerForm函数用来确认组件位于标记为”runat=server”的HtmlForm控件中,假如组件并非位于此类的HtmlForm中,那么也就没有Post-Back带伤,WebTimer组件自然也就没有作用了。另外一个是BuildJavaScript,此函数将之前所讨论的JavaScript函数setTimeout配合用户所设定的时间绘出。

有一点要指出来的是,在.net 2.0里面会有个警告提示System.Web.UI.Page.GetPostBackEventReference(System.Web.UI.Control)已过时,建议用ClientScript.GetPostBackEventReference来代替,新的函数重载了四次,但是没有一个参数的,现在还不知道怎么改,有知道的希望能指出来!

ASP.NET组件设计之ASP.NET  Timer的基本情况就向你介绍到这里,希望对你学习有所帮助。

【编辑推荐】

  1. ASP.NET2.0数据源控件的用法浅析
  2. ASP.NET控件设计时支持之自动格式设置浅析
  3. ASP.NET控件设计时操作列表与模板编辑浅析
  4. ASP.NET控件设计器浅析
  5. ASP.NET组件设计浅谈

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...