2010-08-04 5 views
0

У меня возникла серьезная проблема с моим приложением ASP.NET AJAX.Проблема с ScriptManager и ASP.NET AJAX Timer

В моем приложении должна быть выполнена функция javascript после события Timer_Tick. Вот код позади:

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?

Большое спасибо,

+0

Контроль Таймер1 также вызывает UpdatePanel, как и ожидалось, для этой функции Java кроме. –

ответ

2

Похоже, вы регистрации функция UpdateValue каждый раз Timer1_Tick выполняет.

Попробуйте изменить функцию 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 
    { } 
} 

EDIT: Обратите внимание, что я использую RegisterClientScriptBlock вместо RegisterStartupScript. Кроме того, «myscript» должен быть уникальным ключом, поэтому я просто обновил эту часть.

+0

Спасибо, Тхами, я пробовал использовать скрипт ScriptManager.RegisterClientScriptBlock в качестве вашего предложения, но он все еще не работает. Я также просмотрел источник страницы и заметил, что функция вызова в первый раз была введена в конце страницы:

+0

Итак, если следующая функция myscript {0} была зарегистрирована правильно, она также была бы введена в нижней части. Что с этим не так? –

+0

Вам не следует вводить UpdateValue(). Я думаю, именно это и вызывает проблему. Как выглядит исходный код (посмотрите с Firebug или что-то подобное), как если бы вы ввели его, как я предложил? – Tchami

0

Ниже мой законченный код:

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 
    { } 
    } 
Смежные вопросы