J'ai découvert d'autres choses :
Vous ne pouvez pas passer directement dans un tableau comme :
this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx",
"<script>test("+x+","+y+");</script>");
car cela appelle les méthodes ToString() de x et y, qui renvoient "System.Int32[]", et évidemment Javascript ne peut pas utiliser cela. Je devais transmettre les tableaux sous forme de chaînes, comme "[1,2,3,4,5]", et j'ai donc écrit une méthode d'aide pour effectuer la conversion.
Il y a également une différence entre this.Page.ClientScript.RegisterStartupScript() et this.Page.ClientScript.RegisterClientScriptBlock() - le premier place le script en bas de la page, ce dont j'ai besoin pour pouvoir accéder aux contrôles (comme avec document.getElementByID). RegisterClientScriptBlock() est exécuté avant que les balises ne soient rendues, ce qui fait que j'obtiens une erreur Javascript si j'utilise cette méthode.
http://www.wrox.com/WileyCDA/Section/Manipulating-ASP-NET-Pages-and-Server-Controls-with-JavaScript.id-310803.html couvre la différence entre les deux assez bien.
Voici l'exemple complet auquel j'ai abouti :
// code behind
protected void Button1_Click(object sender, EventArgs e)
{
int[] x = new int[] { 1, 2, 3, 4, 5 };
int[] y = new int[] { 1, 2, 3, 4, 5 };
string xStr = getArrayString(x); // converts {1,2,3,4,5} to [1,2,3,4,5]
string yStr = getArrayString(y);
string script = String.Format("test({0},{1})", xStr, yStr);
this.Page.ClientScript.RegisterStartupScript(this.GetType(),
"testFunction", script, true);
//this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
//"testFunction", script, true); // different result
}
private string getArrayString(int[] array)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < array.Length; i++)
{
sb.Append(array[i] + ",");
}
string arrayStr = string.Format("[{0}]", sb.ToString().TrimEnd(','));
return arrayStr;
}
//aspx page
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function test(x, y)
{
var text1 = document.getElementById("text1")
for(var i = 0; i<x.length; i++)
{
text1.innerText += x[i]; // prints 12345
}
text1.innerText += "\ny: " + y; // prints y: 1,2,3,4,5
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button"
onclick="Button1_Click" />
</div>
<div id ="text1">
</div>
</form>
</body>
</html>