2010-08-04 4 views
0

Je rencontre un problème sérieux avec mon application ASP.NET AJAX.Problème avec ScriptManager et ASP.NET AJAX Timer

Il y a une fonction javascript dans mon application qui doit être exécutée après l'événement Timer_Tick. Voici le code derrière:

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(); 
} 

Quand j'appelle la fonction javascript « UpdateValue » pour la première fois (à l'événement page onload), il fonctionne correctement. Mais après l'événement Timer_Tick, il ne fait rien. Ceci est le code 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> 

Quel est le problème avec le ScriptManager ou l'événement Timer_Tick?

Un grand merci,

+0

Le contrôle Timer1 déclenche également un UpdatePanel comme prévu, à l'exception de cette fonction java. –

Répondre

2

Il semble que vous vous inscrivez la fonction UpdateValue chaque fois que Timer1_Tick exécute.

Essayez de changer votre fonction SetValues ​​à ceci:

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: Notez que j'utilise RegisterClientScriptBlock au lieu de RegisterStartupScript. Aussi, "myscript" devrait être une clé unique, donc je viens de mettre à jour cette partie.

+0

Merci Tchami, j'ai essayé le script snip ScriptManager.RegisterClientScriptBlock comme suggestion, mais ça ne fonctionnait toujours pas. J'ai également regardé la source de la page et j'ai remarqué que la fonction appelée pour la première fois a été injectée à la fin de la page:

+0

Donc si la fonction suivante {0} était correctement enregistrée, elle aurait aussi été injectée en bas. Qu'est ce qui ne va pas avec ça? –

+0

Vous ne devez pas injecter UpdateValue(). Je pense que c'est ce qui cause le problème. A quoi ressemble le code source (regardez avec Firebug ou quelque chose de similaire) comme si vous l'injectiez comme je l'ai suggéré? – Tchami

0

Après mon code fini:

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 
    { } 
    }