我有一个相当简单的asp.net页面,其中包含几个按钮和文本框等,其可见性根据查询结果进行切换。一切正常。但是我收到了一个嵌入时钟的请求,该时钟可以连续显示服务器时间(这实际上是一个时钟网络应用程序)。我已经在线上关注了一些教程和示例,无论我做什么,计时器似乎都阻止了诸如按钮单击事件或文本框可见性之类的事情。
例如,我在另一个SO线程上找到了这个
<fo:table width="100%" xsl:use-attribute-sets="section border_red">
<fo:table-header>
<fo:table-cell>
<fo:block xsl:use-attribute-sets="header">Product:
</fo:block>
</fo:table-cell>
</fo:table-header>
<fo:table-footer>
<fo:table-row>
<fo:table-cell>
<fo:block text-align="end">
<fo:retrieve-table-marker
retrieve-class-name="test123"
retrieve-boundary-within-table="table"
retrieve-position-within-table="last-ending"
/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-footer>
<fo:table-body>
<xsl:for-each select="ROWSET2/ROWSET2_ROW">
<fo:table-row>
<fo:table-cell>
<fo:block xsl:use-attribute-sets="paragraph indented">
<xsl:choose>
<xsl:when test="position() = 1">
<fo:marker marker-class-name="test123">
<fo:inline>To be continued...</fo:inline>
</fo:marker>
</xsl:when>
<xsl:when test="position() = last()">
<fo:marker marker-class-name="test123"/>
</xsl:when>
</xsl:choose>
<xsl:value-of select="PRODUCTNAME" />
<xsl:if test="position()=last()">
<fo:inline>Last..</fo:inline>
</xsl:if>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
并插入我的标签,该标签在内容模板中显示了时间,并在tick事件中对其进行了更新。效果很好,除了阻止了我的UI。
Telerik演示直接进行了最近的尝试: https://demos.telerik.com/aspnet-ajax/ajaxmanager/application-scenarios/ajaxify-timer/defaultcs.aspx
计时器本身可以正常工作,只是干扰了我的用户界面,这是一个问题。
编辑以添加页面标记:
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
<ContentTemplate>
<!-- your content here, no timer -->
</ContentTemplate>
</asp:UpdatePanel>
<asp:Timer ID="Timer1" runat="server" Interval="5000" OnTick="Timer1_Tick">
</asp:Timer>
答案 0 :(得分:1)
您可以按照以下步骤解决此问题:
1。。确保没有隐藏的脚本错误。有时,脚本错误会导致UI控件停止运行。 Details
2。。AJAX的好处是部分更新。确保计时器仅更新页面的相关部分,例如标签,没别的。
3。。如果您在<head>
标记中包含脚本,请在脚本管理器定义之后将它们转移到<body>
。
4。。将计时器包装在asp:Panel中,然后使用此面板。另外,您可以添加面板进行自我更新:
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
<AjaxSettings>
<telerik:AjaxSetting AjaxControlID="Panel1">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="Panel1" />
<telerik:AjaxUpdatedControl ControlID="Label1" />
</UpdatedControls>
</telerik:AjaxSetting>
</AjaxSettings>
</telerik:RadAjaxManager>
<asp:Panel ID="Panel1" runat="server">
<asp:Timer ID="Timer1" runat="server" Interval="2000" OnTick="Timer1_Tick"></asp:Timer>
</asp:Panel>
<asp:Label ID="Label1" runat="server" Text="Output"></asp:Label>
protected void Timer1_Tick(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToLongTimeString() + "." + DateTime.Now.Millisecond;
}
5。有用的提示-如果用户已经在页面上滚动了某个位置,并且此时发生了AJAX请求,则滚动位置将重置并自动滚动到页面顶部。为防止这种情况,您可以使用以下方法:Source
<script type="text/javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(function() {
prm._scrollPosition = null;
});
</script>
6。。如果在代码后部动态添加了自定义脚本,则可以检查Demo 1和Demo 2以查看如何在AJAX请求后重新创建这些脚本。
7。。将脚本内容包装在RadScriptBlock中。