一个可停止的 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 版本中得到修复。幸运的是,如果您按照描述使用此修复程序,您只需更改配置设置,而无需更改任何页面的源代码。