从代码后台向JavaScript函数传递参数

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

有没有方法可以做到?


这个问题有些相似,但又不完全一样。在我的问题中,我更具体地说明了如何将参数传递给JavaScript函数,并提供了示例代码。我对它的具体机制很感兴趣。 - David Hodgson
9个回答

10

10

它是如何工作的?我需要从代码后端调用一个没有任何参数的JavaScript函数,但我不知道如何使用它:S - PedroC88

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>

3
如果您想将对象/数组传递给客户端的javascript,您可以考虑使用ASP.NET和JSON(在HTML中使用hiddenfield)。有一个关于ASP.NET和JSON的好教程在这里:http://blogs.msdn.com/rakkimk/archive/2009/01/30/asp-net-json-serialization-and-deserialization.aspx - pyrocumulus

3

包含脚本管理器

代码后端功能

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

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

将脚本关键字拆分,因为VStudio/asp.net编译器不喜欢它


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

试一下这个


0

如果您有兴趣在服务器上处理JavaScript,现在有一个名为Jint的新开源库,它允许您执行服务器端JavaScript。基本上,它是用C#编写的JavaScript解释器。我已经测试了它,到目前为止看起来非常有前途。

以下是该网站的描述:

与其他脚本引擎的区别:

Jint不同,它不使用CodeDomProvider技术,这种技术在幕后使用编译,并因此导致内存泄漏,因为编译的程序集无法卸载。此外,使用这种技术会阻止使用动态类型变量的方式,就像JavaScript一样,允许脚本更加灵活。相反,Jint嵌入了自己的解析逻辑,并真正地解释了脚本。Jint使用著名的ANTLR(http://www.antlr.org)库来实现这一目的。由于它使用JavaScript作为语言,因此您无需学习新语言,它已被证明在脚本编写方面非常强大,并且可以使用多个文本编辑器进行语法检查。


0

我认为你想在服务器端执行JavaScript而不是在浏览器中进行回传,对吗?

据我所知,这是不可能的。

如果你只想在回传后执行它,你可以这样做:

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

我正在寻找在回发后进行客户端执行,抱歉没有表述得更清楚。因此,使用这种方法,这将调用页面上现有的脚本,对吗? - David Hodgson
是的,一个名为“test”的JavaScript函数将在PostBack后立即执行。这对于向用户显示警报弹出窗口非常有用。从谷歌搜索: “ClientScript.RegisterClientScriptBlock用于确保特定脚本包含在页面的头部。类型和键参数有助于确保即使为同一脚本多次调用RegisterClientScriptBlock(提供相同的类型和键),也仅包含一次给定的脚本。” - Thomas Stock
我似乎之前发布了错误的方法。你需要使用“RegisterClientScriptBlock”。(我已在我的帖子中进行了编辑) - Thomas Stock

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接