11 Stimmen

Übergabe von Argumenten an JavaScript-Funktionen aus Code-Behind

Ich möchte eine Javascript-Funktion von einem aspx-Steuerelement aufrufen. Zum Beispiel, angenommen, ich hatte:

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

und im Code dahinter:

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

Gibt es eine Möglichkeit, dies zu tun?

10voto

Dave L Punkte 1626

Sehen Sie sich die ScriptManager.RegisterStartupScript Methode, wenn Sie einen ScriptManager oder irgendwelche Ajax-Steuerelemente/asynchrone Postbacks verwenden.

Editar:

Die Funktion, die Sie suchen, ist wahrscheinlich ScriptManager.RegisterClientScriptBlock

10voto

Kirtan Punkte 20775

Sie können die Page.ClientScript.RegisterStartupScript méthode.

6voto

David Hodgson Punkte 9814

Einige andere Dinge habe ich herausgefunden:

Sie können ein Array nicht direkt übergeben, wie:

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

weil das die ToString()-Methoden von x und y aufruft, die "System.Int32[]" zurückgeben, und offensichtlich kann Javascript das nicht verwenden. Ich musste die Arrays als Strings übergeben, z. B. "[1,2,3,4,5]", also schrieb ich eine Hilfsmethode, um die Konvertierung durchzuführen.

Außerdem gibt es einen Unterschied zwischen this.Page.ClientScript.RegisterStartupScript() und this.Page.ClientScript.RegisterClientScriptBlock() - Ersteres platziert das Skript am unteren Ende der Seite, was ich brauche, um auf die Steuerelemente zugreifen zu können (wie mit document.getElementByID). RegisterClientScriptBlock() wird ausgeführt, bevor die Tags gerendert werden, so dass ich tatsächlich einen Javascript-Fehler erhalte, wenn ich diese Methode verwende.

http://www.wrox.com/WileyCDA/Section/Manipulating-ASP-NET-Pages-and-Server-Controls-with-JavaScript.id-310803.html deckt den Unterschied zwischen den beiden ziemlich gut ab.

Hier ist das vollständige Beispiel, das ich mir ausgedacht habe:

// 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 Punkte 1782

Skriptmanager einbinden

Code hinter der Funktion

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

2voto

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

Aufbrechen des Skript-Schlüsselworts, weil VStudio / asp.net Compiler es nicht mag

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X