11

我想从一个 aspx 控件调用一个 javascript 函数。例如,假设我有:

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

在后面的代码中:

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

有没有办法做到这一点?

4

9 回答 9

10

如果您使用的是 ScriptManager 或任何 Ajax 控件/异步回发,请查看ScriptManager.RegisterStartupScript方法。

编辑:

实际上,您想要的功能可能是ScriptManager.RegisterClientScriptBlock

于 2009-04-25T06:22:55.623 回答
10

您可以使用Page.ClientScript.RegisterStartupScript方法。

于 2009-04-25T06:23:09.807 回答
6

我发现的其他一些事情:

您不能直接传入数组,例如:

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

因为这调用了 x 和 y 的 ToString() 方法,它返回“System.Int32[]”,显然 Javascript 不能使用它。我必须将数组作为字符串传递,例如“[1,2,3,4,5]”,所以我编写了一个辅助方法来进行转换。

此外,this.Page.ClientScript.RegisterStartupScript() 和 this.Page.ClientScript.RegisterClientScriptBlock() 之间存在差异 - 前者将脚本放在页面底部,我需要它才能访问控件(如 document.getElementByID)。RegisterClientScriptBlock() 在呈现标签之前执行,所以如果我使用该方法,我实际上会得到一个 Javascript 错误。

http://www.wrox.com/WileyCDA/Section/Manipulating-ASP-NET-Pages-and-Server-Controls-with-JavaScript.id-310803.html很好地涵盖了两者之间的差异。

这是我想出的完整示例:

// 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>
于 2009-04-26T05:08:35.110 回答
3

包括脚本管理器

函数背后的代码

ScriptManager.RegisterStartupScript(this, this.GetType(), "HideConfirmBox", "javascript:HideAAConfirmBox(); ", true);
于 2011-04-29T08:11:06.233 回答
2
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>");

分解 script 关键字,因为 VStudio / asp.net 编译器不喜欢它

于 2009-04-25T06:38:45.477 回答
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代码

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

试试这个

于 2011-01-09T05:23:01.173 回答
0

我认为您想在回发后执行javascript服务器端而不是在浏览器中,对吗?

据我所知,这是不可能的

如果您只想在回发后执行它,您可以执行以下操作:

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx", "<script>test("+x+","+y+");</script>");
于 2009-04-25T06:35:51.710 回答
0

如果您对在服务器上处理 Javascript 感兴趣,有一个名为Jint的新开源库,它允许您执行服务器端 Javascript。基本上它是一个用 C# 编写的 Javascript 解释器。我一直在测试它,到目前为止它看起来很有希望。

以下是该网站的描述:

与其他脚本引擎的区别:

Jint 不同,因为它不使用 CodeDomProvider 技术,该技术在后台使用编译,因此由于无法卸载已编译的程序集而导致内存泄漏。此外,使用这种技术可以防止像 JavaScript 那样使用动态类型变量,从而使您的脚本具有更大的灵活性。相反,Jint 嵌入了它自己的解析逻辑,并真正解释了脚本。Jint为此目的使用著名的 ANTLR ( http://www.antlr.org ) 库。由于它使用 Javascript 作为其语言,因此您不必学习一门新语言,事实证明它对于脚本目的非常强大,并且您可以使用多个文本编辑器进行语法检查。

于 2010-06-10T10:10:55.953 回答
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;
}
于 2013-03-24T16:07:52.517 回答