2009-04-25 23 views
11

Me gustaría llamar a una función de javascript desde un control aspx. Por ejemplo, supongamos que tenía:Pasar argumentos a la función de JavaScript desde código subyacente

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

y en el código detrás:

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

¿Hay una manera de hacerlo?

+0

Esta pregunta es similar, pero no es lo mismo. En mi pregunta, estoy siendo más específico acerca de cómo pasar argumentos a la función de JavaScript y el suministro de código de ejemplo. Estoy interesado en la mecánica específica de eso. –

Respuesta

0

Creo que desea ejecutar el servidor javascript y no en el navegador después de la devolución, ¿verdad?

eso no es posible por lo que yo sé

Si lo que desea es conseguir que se ejecute después de la devolución de datos, se puede hacer algo como esto:

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

Estoy buscando la ejecución del lado del cliente después de la publicación, disculpe por no ser más claro. Entonces, con esta metodología, esto llamaría una secuencia de comandos existente en la página, ¿correcto? –

+0

sí, una función de javascript llamada "prueba" se ejecutará inmediatamente después de la devolución. Esto es útil para mostrar ventanas emergentes de alerta al usuario. de google: "ClientScript.RegisterClientScriptBlock se utiliza para asegurarse de que se incluye un script específico en el encabezado de la página. El tipo y los parámetros de clave ayudan a garantizar que un script determinado se incluya solo una vez, incluso si se llama RegisterClientScriptBlock varias veces. para el mismo script (siempre que tenga el mismo tipo y clave) ". –

+0

Parece que he publicado el método incorrecto antes. Necesita "RegisterClientScriptBlock". (Lo edité en mi publicación) –

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

romper la palabra clave guión porque Compilador VStudio/asp.net no le gusta

6

Algunas otras cosas que descubrí:

No se puede pasar directamente de una matriz como:

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

debido a que llama al ToString() de X e Y, que devuelve "System.Int32 []", y obviamente Javascript no puede utilizar ese . Tuve que pasar las matrices como cadenas, como "[1,2,3,4,5]", así que escribí un método de ayuda para hacer la conversión.

Además, existe una diferencia entre this.Page.ClientScript.RegisterStartupScript() y this.Page.ClientScript.RegisterClientScriptBlock() - el primero coloca la secuencia de comandos en la parte inferior de la página, que necesito para poder poder acceder a los controles (como con document.getElementByID). RegisterClientScriptBlock() se ejecuta antes de que se procesen las etiquetas, por lo que en realidad obtengo un error de Javascript si uso ese método.

http://www.wrox.com/WileyCDA/Section/Manipulating-ASP-NET-Pages-and-Server-Controls-with-JavaScript.id-310803.html cubre la diferencia entre los dos bastante bien.

Aquí está el ejemplo completo que se me ocurrió:

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

Si desea pasar objetos/matrices a su lado del cliente javascript, puede buscar en ASP.NET y JSON (usando un campo oculto en su HTML). Un buen tutorial sobre ASP.NET y JSON está aquí: http://blogs.msdn.com/rakkimk/archive/2009/01/30/asp-net-json-serialization-and-deserialization.aspx – pyrocumulus

+0

Gracias, me ' Echaré un vistazo. –

+0

agradable, 10x asignar –

0

Si usted está interesado en el procesamiento de Javascript en el servidor, hay una nueva biblioteca de código abierto llamado Jint que le permite ejecutar el servidor lado Javascript. Básicamente es un intérprete de Javascript escrito en C#. Lo he estado probando y hasta ahora parece bastante prometedor.

He aquí la descripción del sitio:

Diferencias con otros motores de script:

Jint es diferente, ya que no utiliza CodeDomProvider técnica que es mediante la compilación bajo el capó y tanto conduce a pérdidas de memoria ya que los ensamblados compilados no se pueden descargar. Además, el uso de esta técnica evita el uso de variables dinámicamente tipo de la forma en que lo hace JavaScript, permitiendo una mayor flexibilidad en sus scripts . Por el contrario, Jint incorpora su propia lógica de análisis, y realmente interpreta los scripts. Jint utiliza la famosa ANTLR (http://www.antlr.org) biblioteca para este propósito. Ya que utiliza Javascript como su idioma que no tienen que aprender un nuevo idioma, tiene demostrado ser muy potente para fines de secuencias de comandos, y se puede utilizar varios editores de texto para la sintaxis de cheques.

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> 

código cs

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

prueba este

3

incluyen script manager

código detrás de la función

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; 
} 
Cuestiones relacionadas