web-dev-qa-db-fra.com

Passer des arguments à la fonction JavaScript à partir de 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?

11
David Hodgson

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

10
Kirtan

Examinez la méthode ScriptManager.RegisterStartupScript si vous utilisez un ScriptManager ou des commandes/publications asynchrones Ajax.

Modifier:

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

10
Dave L

Quelques autres choses que j'ai découvertes:

Vous ne pouvez pas directement passer dans un tableau comme:

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx",   
"<script>test("+x+","+y+");</script>");

parce que cela appelle les méthodes ToString () de x et y, qui renvoie "System.Int32 []", et que Javascript ne peut évidemment pas l'utiliser. Je devais passer dans les tableaux sous forme de chaînes, comme "[1,2,3,4,5]", j'ai donc écrit une méthode d'assistance pour effectuer la conversion.

De plus, il y a une différence entre this.Page.ClientScript.RegisterStartupScript () et this.Page.ClientScript.RegisterClientScriptBlock () - l'ancien place le script au bas de la page, ce dont j'ai besoin pour pouvoir accéder au contrôles (comme avec document.getElementByID). RegisterClientScriptBlock () est exécuté avant le rendu des balises, donc je reçois une erreur Javascript si j'utilise cette méthode.

http://www.wrox.com/WileyCDA/Section/Manipulation-ASP-NET-Pages-and-Server-Controls-with-JavaScript.id-310803.html couvre bien la différence entre les deux.

Voici l'exemple complet que je suis venu avec:

// 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>
6
David Hodgson

inclure le gestionnaire de script

code derrière la fonction

ScriptManager.RegisterStartupScript(this, this.GetType(), "HideConfirmBox", "javascript:HideAAConfirmBox(); ", true);
3
Sai Sherlekar
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>");

briser le mot clé de script car le compilateur VStudio/asp.net ne l'aime pas

2
Chad Grant
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Call Java script function on Code behind</title>
    <script  type="text/javascript">
    function abc()
    {
        var a=20;
        var b=30;
        alert("you enter"+a+":"+b);
    }
    </script>
</head>

code cs

protected void Page_Load(object sender, EventArgs e)
{
    TextBox2.Attributes.Add("onkeypress", "return abc();");
}

essaye ça

1
sunny

Si vous êtes intéressé par le traitement de Javascript sur le serveur, il existe une nouvelle bibliothèque open source appelée Jint qui vous permet d'exécuter du Javascript côté serveur. Fondamentalement, il s’agit d’un interpréteur Javascript écrit en C #. Je l'ai testé et jusqu'à présent, cela semble assez prometteur.

Voici la description du site:

Différences avec d'autres moteurs de script:

Jint est différent car il n'utilise pas Technique CodeDomProvider qui est en utilisant la compilation sous le capot et conduit donc à des fuites de mémoire comme le les assemblys compilés ne peuvent pas être déchargés . De plus, en utilisant cette technique empêche l'utilisation dynamique des types les variables comme JavaScript, permettant plus de flexibilité dans votre les scripts. Au contraire, Jint embarque c'est sa propre logique d'analyse, et vraiment interprète les scripts. Jint utilise le ANTLR célèbre ( http://www.antlr.org ) bibliothèque à cet effet. Comme il utilise Javascript n'est pas sa langue doivent apprendre une nouvelle langue, il a prouvé être très puissant pour scripts, et vous pouvez utiliser plusieurs éditeurs de texte pour la syntaxe vérification.

0
David Robbins
 <head>
    <script type="text/javascript">

        function test(x, y) 
        {
            var cc = "";
            for (var i = 0; i < x.length; i++) 
            {
                cc += x[i]; 
            }
            cc += "\ny: " + y; 
            return cc;
        }

    </script>



</head>

<body>

    <form id="form1" runat="server">

        <asp:Button ID="Button1" runat="server" Text="Button"   />

        <p>
             <asp:TextBox ID="TextBox1"  Name="TextBox1"  runat="server" AutoPostBack="True"  TextMode="MultiLine"></asp:TextBox>
        </p>



    </form>
</body>

protected void Page_Load(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(" var y = test({0},{1}) ; ", xStr, yStr);
    script += String.Format("  document.getElementById(\"TextBox1\").value = y  ");

    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;
}
0
Bhushan Mahajan

Je pense que vous voulez exécuter le serveur javascript et non dans le navigateur après le post-back, non?

Ce n'est pas possible pour autant que je sache

Si vous voulez juste l'exécuter après la publication, vous pouvez faire quelque chose comme ceci:

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx", "<script>test("+x+","+y+");</script>");
0
Thomas Stock