it-swarm.com.de

Übergabe von Argumenten und JavaScript-Funktionen von Code-Behind

Ich möchte eine Javascript-Funktion von einem Aspx-Steuerelement aufrufen. Nehmen wir zum Beispiel an, ich hätte:

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

11
David Hodgson

Sie können die Methode Page.ClientScript.RegisterStartupScript verwenden.

10
Kirtan

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

Bearbeiten:

Eigentlich ist die gewünschte Funktion wahrscheinlich ScriptManager.RegisterClientScriptBlock

10
Dave L

Einige andere Dinge habe ich herausgefunden:

Sie können ein Array nicht direkt übergeben:

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ückgibt, und Javascript kann das natürlich nicht verwenden. Ich musste die Arrays als Strings übergeben, wie "[1,2,3,4,5]", also schrieb ich eine Hilfsmethode für die Konvertierung.

Außerdem gibt es einen Unterschied zwischen this.Page.ClientScript.RegisterStartupScript () und this.Page.ClientScript.RegisterClientScriptBlock () - der erste platziert das Skript am unteren Rand der Seite, auf das ich zugreifen kann Steuerelemente (wie bei document.getElementByID). RegisterClientScriptBlock () wird ausgeführt, bevor die Tags gerendert werden. Wenn ich diese Methode verwende, bekomme ich tatsächlich einen Javascript-Fehler.

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

Skriptmanager einschließen

Code hinter der Funktion

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

das Script-Schlüsselwort wird aufgelöst, weil der VStudio/asp.net-Compiler es nicht mag

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>

cS-Code

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

versuche dies

1
sunny

Wenn Sie Interesse an der Verarbeitung von Javascriptauf dem Serverhaben, gibt es eine neue Open Source-Bibliothek namens Jint , mit der Sie serverseitiges Javascript ausführen können. Im Grunde ist es ein in C # geschriebener Javascript-Interpreter. Ich habe es getestet und sieht bisher sehr vielversprechend aus.

Hier ist die Beschreibung von der Site:

Unterschiede zu anderen Skript-Engines:

Jint ist anders, da es keine CodeDomProvider-Technik verwendet, bei der Kompilierung unter der Haube verwendet wird und Zu Speicherverlusten führt, wie dies bei den Kompilierten Assemblys der Fall ist. entladen werden. Außerdem verhindert die Verwendung dieser Methode die Verwendung dynamischer Variablen vom Typ wie JavaScript, , wodurch mehr Flexibilität in Ihren Skripts möglich ist . Im Gegensatz dazu bettet Jint Seine eigene Parsing-Logik ein, und wirklich Interpretiert die Skripte. Jint verwendet zu diesem Zweck die Berühmte ANTLR ( http://www.antlr.org ) Bibliothek. Da es Javascript als Sprache verwendet, müssen Sie nicht Eine neue Sprache lernen, es hat sich Als sehr mächtig für Skripting-Zwecke erwiesen, und Sie können mehrere Texteditoren für die Syntaxprüfung verwenden.

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

Ich denke, Sie wollen das Javascript serverseitig ausführen und nicht nach dem Back-back im Browser, oder?

Das ist meines Wissens nicht möglich

Wenn Sie es nur nach dem Postback ausführen lassen möchten, können Sie Folgendes tun:

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