11 votes

Passage d'arguments à une fonction JavaScript depuis le code-behind

Je voudrais appeler une fonction javascript à partir d'un contrôle aspx. Par exemple, supposons que j'ai :

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
    function test(x, y)
    {

    }
</script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="Button"
         onclick="Button1_Click"/>
    </div>
    </form>
</body>
</html>

et dans le code derrière :

protected void Button1_Click(object sender, EventArgs e)
{
    // do stuff (really going to a database to fill x and y)
    int[] x = new int[] { 1, 2, 3, 4, 5 };
    int[] y = new int[] { 1, 2, 3, 4, 5 };

    // call javascript function as test(x,y);
}

Y a-t-il un moyen de le faire ?

10voto

Dave L Points 1380

Regardez le ScriptManager.RegisterStartupScript si vous utilisez un ScriptManager ou des contrôles Ajax/postbacks asynchrones.

Edit :

En fait, la fonction que vous voulez est probablement ScriptManager.RegisterClientScriptBlock

10voto

Kirtan Points 11022

Vous pouvez utiliser le Page.ClientScript.RegisterStartupScript méthode.

6voto

David Hodgson Points 2408

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>

3voto

Sai Sherlekar Points 484

include script gestionnaire

code derrière la fonction

ScriptManager.RegisterStartupScript(this, this.GetType(), "HideConfirmBox", "javascript:HideAAConfirmBox(); ", true);

2voto

Chad Grant Points 16571
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>");

rupture du mot-clé script parce que le compilateur VStudio / asp.net ne l'aime pas

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X