我想从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);
}
有办法吗?
答案 0 :(得分:10)
如果您正在使用ScriptManager或任何Ajax控件/异步回发,请查看ScriptManager.RegisterStartupScript方法。
编辑:
实际上,您想要的功能可能是ScriptManager.RegisterClientScriptBlock
答案 1 :(得分:10)
答案 2 :(得分: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 :(得分:3)
包含脚本管理器
功能背后的代码
ScriptManager.RegisterStartupScript(this, this.GetType(), "HideConfirmBox", "javascript:HideAAConfirmBox(); ", true);
答案 4 :(得分:2)
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>");
分解脚本关键字因为VStudio / asp.net编译器不喜欢它
答案 5 :(得分: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();");
}
试试这个
答案 6 :(得分:0)
我认为您想要在回发后执行javascript服务器端而不是浏览器,对吗?
据我所知,这是不可能的
如果你只是想在回发后执行它,你可以这样做:
this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx", "<script>test("+x+","+y+");</script>");
答案 7 :(得分:0)
如果您有兴趣处理服务器上的Javascript ,则会有一个名为Jint的新开源库,允许您执行服务器端Javascript。基本上它是一个用C#编写的Javascript解释器。我一直在测试它,到目前为止看起来很有希望。
以下是该网站的说明:
与其他脚本引擎的差异:
Jint因其不使用而有所不同 CodeDomProvider技术是什么 在引擎盖下使用汇编和 因此导致内存泄漏 编译的程序集无法卸载。 而且,使用这种技术 阻止使用动态类型 变量就像JavaScript一样, 让您的灵活性更高 脚本。相反,Jint嵌入 它是自己的解析逻辑,真的 解释脚本。 Jint使用了 着名的ANTLR(http://www.antlr.org) 为此目的的图书馆。因为它使用 Javascript作为它的语言,你没有 它必须学习一门新语言 被证明是非常强大的 脚本目的,你可以使用 几个文本编辑器的语法 检查。
答案 8 :(得分: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;
}