解析ASP.NET组件ASP.NET Timer(创世纪新篇

 

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


  
  
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机制的部分程序代码


  
  
public class WebTimer:Control,IPostBackEventHandler   {       …………       IPostBackEventHandler implements#region IPostBackEventHandler implements       void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)       {           OnTimer(EventArgs.Empty);       }       #endregion       …………  

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


  
  
private static readonly object EventTimer = new object();     …………   Events#region Events   public event EventHandler Timer   {       add{Events.AddHandler(EventTimer,value);}       remove{Events.RemoveHandler(EventTimer,value);}   }   #endregion     event handler functions#region event handler functions    protected virtual void OnTimer(EventArgs e)   {       EventHandler timerHandler = (EventHandler)Events[EventTimer];       if(null != timerHandler)       {           timerHandler(this,e);       }   }   #endregion 

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


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

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


  
  
Utility functions#region Utility functions   private string BuildJavaScript()   {       StringBuilder sb = new StringBuilder();       sb.Append("\n﹤script language=\"javascript\"﹥\n ﹤!-- ");       sb.AppendFormat("\n setTimeout(\"{0}\",{1});",           new object[]{this.Page.GetPostBackEventReference(this),interval.ToString()});       sb.Append("\n //--﹥\n﹤/script﹥");       return sb.ToString();   }   #endregion     protected override void Render(HtmlTextWriter writer)   {       /**//*to ensure that this component is in the "runat=server" HtmlForm,       or there'll be no Post-Back event,as a result that this component will be of no avail       */      if(null != Page)           Page.VerifyRenderingInServerForm(this);       if(enabled)           writer.Write(BuildJavaScript());  

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

end

转载于:https://my.oschina.net/bigfool007139/blog/508043

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值