2009-04-25 3 views
11

Ich möchte eine JavaScript-Funktion von einem Aspx-Steuerelement aufrufen. Zum Beispiel: Angenommen ich habe:Übergeben von Argumenten an JavaScript-Funktion von Code-Behind

<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 in dem Code-behind:

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, es zu tun?

+0

Diese Frage ist ähnlich, aber nicht ganz dasselbe. In meiner Frage bin ich genauer darüber, wie man Argumente an die JavaScript-Funktion weitergibt und Beispielcode liefert. Ich interessiere mich für die spezifischen Mechanismen davon. –

Antwort

0

Ich denke, Sie möchten die Javascript-Serverseite und nicht im Browser nach dem Post-Back ausführen, oder?

, dass so weit nicht möglich ist, wie ich weiß,

Wenn Sie es gerade nach dem Postback ausführen wollen, können Sie etwas tun:

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

Ich bin auf der Suche nach Client-Seite Ausführung nach dem Post zurück, Entschuldigung für die nicht mehr klar. Mit dieser Methode würde dies ein vorhandenes Skript auf der Seite aufrufen, richtig? –

+0

Ja, eine JavaScript-Funktion namens "test" wird sofort nach dem Postback ausgeführt. Dies ist nützlich, um dem Benutzer Warn-Popups anzuzeigen. von googling: "ClientScript.RegisterClientScriptBlock wird verwendet, um sicherzustellen, dass ein bestimmtes Skript im Header Teil der Seite enthalten ist. Die Art und Schlüsselparameter hilft sicherzustellen, dass ein bestimmtes Skript nur einmal enthalten ist, auch wenn RegisterClientScriptBlock mehrere Male aufgerufen wird für dasselbe Skript (mit demselben Typ und Schlüssel). " –

+0

Ich habe anscheinend die falsche Methode vorher gepostet. Sie benötigen "RegisterClientScriptBlock". (Ich habe es in meinem Post bearbeitet) –

2
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>"); 

das Skript Schlüsselwort Zerschlagung weil VStudio/asp.net Compiler mag es nicht

6

einige andere Dinge, die ich herausgefunden:

Sie können nicht direkt in einem Array übergeben werden wie:

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

, weil das das ToString() -Methode von x und y bezeichnet, die „System.Int32 []“, gibt und offensichtlich kann Javascript nicht verwenden, dass . Ich musste die Arrays als Strings übergeben, wie "[1,2,3,4,5]", also schrieb ich eine Hilfsmethode für die Konvertierung.

Auch gibt es einen Unterschied zwischen this.Page.ClientScript.RegisterStartupScript() und this.Page.ClientScript.RegisterClientScriptBlock() - der ehemalige legt das Skript am unteren Rand der Seite, die ich brauche, um zu sein Zugriff auf die Steuerelemente (wie bei document.getElementByID). RegisterClientScriptBlock() wird ausgeführt, bevor die Tags gerendert werden. Daher erhalte ich tatsächlich einen Javascript-Fehler, 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 komplette Beispiel kam ich mit:

// 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> 
+3

Wenn Sie Objekte/Arrays an Ihre Clientside-JavaScript übergeben möchten, könnten Sie in ASP.NET & JSON (mit einem Hiddenfield in Ihrem HTML) suchen. Ein gutes Tutorial zu ASP.NET und JSON finden Sie hier: http://blogs.msdn.com/rakkimk/archive/2009/01/30/asp-net-json-serialization-and-deserialization.aspx – pyrocumulus

+0

Danke, I ' Ich werde es mir ansehen. –

+0

schön, 10x allot –

0

Wenn Sie bei der Verarbeitung von Javascript auf dem Server interessiert sind, gibt es eine neue Open-Source-Bibliothek Jint genannt, die Sie Server ausführen kann Seite Javascript. Grundsätzlich ist es ein Javascript-Interpreter, der in C# geschrieben ist. Ich habe es getestet und bisher sieht es ziemlich vielversprechend aus.

Hier ist die Beschreibung von der Website:

Unterschiede mit anderen Skriptmodule:

Jint ist anders, da es nicht CodeDomProvider Technik, die Zusammenstellung unter der Haube und somit ist verwendet nicht mit führt zu Speicherverlusten, da die kompilierten Baugruppen nicht entladen werden können. Darüber hinaus verhindert dynamische Variablen Variablen wie JavaScript, ermöglicht mehr Flexibilität in Ihren Skripts. Auf der anderen Seite bettet Jint seine eigene Parsing-Logik ein, und wirklich interpretiert die Skripte. Jint verwendet die berühmte ANTLR (http://www.antlr.org) Bibliothek für diesen Zweck. Wie es Javascript als Sprache verwendet Sie dies nicht tun, eine neue Sprache zu lernen, hat es für Scripting Zwecke sehr mächtig erwiesen, und Sie mehrere Texteditoren für Syntax Prüfung verwenden können.

1
<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();"); 
} 

versuchen diese

3

umfassen Skriptmanager

Code hinter Funktion

ScriptManager.RegisterStartupScript(this, this.GetType(), "HideConfirmBox", "javascript:HideAAConfirmBox(); ", true); 
0
<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; 
}