65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (17投票s)

2006年7月30日

CPOL

2分钟阅读

viewsIcon

129922

downloadIcon

632

本文介绍了一个计时器控件,解决了 Atlas 计时器服务器控件的一个问题。这个问题是 Atlas TimerControl 无法从服务器端代码停止。

引言

ASP.NET Atlas 有一个计时器服务器控件,该控件会定期向服务器发送回传。但是,TimerControl 存在一个错误,阻止它在部分呈现期间从服务器端代码停止。我一次又一次地在 Atlas 论坛中遇到这个问题,询问此错误的解决方法。本文基于我在 Atlas 论坛中的帖子,并详细解释了如何解决这个问题。希望这个问题能在未来版本的 Atlas 中得到解决。

Using the Code

以下是使用此控件必须采取的步骤

  1. 将 StoppableTimer.cs 文件复制到您网站的 App_Code 目录中。
  2. 修改 web.config 文件以添加以下元素
    <configuration>
       <system.web>
           <pages>
            <tagMapping>
                <add tagType="Microsoft.Web.UI.Controls.TimerControl" 
                     mappedTagType="VRK.Controls.StoppableTimer,App_Code"/>
            </tagMapping>
    
  3. 此配置设置会自动允许您的类被使用,而不是 Atlas TimerControl,而无需对现有网页进行任何更改。在一个新页面中,您可以继续使用该控件,使用以下语法
    <atlas:TimerControl ID="Timer1" 
          runat="server" Interval="500" OnTick="Timer1_Tick" 
          Enabled="false" />
  4. 如果该错误在未来的 CTP 中得到修复,您只需删除配置设置,一切将按原样工作。

工作原理

Atlas 服务器控件存在两个导致此问题的错误

  1. 该控件未生成计时器的任何 ID。

  2. 它没有尝试响应回传或回调来停止计时器。

本文中介绍的计时器控件修改了 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 版本中得到修复。幸运的是,如果您按照描述使用此修复程序,您只需更改配置设置,而无需更改任何页面的源代码。

© . All rights reserved.