繁体   English   中英

ScriptManager和ASP.NET AJAX计时器出现问题

[英]Problem with ScriptManager and ASP.NET AJAX Timer

我的ASP.NET AJAX应用程序遇到严重问题。

Timer_Tick事件后,我的应用程序中需要执行一个javascript函数。 这是背后的代码:

void SetValues()
   {
   try 
   {
   StringBuilder sbScript = new StringBuilder();
   sbScript.Append("<script language='javascript' type='text/javascript'>");
   sbScript.Append("function UpdateValue() {");
   for (int j = 0; j < iTotalDevices; j++)
   {
   sbScript.Append("setElementValue(" + j.ToString() + "," + DevicesInfo[j].X.ToString() + "," + DevicesInfo[j].Y.ToString() + "," + iStatus.ToString() + "," + DevicesInfo[j].DeviceID.ToString() + ");");
   }
   sbScript.Append("}");
   sbScript.Append("</script>");
   ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", sbScript.ToString(), false);
   }
   catch 
   { }
   }

protected void Timer1_Tick(object sender, EventArgs e)
{
    ///This function will get latest values from database
    GetNewData();
    SetValues();
}

当我第一次调用javascript函数“ UpdateValue”(在onload页面事件中)时,它可以正常工作。 但是在Timer_Tick事件之后,它什么也不做。 这是HTML代码:

<script type="text/javascript" language="javascript">
function PageLoad() {
///Call function for the first time and it works
UpdateValue();
}

function setElementValue(index, value1, value2, value3...) {
///Set value for each element in object array
}

</script>
<body onload="PageLoad()">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick" Interval="30000">
</body>

ScriptManager或Timer_Tick事件有什么问题?

非常感谢,

似乎每次执行Timer1_Tick时都在注册UpdateValue函数。

尝试将SetValues函数更改为此:

void SetValues()
{
   try 
   {
       StringBuilder sbScript = new StringBuilder();
       sbScript.Append("<script language='javascript' type='text/javascript'>");
       for (int j = 0; j < iTotalDevices; j++)
       {
       sbScript.Append("setElementValue(" + j.ToString() + "," + DevicesInfo[j].X.ToString() + "," + DevicesInfo[j].Y.ToString() + "," + iStatus.ToString() + "," + DevicesInfo[j].DeviceID.ToString() + ");");
       }
       sbScript.Append("</script>");
       ScriptManager.RegisterClientScriptBlock(this, this.GetType(), string.Format("myscript{0}", DateTime.Now.ToString("yyyyMMddHHmmss")), sbScript.ToString(), false);
   }
   catch 
   { }
}

编辑:请注意,我使用的是RegisterClientScriptBlock而不是RegisterStartupScript。 另外,“ myscript”应该是唯一键,因此我刚刚更新了该部分。

以下是我完成的代码:

void SetValues()
   {
   try 
   {
   StringBuilder sbScript = new StringBuilder();
   sbScript.Append("<script language='javascript' type='text/javascript'>");

   sbScript.Append("Sys.Application.add_load(UpdateValue);");

   sbScript.Append("function UpdateValue() {");
   sbScript.Append("Sys.Application.remove_load(UpdateValue);");
   for (int j = 0; j < iTotalDevices; j++)
   {
   sbScript.Append("setElementValue(" + j.ToString() + "," + DevicesInfo[j].X.ToString() + "," + DevicesInfo[j].Y.ToString() + "," + iStatus.ToString() + "," + DevicesInfo[j].DeviceID.ToString() + ");");
   }
   sbScript.Append("}");
   sbScript.Append("</script>");
   ScriptManager.RegisterStartupScript(this, Time1.GetType(), "UpdateValue", sbScript.ToString(), false);
   }
   catch 
   { }
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM