一个可停止的 ASP.NET Atlas 计时器控件






4.89/5 (17投票s)
本文介绍了一个计时器控件,解决了 Atlas 计时器服务器控件的一个问题。这个问题是 Atlas TimerControl 无法从服务器端代码停止。
引言
ASP.NET Atlas 有一个计时器服务器控件,该控件会定期向服务器发送回传。但是,TimerControl 存在一个错误,阻止它在部分呈现期间从服务器端代码停止。我一次又一次地在 Atlas 论坛中遇到这个问题,询问此错误的解决方法。本文基于我在 Atlas 论坛中的帖子,并详细解释了如何解决这个问题。希望这个问题能在未来版本的 Atlas 中得到解决。
Using the Code
以下是使用此控件必须采取的步骤
- 将 StoppableTimer.cs 文件复制到您网站的 App_Code 目录中。
- 修改 web.config 文件以添加以下元素<configuration> <system.web> <pages> <tagMapping> <add tagType="Microsoft.Web.UI.Controls.TimerControl" mappedTagType="VRK.Controls.StoppableTimer,App_Code"/> </tagMapping> 
- 此配置设置会自动允许您的类被使用,而不是 Atlas TimerControl,而无需对现有网页进行任何更改。在一个新页面中,您可以继续使用该控件,使用以下语法<atlas:TimerControl ID="Timer1" runat="server" Interval="500" OnTick="Timer1_Tick" Enabled="false" /> 
- 如果该错误在未来的 CTP 中得到修复,您只需删除配置设置,一切将按原样工作。
工作原理
Atlas 服务器控件存在两个导致此问题的错误
- 
该控件未生成计时器的任何 ID。 
- 
它没有尝试响应回传或回调来停止计时器。 
本文中介绍的计时器控件修改了 TimerControl 的呈现,如下所示
protected override void RenderScript(ScriptTextWriter writer)
{
  if (!IsPageInPartialRendering)
  {
    writer.WriteStartElement("timer");
    writer.WriteAttributeString("id", this.UniqueID);
    writer.WriteAttributeString("interval", 
           this.Interval.ToString(CultureInfo.InvariantCulture));
    writer.WriteAttributeString("enabled", this.Enabled.ToString().ToLower());
    writer.WriteStartElement("tick");
    writer.WriteStartElement("postBack");
    writer.WriteAttributeString("target", this.UniqueID);
    writer.WriteAttributeString("eventArgument", string.Empty);
    writer.WriteEndElement();
    writer.WriteEndElement();
    writer.WriteEndElement();
  }
}
如您所见,该控件呈现 XML 脚本,除了部分呈现。在部分呈现期间,客户端网页上的计时器对象不会被销毁,因此只需启用或禁用客户端对象即可。这在 OnPreRender 方法中完成
protected override void OnPreRender(EventArgs e)
{
   if (IsPageInPartialRendering)
   {
     string scriptSnippetFormat = "$object(\"{0}\").set_enabled({1});";
     string scriptSnippet = 
       String.Format(scriptSnippetFormat, 
       this.UniqueID, 
       this.Enabled.ToString().ToLower());
     Page.ClientScript.RegisterStartupScript(
        GetType(),
        this.UniqueID,
        scriptSnippet,
        true);
    }
    base.OnPreRender(e);
}
唯一剩下的有趣部分代码是获取页面上脚本管理器的实例,并查找 ScriptManager 是否处于部分呈现模式
bool IsPageInPartialRendering
{
   get
   {
      ScriptManager manager = ScriptManager.GetCurrent(this.Page);
      return (manager != null && manager.IsInPartialRenderingMode);
   }
}
结论
对于 Atlas 中在 6 月 CTP 中存在的错误,这是一个快速修复。它可能在即将发布的 Atlas 版本中得到修复。幸运的是,如果您按照描述使用此修复程序,您只需更改配置设置,而无需更改任何页面的源代码。


