【问题标题】:Passing arguments to JavaScript function from code-behind从代码隐藏将参数传递给 JavaScript 函数
【发布时间】:2010-10-21 18:14:51
【问题描述】:

我想从一个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 函数,并提供示例代码。我对它的具体机制很感兴趣。

标签: c# javascript .net asp.net code-behind


【解决方案1】:

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

【讨论】:

  • 它是如何工作的?我需要在没有任何参数的情况下从代码隐藏调用 JavaScript 函数,但我不知道如何使用它:S
【解决方案2】:

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

编辑:

其实你想要的功能大概是ScriptManager.RegisterClientScriptBlock

【讨论】:

    【解决方案3】:

    我发现的其他一些事情:

    你不能像这样直接传入数组:

    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>
    

    【讨论】:

    • 如果您想将对象/数组传递给您的客户端 javascript,您可以查看 ASP.NET 和 JSON(使用 HTML 中的隐藏字段)。关于 ASP.NET 和 JSON 的一个很好的教程在这里:blogs.msdn.com/rakkimk/archive/2009/01/30/…
    • 谢谢,我去看看。
    【解决方案4】:

    包括脚本管理器

    函数代码

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

    【讨论】:

      【解决方案5】:
      Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>");
      

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

      【讨论】:

        【解决方案6】:
        <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();");
        }
        

        试试这个

        【讨论】:

          【解决方案7】:

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

          据我所知这是不可能的

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

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

          【讨论】:

          • 我正在寻找回发后的客户端执行,抱歉没有更清楚。因此,使用这种方法,这将调用页面上的现有脚本,对吗?
          • 是的,一个名为“test”的javascript函数将在回发后立即执行。这对于向用户显示警报弹出窗口很有用。来自谷歌搜索:“ClientScript.RegisterClientScriptBlock 用于确保特定脚本包含在页面的标题部分中。类型和关键参数有助于确保给定脚本仅包含一次,即使多次调用 RegisterClientScriptBlock 也是如此脚本(提供相同的类型和密钥)。”
          • 我之前好像发错了方法。您需要“RegisterClientScriptBlock”。 (我在帖子中编辑过)
          【解决方案8】:

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

          这是来自网站的描述:

          与其他脚本引擎的区别:

          Jint 不同,因为它不使用 CodeDomProvider 技术是 在引擎盖下使用编译和 因此导致内存泄漏 无法卸载已编译的程序集。 此外,使用这种技术 防止使用动态类型 像 JavaScript 那样变量, 让您更灵活 脚本。相反,Jint 嵌入 它自己的解析逻辑,真的 解释脚本。金特使用 著名的 ANTLR (http://www.antlr.org) 为此目的的图书馆。因为它使用 Javascript 作为你不知道的语言 必须学习一门新语言,它有 被证明是非常强大的 脚本目的,你可以使用 几个用于语法的文本编辑器 检查。

          【讨论】:

            【解决方案9】:
             <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;
            }
            

            【讨论】:

              猜你喜欢
              • 2011-12-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-26
              • 2014-12-28
              • 2011-02-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多